π[Spring] Profileμ΄λ 무μμΌκΉμ?
-
Profileμ μ ν리μΌμ΄μ
μ μ€ν νκ²½(μ: κ°λ°, ν
μ€νΈ, μ΄μ)μ λ°λΌ λ€λ₯Έ μ€μ μ μ μ©ν μ μλλ‘ νλ κΈ°λ₯μ
λλ€.
- μ΄λ₯Ό ν΅ν΄ νκ²½μ λ°λΌ μ ν©ν μ€μ κ°(μ: λ°μ΄ν°λ² μ΄μ€ URL, λ‘κΉ μμ€ λ±)μ κ°λ¨νκ² κ΄λ¦¬ν μ μμ΅λλ€.
1οΈβ£ Profileμ μ£Όμ κ°λ .
1οΈβ£ νκ²½λ³ μ€μ λΆλ¦¬.
- κ°λ°(Development), ν μ€νΈ(Test), μ΄μ(Production) λ± μλ‘ λ€λ₯Έ μ€ν νκ²½μ λ°λΌ μ€μ κ°μ λΆλ¦¬νκ³ , νΉμ νκ²½μ λ§λ μ€μ μ μ½κ² μ μ©ν μ μμ΅λλ€.
2οΈβ£ μ€μ νμΌ κ΄λ¦¬.
- application.properties λλ application.yml νμΌμμ νκ²½λ³ μ€μ μ μμ±ν μ μμΌλ©°, νλ‘νμΌλ³λ‘ νμΌμ λΆλ¦¬ν΄ κ΄λ¦¬ν μ μμ΅λλ€.
3οΈβ£ μ μ°ν μ€ν.
-
spring.profiles.active
μμ±μ ν΅ν΄ μ€ν μ νμ±νν νλ‘νμΌμ μ§μ ν μ μμ΅λλ€.
2οΈβ£ Profile μ€μ λ°©λ².
1οΈβ£ κΈ°λ³Έ μ€μ νμΌ μ¬μ©.
- λͺ¨λ νκ²½μμ 곡ν΅μΌλ‘ μ¬μ©νλ μ€μ μ
application.properties
λλapplication.yml
νμΌμ μμ±ν©λλ€. - νλ‘νμΌλ³ μ€μ μ
application-{profile}.properties
λλapplication-{profile}.yml
νμΌλ‘ μμ±ν©λλ€.
2οΈβ£ μμ.
-
application.properties
(κ³΅ν΅ μ€μ )server.port=8080 spring.datasource.username=root spring.datasource.password=common-password
-
application-dev.properties
(κ°λ° νκ²½)server.port=8081 spring.datasource.url=jdbc:mysql://localhost:3306/dev_db
-
application-prod.properties
(μ΄μ νκ²½)server.port=8082 spring.datasource.url=jdbc:mysql://prod-db-example.com:3306/prod_db spring.datasource.password=prod-password
3οΈβ£ νμ±νν Profile μ§μ .
-
spring.profiles.active
λ₯Ό μ¬μ©νμ¬ μ€ν μ νμ±νν νλ‘νμΌμ μ§μ ν©λλ€.
1οΈβ£ application.propertiesμμ μ§μ .
spring.profiles.active=dev
2οΈβ£ JVM μ΅μ μΌλ‘ μ§μ .
java -jar -Dspring.profiles.active=prod myapp.jar
3οΈβ£ νκ²½ λ³μλ‘ μ§μ .
export SPRING_PROFILES_ACTIVE=dev
4οΈβ£ IDEμμ μ§μ .
μ€ν μ€μ μμ -Dspring.profile.active=dev
λ₯Ό μΆκ°ν©λλ€.
4οΈβ£ νλ‘νμΌλ³ Bean μ μ
- Springμμλ νλ‘νμΌλ³λ‘ Beanμ λ€λ₯΄κ² μ€μ ν μ μμ΅λλ€.
1οΈβ£ μμ.
@Configuration
public class DataSourceConfig {
@Bean
@Profile("dev")
public DataSource devDataSource() {
return DataSourceBuilder.create()
.url("jdbc:mysql://localhost:3306/dev_db")
.username("dev_user")
.password("dev-password")
.build();
}
@Bean
@Profile("prod")
public DataSource prodDataSource() {
return DataSourceBuilder.create()
.url("jdbc://prod-db.example.com:3306/prod_db")
.username("prod-user")
.password("prod-password")
.build();
}
}
5οΈβ£ Profileμ νμ© μμ.
1οΈβ£ νκ²½λ³ λ°μ΄ν°λ² μ΄μ€ μ€μ .
- κ°λ° νκ²½μμλ λ‘컬 DB, μ΄μ νκ²½μμλ ν΄λΌμ°λ DBλ₯Ό μ¬μ©νλλ‘ λΆλ¦¬.
2οΈβ£ λ‘κΉ μμ€.
- κ°λ° νκ²½μμλ DEBUG λ 벨μ μμΈ λ‘κ·Έλ₯Ό μΆλ ₯νκ³ , μ΄μ νκ²½μμλ ERROR μμ€μ λ‘κ·Έλ§ μΆλ ₯.
3οΈβ£ API ν€λ λ―Όκ° μ 보 κ΄λ¦¬.
- ν μ€νΈ νκ²½μμλ Mock API ν€λ₯Ό μ¬μ©νκ³ , μ΄μ νκ²½μμλ μ€μ API ν€λ₯Ό μ μ©.
4οΈβ£ μλ² ν¬νΈ λ³κ²½.
- κ° νκ²½μ λ°λΌ μ ν리μΌμ΄μ μ μ€ν ν¬νΈλ₯Ό λ€λ₯΄κ² μ€μ .
6οΈβ£ Profileμ μ₯μ .
1οΈβ£ μ μ§λ³΄μμ± ν₯μ.
- μ€μ νμΌμ νκ²½λ³λ‘ λΆλ¦¬ν΄ μ½λμ μ€μ κ°μ μμ‘΄λλ₯Ό μ€μ΄κ³ , λ³κ²½ μ¬νμ μ½κ² κ΄λ¦¬ν μ μμ΅λλ€.
2οΈβ£ λ°°ν¬ μλνμ μ 리.
- CI/CD νμ΄νλΌμΈμμ νκ²½μ λ§λ νλ‘νμΌμ νμ±ννμ¬ λ°°ν¬λ₯Ό μλνν μ μμ΅λλ€.
3οΈβ£ μμ μ±
- νκ²½λ³λ‘ μ€μ μ 격리ν¨μΌλ‘μ¨ μλͺ»λ μ€μ (μ: μ΄μ DBλ₯Ό κ°λ° νκ²½μμ μ κ·Όνλ λ¬Έμ )μ λ°©μ§ν μ μμ΅λλ€.