ํ์คํ ์น๐ ๊ฐ๋ฐ์ ์ง๋ง์ ๐ง๐ฝโ๐ป
โ ์ธ๊ณต์ง๋ฅ ๊ด์ฌ ๐ค
Categories
-
โฃ
โถ COMPUTER_SCIENCE
๐: 7 -
โฃ
โถ WEB
๐: 3 -
โฃ
โถ ETC
๐: 3-
โ
โฃ
ETCS
๐: 10 -
โ
โฃ
SUBBRAIN ๊ฐ๋ฐ๊ธฐ
๐: 5 -
โ
โ
YOS ๊ฐ๋ฐ๊ธฐ
๐: 1
-
โ
โฃ
-
โ
โถ AI
๐: 9-
โฃ
AITOOLS
๐: 3 -
โฃ
CV
๐: 2 -
โฃ
DEEP_LEARNING
๐: 1 -
โฃ
DATA_VIS
๐: 2 -
โฃ
GRAPH
๐: 1 -
โฃ
LIGHTWEIGHT
๐: 1 -
โฃ
MATH
๐: 1 -
โฃ
NLP
๐: 3 -
โ
STRUCTURED_DATA
๐: 2
-
โฃ
Spring5-๊ตฌ์ฑ ์์ฑ
๊ตฌ์ฑ ์์ฑ
_ ์ด๋ณด ์น ๊ฐ๋ฐ์๋ฅผ ์ํ ์คํ๋ง 5 ํ๋ก๊ทธ๋๋ฐ ์ ๋ฌธ _์ ์คํ๋ง ์ธ ์ก์ ์ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
์์ฑ
์คํ๋ง์๋ ๋ ๊ฐ์ง ๊ตฌ์ฑ์ด ํ์ํ๋ค.
- ๋น์ ์์ฑํ๊ณ ์ปดํฌ๋ํธ ๋ฑ์ ์ํธ ์ฃผ์ ๋๋ ๋ฐฉ๋ฒ์ ์ ์ธํ๋ ๋น ์ฐ๊ฒฐ(Bean wiring)
-
์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ ๋ด๋ถ์ ๋น์ ์์ฑ๊ฐ์ ์ ํ๋ ์์ฑ ์ฃผ์ (Property injection)
์คํ๋ง ๋ถํธ๋ฅผ ์ด์ฉํ๋ค๋ฉด ์ด ๋์ ์๋น๋ ๋์ ํด์ฃผ์ง๋ง, ๊ธฐ๋ณธ ์ค์ ์ ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด ๊ตฌ์ฑ ์์ฑ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์์ผ ํ๋ค. - ์คํ๋ง ํ๊ฒฝ ์ถ์ํ(environment abstraction)
์์ฑ์ ๊ทผ์์ ์ด์์ฒด์ ํ๊ฒฝ ๋ณ์, ์ ํ๋ฆฌ์ผ์ด์ ๋ด์ ์์ฑ ๊ตฌ์ฑ ํ์ผ, ๋ช ๋ นํ ์ธ์, JVM ์์คํ ์์ฑ ๋ฑ ๋ค์ํ์ง๋ง, ์ด๋ฅผ ์คํ๋ง์ด ํ๋ ๋ชจ์ ๋น๋ค์ด ์ฌ์ฉํ ์ ์๊ฒ ํ๋ค.
์๋ฅผ ๋ค์ด ํฌํธ๋ฅผ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ ๊ทผ์๋ค๋ก ๊ฐ๋ฅํ๋ค.
src/main/resources/application.properties
์์server.port=9090
application.yml
์์ ์ง์ java -jar tacocloud-0.0.5-SNAPSHOT.jar --server.port=9090
export SERVER_PORT=9090
์ด์์ฒด์ ํ๊ฒฝ๋ณ์
ํ๋กํผํฐ ํ์ผ
ํ๋กํผํฐ ํ์ผ ์์ฑ ๋ฐ ์์น
์คํ๋ง์ ๊ฐ๋จํ ์ค์ ์ผ๋ก ์ธ๋ถ์ ํ๋กํผํฐ ํ์ผ์ ์ด์ฉํด์ ์คํ๋ง ๋น์ ์ค์ ํ ์ ์๋ค.
db.properties
ํ์ผ
${}
๋ฅผ ์ด์ฉํ๋ฉด ๋ค๋ฅธ ํ๋กํผํฐ์ ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/spring5fs?characterEncoding=utf8
db.user=spring5
db.password=${db.user}
๋ค์์ ์ ๊ฐ์ ํ๋กํผํฐ ํ์ผ์ ์ด์ฉํ๊ฒ ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๋ค.
src/main/resources
ํด๋์ ์์น์ํค๋ฉด ๋์ด๋ค.
PropertySourcesPlaceholderConfigurer
์ ์ ๋น ํด๋์ค ๋ฑ๋ก
PropertySourcesPlaceholderConfigurer
๋น์ ๋ฌด์กฐ๊ฑด static
ํด๋์ค์ฌ์ผ ํ๋ค.
src/main/java/config/PropertyConfig.java
package config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.ClassPathResource;
@Configuration
public class PropertyConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
configurer.setLocations(// ํ๋กํผํฐ ํ์ผ ๋ชฉ๋ก ์ ๋ฌ
new ClassPathResource("db.properties"),// ํด๋์ค ํจ์ค์ ์์นํ ํ๋กํผํฐ ํ์ผ
new FileSytstemResources("../info.properties") // ํ์ผ ์์คํ
ํน์ ํจ์ค์ ์์นํ ํ๋กํผํฐ ํ์ผ
);
return configurer;
}
}
ํ๋กํผํฐ ๊ฐ ์ ๋ฌ
@Value
๋ฅผ ์ด์ฉํ ํ๋กํผํฐ ๊ฐ ์ ๋ฌ
์ดํ ๊ตฌ์ฑ ํด๋์ค์์ @Value("${ํ๋กํผํฐํ์ผ๋ช
.๊ฐ}")
์ผ๋ก ๊ฐ์ ์ง์ ํด์ค๋ค.
@Value
๋ฅผ ์ด์ฉํ ํ๋กํผํฐ ๊ฐ ์ ๋ฌ
package config;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DsConfigWithProp {
@Value("${db.driver}")
private String driver;
@Value("${db.url}")
private String jdbcUrl;
@Value("${db.user}")
private String user;
@Value("${db.password}")
private String password;
@Bean(destroyMethod = "close")
public DataSource dataSource() {
DataSource ds = new DataSource();
ds.setDriverClassName(driver);
ds.setUrl(jdbcUrl);
ds.setUsername(user);
ds.setPassword(password);
return ds;
}
}
๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๋น ํด๋์ค์๋ ๋น ์์ฑ์ ๊ฐ์ ์ง์ ํด์ค ์ ์๋ค.
@Value
์ด๋
ธํ
์ด์
๋น ํด๋์ค ์ฌ์ฉ๋ก
package spring;
import org.springframework.beans.factory.annotation.Value;
public class Info {
@Value("${info.version}")
private String version; // ๋น ํด๋์ค์ version์ด ์๋์ผ๋ก info.version ๊ฐ์ผ๋ก ์์ฑ
private String author;
public void printInfo() {
System.out.println("version = " + version);
}
public void setVersion(String version) {
this.version = version;
}
@Value("${info.author}")
public void setAuthor(String author) { // setter ๋ฉ์๋์๋ ๋ถ์ฌ์ ์ฌ์ฉ ๊ฐ๋ฅ
this.author = author;
}
}
@ConfigurationProperties
๋ฅผ ์ด์ฉํ ํ๋กํผํฐ ๊ฐ ์ ๋ฌ
์คํ๋ง ๋ถํธ๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ @ConfigurationProperties
๋ฅผ ์ด์ฉํ ์ ์๋ค.
์ด ์ด๋ ธํ ์ด์ ์ ํด๋น ๋น์ ์์ฑ์ ํ๋กํผํฐ์์ ๊ฐ์ ธ์ค๊ฒ ํ๋ค.
ํ๋กํผํฐ ํ์ผ์ taco.orders.pageSize: 10
์ด๊ฑฐ๋ ์ด์์ฒด์ export TACO_ORDERS_PAGESIZE=10
์ผ๋ก ๊ฐ์ ์ค์ ํ๋ค๊ณ ๊ฐ์ ํ์.
๋ค์๊ณผ ๊ฐ์ด ์ปจํธ๋กค๋ฌ๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
//...
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.data.domain.Pageable;
//...
@Controller// ์ปจํธ๋กค๋ฌ ๋น ์ค์
@RequestMapping("/orders")
@SessionAttributes("order")
// ํด๋น ๋น์ ์์ฑ์ ํ๋กํผํฐ์์ ๊ฐ์ ธ์ค๊ฒ ํ๋ ์ด๋
ธํ
์ด์
@ConfigurationProperties(prefix="taco.orders") // taco.orders์ ๊ฐ๋ค ๊ฐ์ ธ์ค๊ธฐ
public class OrderController {
private int pageSize = 20; // taco.orders.pageSize=10์ผ๋ก ์ค๋ฒ๋ผ์ด๋ฉ ๋จ
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
//...
@GetMapping
public String ordersForUser(
@AuthenticationPrincipal User user, Model mode) {
Pageable pageable = PageRequest.of(0, pageSize);
model.addAttributes("orders",
orederRepo.findByUserOrderByPlacedAtDesc(user, pageable));
return "orderList";
}
}
์์ ๊ฒฝ์ฐ ๋ณด๋ค๋ ์ฃผ๋ก ๊ตฌ์ฑ ๋ฐ์ดํฐ ํ๋๋ฅผ ์๋ฏธํ๋ Props
๋ฅผ ๋ถ์ธ ์๋ก์ด ์ปดํฌ๋ํธ ๋น์ผ๋ก ์์ฑํ์ฌ ํด๋น ๊ฐ์ ์ด์ฉํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋๋ค.
์์ฑ์ ๊ฒ์ฆ์ด ๊ฐ๋ฅํ๊ณ , ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ OrderProps
์์ฑ ํ๋
package tacos.web;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import org.springframework.validation.annotation.Validated;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import lombok.Data;
@Component
@ConfigurationProperties(prefix="taco.orders")
@Data
@Validated
public class OrderProps {
@Min(value=5, message="must be between 5 and 25")
@Max(value=25, message="must be between 5 and 25")
private int pageSize = 20;
}
์ด๋ฅผ ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
OrderController
์ฝ๋ ๋ณ๊ฒฝ
//...
@Slf4j
@Controller
@RequestMapping("/orders")
@SessionAttributes("order")
public class OrderController {
private OrderProps props;
private OrderRepository orderRepo;
public OrderController(OrderRepository orderRepo, OrderProps props) {
this.orderRepo = orderRepo;
this.props = props;
}
//...
@GetMapping
public String ordersForUser(
@AuthenticationPrincipal User user, Model model) {
Pageable pageable = PageRequest.of(0, props.getPageSize());
model.addAttribute("orders",
orderRepo.findByUserOrderByPlacedAtDesc(user, pageable));
return "orderList";
}
}
ํ๋กํผํฐ ๊ตฌ์ฑ ์์
๋ฐ์ดํฐ ์์ค ํ๋กํผํฐ ํ์ผ
๋ฐ์ดํฐ์์ค๋ฅผ ์ง์ ์ฝ๋ํ์ฌ ๊ตฌ์ฑํ๋ ๊ฒ๋ณด๋ค ์คํ๋ง ๋ถํธ๋ฅผ ์ด์ฉํ๋ฉด ์๋ ์ฒ๋ผ ํ๋กํผํฐ ํ์ผ์ ๊ตฌ์ฑํ ์ ์๋ค.
application.yml
ํ์ผ ์์
spring:
datasource:
url: jdbc:mysql://localhost/tacocloud
usernmae: tacodb
password: tacopassword
driver-class-name: com.mysql.jdbcDriver # ์คํ๋ง ๋ถํธ ์ด์ธ์ ์๋ JDBC ํด๋์ค ์ง์ ์ด ์๋ ๊ฒฝ์ฐ ์ถ๊ฐ
schema: # schema.sql, data.sql ์ด์ธ์ ์ถ๊ฐ sql ์คํ์ํฌ ์ ์ด์ฉ
- order-schema.sql
- ingredient-schemal.sql
data:
- ingredients.sql
jndi-name: java:/comp/env/jdbc/tacoCloudDS # jndi๋ฅผ ์ด์ฉํ ๊ตฌ์ฑ, ์ด์ฉํ ๊ฒฝ์ฐ ์์ ๊ฐ๋ค์ด ์ ๋ถ ๋ฌด์๋จ
์ปค๋ฅ์
ํ์ ๊ฒฝ์ฐ๋ HikariCP, Commons DBCP 2 ๊ฐ์ ๊ธฐ๋ณธ ๊ฐ์ด ์ซ์ผ๋ฉด ํ๋กํผํฐ ํ์ผ์ ์ง์ ํด์ค ์๋ ์๋ค.
JNDI๋
๊ณต์ ๋ฌธ์
์ฐธ์กฐ
๋ด์ฅ ์๋ฒ
์๋ฒ์ HTTPS ์์ฒญ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ปจํ ์ด๋ ๊ด๋ จ ์ค์ ์ ์์๋ก ๋ณด์.
keytool -keystore mykeys.jks -genkey -alias tomcat -keyalg RSA
- ๋จผ์ ํค ๊ด๋ฆฌ๋ฅผ ์ํด JDK์
keytool
์ ํธ๋ฆฌํฐ๋ก ํค์คํ ์ด๋ฅผ ์์ฑํ์.- ์ด๋ ์ํธ, ์ ์ฅ ์์น ๋ฑ์ ์ ๋ ฅํด์ผ ํ๋ค.
- ๋ค์๊ณผ ๊ฐ์ด ์๋ธ๋ฆฟ ์ปจํ
์ด๋ ์ค์ ์ ํด์ฃผ์.
```yml
server:
port: 0 # ๋ณดํต, 8443, ํฌํธ๋ฅผ 0์ผ๋ก ํ๋ฉด ์ฌ์ฉ ๊ฐ๋ฅํ ํฌํธ๋ฅผ ๋ฌด์์๋ก ๊ฐ์ ธ์ด
ssl:
key-store: file:///path/to/mykeys.jks # JAR ํ์ผ์ ๊ฒฝ์ฐ classpath:๋ก URL ์ฐธ์กฐ
key-store-password: ์ด์ ์_์ง์ ํ๋_์ํธ
key-password: ์ด์ ์_์ง์ ํ๋_์ํธ
#### ๋ก๊น
๊ธฐ๋ณธ์ ์ผ๋ก ์คํ๋ง ๋ถํธ์์ ์ ๊ณต๋๋ Logback ๋ก๊น
๊ตฌ์ฑ์ ์ํด `logback.xml` ํ์ผ์ ์ด์ฉํ ์ ์์ง๋ง, ๋ค์๊ณผ ๊ฐ์ด ํ๋กํผํฐ ํ์ผ๋ก๋ ๊ตฌ์ฑํ ์ ์๋ค.
```yml
logging:
path: /var/logs/
file: TacoCloud.log # ๋ก๊ทธ๋ฅผ ์ ์ฅํ๊ณ ์ถ๋ค๋ฉด ์ด์ฒ๋ผ ๊ฒฝ๋ก์ ํ์ผ๋ช
์ ์ง์
level: # ๋ก๊น
์์ค์ ์ค์ ํ๊ธฐ ์ํ ๋ก๊ฑฐ ๋ณ๋ก ๋ค๋ฅธ ์์ค์ผ๋ก ์ค์ ํ๊ฒ ํด์ค
root: WARN # root๋ WARN
org.springframework: # .์ ์ด์ฉํด ํ์ค๋ก ํํ๋ ๊ฐ๋ฅ
security: DEBUG # Spring Security ๋ก๊ฑฐ๋ DEBUG
๊ธฐ๋ณธ์ ์ธ ๋ก๊ทธ ํ์ผ ํฌ๊ธฐ๋ 10MB์ด๋ฉฐ, ๋์ผ๋ฉด ์๋ก์ด ๋ก๊ทธ ํ์ผ์ ์์ฑํ๋ค.
๊ตฌ์ฑ ์์ฑ ๋ฉํ๋ฐ์ดํฐ ์ ์ธ
๊ตฌ์ฑ ์์ฑ์ ์ด์ฉํ๋ฉด IDE์์๋ ์ด๋ฅผ ์ธ์ํ์ง ๋ชปํ์ฌ ์ค๋ฅ๊ฐ ๋๊ฑฐ๋ ๊ฐ์ ๋ฐ๋ก ํ์ธํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฏ๋ก, ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด๋ณด์.
-
์คํ๋ง ๋ถํธ์ ์์กด ๋ชจ๋์
org.springframework.boot.spring-boot-configuration-processor
๋ฅผ ์ถ๊ฐ -
src/main/resources/META-INF/additional-spring-configuration-metadata.json
ํ์ผ ์์ฑ -
์๋์ ๊ฐ์ด ํ์ผ ๋ด์ฉ ์ถ๊ฐ
additional-spring-configuration-metadata.json
ํ์ผ
๋๋ฌธ์์ -
+ ์๋ฌธ์๋ ์์ฑ ๋ช
์นญ์์ ๊ฐ์ ์ทจ๊ธํ๋ค.
ex) pageSize
== page-size
{
"properties": [
{
"name": "taco.orders.page-size",
"type": "int",
"description": "Sets the maximum number of orders to display in a list."
}
]
}
์ด์ ๋ด ์ปค์คํ ์์ฑ ๋ช ์นญ๋งํผ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ฉด IDE์์ ์ ์์ ์ผ๋ก ๋ณด์ธ๋ค.
ํ๋กํ
๊ฐ๋ฐ๊ณผ ์ค์ ์๋น์ค ๊ฐ์ DB, ๋ก๊ทธ, ์ค๋ฅ ์ฒ๋ฆฌ ๋ฑ์ ๊ฐ๋ฐ ํ๊ฒฝ์ด ๋ฌ๋ผ์ง๊ฒ ๋๋ฉฐ, ์ด ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ฐ๋ฐ ํ๊ฒฝ ์ค์ ์ ํ๋กํ(Profile)์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์คํ๋ง์์๋ ์ด๋ฌํ ๋ค์ํ ํ๋กํ ๋ณ๋ก ํ๊ทธ๋ฅผ ์ง์ ํ๊ณ , ์ง์ ํ ํ๊ทธ์ ๋ฐ๋ผ ํ๋กํ ์ค์ ์ ์ด์ฉํด ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์ด๊ธฐํํ ์ ์๊ฒ ํด์ค๋ค.
์ผ๋ถ ๋ฐฐํฌ์ฉ ํด๋ผ์ฐ๋ ์์๋ ํน์ ํ๋กํ์ผ๋ช ์ ๊ฐ์ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
- ํด๋ผ์ฐ๋ ํ์ด๋๋ฆฌ์์๋
cloud
๋ผ๋ ์ด๋ฆ์ ๋ฐฐํฌ์ฉ ํ๋กํ์ ๋ง๋ค์ด์ผ ํ๋ค.
ํ๋กํ์ ๋ฐ๋ฅธ ๊ตฌ์ฑ ํด๋์ค ์์ฑ
@Profile
์ด๋
ธํ
์ด์
์ฌ์ฉ
src/main/java/confi/DsDevConfig.java
package config;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
@Configuration
@Profile("dev")
public class DsDevConfig {
@Bean(destroyMethod = "close")
public DataSource dataSource() {
DataSource ds = new DataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost/spring5fs?characterEncoding=utf8");
ds.setUsername("spring5");
ds.setPassword("spring5");
// ...
return ds;
}
}
ํ๋กํ ๋ณ ํ๋กํผํฐ ํ์ผ ์์ฑ
application-{ํ๋กํ๋ช
}.yml
ํน์ application-{ํ๋กํ๋ช
}.properties
๋ผ๋ ๋ช
์นญ์ ํตํด ํน์ ์ํฉ์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋กํผํฐ ํ์ผ์ ๋ง๋ค ์ ์๋ค.
๋๋ ์๋์ ๊ฐ์ด ํ๋ก ํธ๋งคํฐ(---
)๋ก ๋๋์ด ๊ณตํต ์์ฑ์ ์ง์ ํ๊ณ , spring.profiles
๊ฐ์ ํตํด ํ๋กํ๋ช
์ ๋๋ ์ ์๋ค.
application.yml
ํ์ผ
logging:
level:
tacos: DEBUG # ๊ณตํต๋ ๋ชจ๋ ํ๋กํ์ ๊ธฐ๋ณธ ๊ฐ
--- # ์๋ก์ด ํ๋กํ ์์
spring:
profiles: prod # ํ๋กํ๋ช
์ง์
datasource:
url: jdbc:mysql://localhost/tacocloud
username: tacouser
password: tacopassword
logging:
level:
tacos: WARN # ๊ธฐ๋ณธ๊ฐ ๋ฎ์ด์ฐ๊ธฐ
---
spring:
profiles: dev # ์๋ก์ด ํ๋กํ ์์
datasource:
url: jdbc:mysql://localhost/tacocloud
username: tacouser
password: tacopassword
ํ๋กํ ์ ํ
๋ด๋ถ ์ฝ๋ ๋ฐฉ๋ฒ
src/main/java/main/MainProfile.java
package main;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
//...
public class MainProfile {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
// getEnvironment: ํ๋กํ ํ์
// setActiveProfiles: ํ๋กํ ์ ํ
context.getEnvironment().setActiveProfiles("dev"); //("dev", "real"); ์ฌ๋ฌ๊ฐ์ ํ๋กํ ์ ํ ๊ฐ๋ฅ
// ์ดํ ์ฌ์ฉํ ๊ตฌ์ฑ ํด๋์ค๋ฅผ ๋ฑ๋กํด ์ค์ผํจ. ์์ ์ค์!
context.register(MemberConfig.class, DsDevConfig.class, DsRealConfig.class);
//context.register(MemberConfigWithProfile.class);
context.refresh();
//...
context.close();
}
}
์์ฒ๋ผ Main
๋ฉ์๋๋ก ํ๋กํ ์ ํํ๋๊ฒ ์ด์ธ์ ์ถ๊ฐ๋ก ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค.
spring.profiles.active
์์คํ ํ๋กํผํฐ์ ์ฌ์ฉํ ํ๋กํ ๊ฐ ์ง์ - ๋ค์์ ๊ฒฝ์ฐ ์ฝค๋ง๋ก ๊ตฌ๋ถ , ์ฐ์ ์์ ์ค๊ฐ
- ex)
System.setPropery("spring.profiles.active", "dev")
,java -D spring.profiles.active=dev, real main.Main
- OS ํ๊ฒฝ ๋ณ์
spring.profiles.active
์ ์ง์ ๊ฐ ์ค์ - ์ฐ์ ์์ ๊ฐ์ฅ ๋ฎ์
- ex)
spring.profiles.active = dev, real
application.yml
ํ์ผ ๋ด์spring.profiles.active=prod
๊ฐ์ด ๊ฐ ์ง์ - ๋ณดํต ์ฌ์ฉํ์ง ์์
web.xml
์ด์ฉ
ํน์ ์๋์ ๊ฐ์ด web.xml
์ spring.profiles.active
์ด๊ธฐํ ํ๋ผ๋ฏธํฐ๋ก ํ๋กํ์ ์ ํํ ์ ์๋ค.
<!--...-->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>spring.profiles.active</param-name>
<param-value>dev</param-value>
</init-param>
<init-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</init-param>
<!--...-->
๋ค์ ํ๋กํ ์ค์ ๋ฐ ํ๋กํ ์งํฉ ํด๋์ค
์ฌ๋ฌ ํ๋กํ ํด๋์ค๋ฅผ ํ ์ค์ฒฉ ํด๋์ค์ ๋ชจ์๋์ ์๋๋ฐ, ์ด๋ ํ๋กํ ํด๋์ค๋ ๋ฌด์กฐ๊ฑด static
ํด๋์ค์ฌ์ผ ํ๋ค.
๋ํ ์๋ ์์์ฒ๋ผ ํ๋์ ์ค์ ์ ๋ ๊ฐ ์ด์์ ํ๋กํ์ ์ฃผ๊ฑฐ๋ !
๋ฅผ ์ด์ฉํ ์ ์๋ค.
//...
@Configuration
@EnableTransactionManagement
public class MemberConfigWithProfile {
//...
@Configuration
@Profile("dev, test") // dev && test ์ฌ์ฉ ์ ํ์ฑํ
// {"dev", "test"} : dev || test ์ฌ์ฉ์ ํ์ฑํ
public static class DsDevConfig {
@Bean(destroyMethod = "close")
public DataSource dataSource() {
DataSource ds = new DataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost/spring5fs?characterEncoding=utf8");
return ds;
}
}
@Configuration
@Profile("!real") // real์ ์ฌ์ฉํ์ง ์์๋ ํ์ฑํ
public static class DsRealConfig {
@Bean(destroyMethod = "close")
public DataSource dataSource() {
DataSource ds = new DataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://realdb/spring5fs?characterEncoding=utf8");
ds.setUsername("spring5");
ds.setPassword("spring5");
return ds;
}
}
}
_articles/web/backend/Spring/Spring5-๊ตฌ์ฑ ์์ฑ.md