Spring Boot์์ ๊ตฌ์ฑ ์ค์ (Configuration) ๊ด๋ฆฌํ๊ธฐ: `application.yml`๊ณผ ํ๋กํ ๊ธฐ๋ฐ ์ค์ ์๋ฒฝ ๊ฐ์ด๋
Spring Boot ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ ๋ ํ๊ฒฝ๋ณ ์ค์ ๊ด๋ฆฌ ๋ ํ์์ ์
๋๋ค. ๊ฐ๋ฐ, ํ
์คํธ, ์ด์ ํ๊ฒฝ๋ง๋ค ๋ค๋ฅธ ์ค์ ์ด ํ์ํ๊ธฐ ๋๋ฌธ์, ํจ์จ์ ์ธ ๊ตฌ์ฑ ๊ด๋ฆฌ ๊ฐ ์ค์ํฉ๋๋ค. ์ด๋ฒ ํฌ์คํ
์์๋
application.properties
์
application.yml
ํ์ผ ํ์ฉ๋ฒ , ํ๊ฒฝ๋ณ ์ค์ ์ ์ํ ํ๋กํ ๊ด๋ฆฌ(
@Profile
) , ๊ทธ๋ฆฌ๊ณ
@ConfigurationProperties
๋ก ์ค์ ์ฃผ์
ํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃน๋๋ค.
๋ชฉ์ฐจ
- application.properties์ application.yml์ ์ฐจ์ด์
- ํ๋กํ(
@Profile
)์ ์ฌ์ฉํ ํ๊ฒฝ๋ณ ์ค์ ๋ถ๋ฆฌ - @ConfigurationProperties๋ก ์ค์ ์ฃผ์ ํ๊ธฐ
- ๊ตฌ์ฑ ์ค์ ์ ์ต์ ํธ๋ ๋์ ๋ชจ๋ฒ ์ฌ๋ก
- ์ค์ต ์ฝ๋์ ํ์ฉ ์์
1. application.properties์ application.yml์ ์ฐจ์ด์
Spring Boot์์๋
application.properties
์
application.yml
ํ์ผ์ ํตํด ์ ํ๋ฆฌ์ผ์ด์
์ ์ค์ ์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ์ด ๋ ๊ฐ์ง ๋ฐฉ์์ ๋์ผํ ์ญํ ์ ํ์ง๋ง, ๊ตฌ์กฐ์ ์ธ ํํ ๋ฐฉ์ ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
๋น๊ต ํญ๋ชฉ | application.properties | application.yml |
---|---|---|
ํ์ผ ํ์ | ํค-๊ฐ ์ (Key-Value) | ๊ณ์ธต์ ๊ตฌ์กฐ (YAML) |
๊ฐ๋ ์ฑ | ๋ณต์กํ ์ค์ ์ผ ๊ฒฝ์ฐ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง ์ ์์ | ๊ณ์ธต ๊ตฌ์กฐ๋ก ์ค์ ์ด ๊ฐ๊ฒฐํ๊ณ ๋ช ํํจ |
์ฃผ๋ก ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ | ๊ฐ๋จํ ์ค์ | ๋ณต์กํ ์ค์ ๊ด๋ฆฌ |
application.properties
์ฌ์ฉ ์์
server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=1234
application.yml
์ฌ์ฉ ์์
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: 1234
-
application.yml
์ ๊ณ์ธต์ ํํ ์ด ๊ฐ๋ฅํด ๋ณต์กํ ์ค์ ์ ๋ ๊ฐ๊ฒฐํ๊ฒ ํํํ ์ ์์ต๋๋ค.
2. ํ๋กํ(
@Profile
)์ ์ฌ์ฉํ ํ๊ฒฝ๋ณ ์ค์ ๋ถ๋ฆฌ
Spring Boot๋ ํ๊ฒฝ๋ณ๋ก ๋ค๋ฅธ ์ค์ ์ ๊ด๋ฆฌ ํ ์ ์๋๋ก ํ๋กํ(Profile) ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ๋ฐ ํ๊ฒฝ๊ณผ ์ด์ ํ๊ฒฝ์์ ์๋ฒ ํฌํธ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค URL ์ด ๋ค๋ฅผ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํด
@Profile
์ ๋ํ
์ด์
๊ณผ ํ๋กํ ๊ธฐ๋ฐ ์ค์ ํ์ผ ์ ํ์ฉํ ์ ์์ต๋๋ค.
1. ํ๋กํ๋ณ ์ค์ ํ์ผ ์์ฑ
- application-dev.yml (๊ฐ๋ฐ ํ๊ฒฝ)
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://localhost:3306/devdb
username: devuser
password: devpass
- application-prod.yml (์ด์ ํ๊ฒฝ)
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/proddb
username: produser
password: prodpass
2. ํ๋กํ ํ์ฑํ (application.yml)
spring:
profiles:
active: dev
-
spring.profiles.active
: ํ์ฌ ์ฌ์ฉ ์ค์ธ ํ๋กํ์ ์ง์ ํฉ๋๋ค. ๊ฐ๋ฐ ํ๊ฒฝ์์๋dev
, ์ด์ ํ๊ฒฝ์์๋prod
๋ก ์ค์ ํฉ๋๋ค.
3. @Profile ์ ๋ํ ์ด์ ์ฌ์ฉ ์์
package com.example.demo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
@Configuration
public class DataSourceConfig {
@Bean
@Profile("dev")
public String devDataSource() {
System.out.println("๊ฐ๋ฐ ํ๊ฒฝ ๋ฐ์ดํฐ์์ค ์ค์ ");
return "Development DataSource";
}
@Bean
@Profile("prod")
public String prodDataSource() {
System.out.println("์ด์ ํ๊ฒฝ ๋ฐ์ดํฐ์์ค ์ค์ ");
return "Production DataSource";
}
}
-
@Profile("dev")
: ๊ฐ๋ฐ ํ๊ฒฝ์์๋ง ํด๋น ๋น์ด ํ์ฑํ๋ฉ๋๋ค. -
@Profile("prod")
: ์ด์ ํ๊ฒฝ์์๋ง ํด๋น ๋น์ด ํ์ฑํ๋ฉ๋๋ค.
3. @ConfigurationProperties๋ก ์ค์ ์ฃผ์ ํ๊ธฐ
@ConfigurationProperties
๋ ์ค์ ํ์ผ์ ์ ์๋ ์ค์ ๊ฐ์ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉ ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฌ๋ฌ ์ค์ ๊ฐ์ ํ๋์ ํด๋์ค์ ๋ฌถ์ด ๊ด๋ฆฌ ํ ์ ์์ต๋๋ค.
1. ์์กด์ฑ ์ถ๊ฐ (pom.xml)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
2. ์ค์ ํด๋์ค ์์ฑ (AppConfig.java)
package com.example.demo.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "app")
public class AppConfig {
private String name;
private String version;
// Getter, Setter ์๋ต
public String getInfo() {
return "์ ํ๋ฆฌ์ผ์ด์
์ด๋ฆ: " + name + ", ๋ฒ์ : " + version;
}
}
-
@ConfigurationProperties
: ์ค์ ํ์ผ์ ๊ฐ์ ํด๋์ค ํ๋์ ๋ฐ์ธ๋ฉํฉ๋๋ค. -
prefix
: ํด๋น ์ ๋์ฌ๋ก ์์ํ๋ ๋ชจ๋ ์ค์ ์ด ๋ฐ์ธ๋ฉ๋ฉ๋๋ค.
3. ์ค์ ํ์ผ (application.yml)
app:
name: MySpringApp
version: 1.0.0
4. ์ค์ ํด๋์ค ์ฌ์ฉ ์์
package com.example.demo.controller;
import com.example.demo.config.AppConfig;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class AppController {
private final AppConfig appConfig;
public AppController(AppConfig appConfig) {
this.appConfig = appConfig;
}
@GetMapping("/info")
public String getAppInfo() {
return appConfig.getInfo();
}
}
4. ๊ตฌ์ฑ ์ค์ ์ ์ต์ ํธ๋ ๋์ ๋ชจ๋ฒ ์ฌ๋ก
- Spring Cloud Config : ์ค์ ํ์ผ์ ์ค์ ์ง์ค์์ผ๋ก ๊ด๋ฆฌ ํ ์ ์์ต๋๋ค.
- ํ๊ฒฝ ๋ณ์์ ์ธ๋ถ ์ค์ ํ์ฉ : ๋์ปค๋ ํด๋ผ์ฐ๋ ํ๊ฒฝ์์๋ ํ๊ฒฝ ๋ณ์ ๋ฅผ ํตํด ์ค์ ์ ์ฃผ์ ํฉ๋๋ค.
- ์ํธํ๋ ์ค์ ๊ด๋ฆฌ : ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์ํธํ ํ๊ณ , Vault ์ ๊ฐ์ ๋๊ตฌ๋ฅผ ํ์ฉํด ๋ณด์์ ๊ฐํํฉ๋๋ค.
- ํ๋กํ ์๋ ์ ํ : CI/CD ํ์ดํ๋ผ์ธ์์ ์๋์ผ๋ก ํ๋กํ์ ์ ํ ํด ์ด์ ํ๊ฒฝ์ ๋ง๋ ์ค์ ์ ์ ์ฉํฉ๋๋ค.
๊ด๋ จ ๋งํฌ
Spring Cloud Config ์ฌ์ฉ๋ฒ๐
YAML vs Properties ํ์ผ ๋น๊ต๐
@ConfigurationProperties ์ฌ์ฉ๋ฒ๐
Vault๋ก ์ค์ ๊ด๋ฆฌํ๊ธฐ๐
FAQ
1. application.properties์ application.yml ์ค ๋ฌด์์ ์ ํํด์ผ ํ๋์?
- ๊ฐ๋จํ ์ค์ ์
properties
๋ก ์ถฉ๋ถํ์ง๋ง, ๋ณต์กํ ๊ณ์ธตํ ์ค์ ์yml
ํ์ผ์ด ๋ ์ ํฉํฉ๋๋ค.
2. ์ฌ๋ฌ ํ๋กํ์ ๋์์ ์ฌ์ฉํ ์ ์๋์?
- ๋ค, ์ผํ(,) ๋ก ๊ตฌ๋ถํด ์ฌ๋ฌ ํ๋กํ์ ํ์ฑํํ ์ ์์ต๋๋ค. ์:
spring.profiles.active=dev,prod
3. ํ๊ฒฝ ๋ณ์๋ก ์ค์ ์ ์ค๋ฒ๋ผ์ด๋ํ ์ ์๋์?
- ๋ค, ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํด ํ์ผ ์ค์ ์ ๋ฎ์ด์ธ ์ ์์ต๋๋ค.
4. Spring Cloud Config๋ ์ธ์ ์ฌ์ฉํ๋์?
- ์ฌ๋ฌ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋์ผํ ์ค์ ์ ์ฌ์ฉํ ๋, ์ค์ ์ง์ค์ ์ค์ ๊ด๋ฆฌ ๊ฐ ํ์ํฉ๋๋ค.
5. ๋ฏผ๊ฐํ ์ ๋ณด๋ ์ด๋ป๊ฒ ๋ณดํธํ๋์?
- Vault ๋ AWS Parameter Store ์ ๊ฐ์ ๋๊ตฌ๋ก ์ํธํ๋ ์ค์ ์ ๊ด๋ฆฌํฉ๋๋ค.
๋ง๋ฌด๋ฆฌ
์ด๋ฒ ํฌ์คํ
์์๋ Spring Boot์์ ๊ตฌ์ฑ ์ค์ ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ ์ ๋ค๋ค์ต๋๋ค.
application.yml
๊ณผ ํ๋กํ ๊ธฐ๋ฐ ์ค์ ์ ํตํด ํ๊ฒฝ๋ณ๋ก ๊ตฌ๋ถ๋ ์ค์ ์ ์ ์ฉํ๊ณ ,
@ConfigurationProperties
๋ฅผ ์ฌ์ฉํด ์ค์ ๊ฐ์ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ์ต๋๋ค.
์ด์ ์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ์์ ๊ตฌ์ฑ ๊ด๋ฆฌ์ ํจ์จ์ฑ ์ ๊ทน๋ํํด๋ณด์ธ์! ๐
๋๊ธ