chap 5 3 - JAVA-JIKIMI/SPRING-IN-ACTION-5 GitHub Wiki
κ΅¬μ± μμ± μ¬μ©νκΈ° :: νλ‘νμΌ μ¬μ©ν΄μ ꡬμ±νκΈ°
μ ν리μΌμ΄μ μ΄ μλ‘ λ€λ₯Έ λ°νμ νκ²½μ λ°°ν¬, μ€μΉλ λλ λκ° κ΅¬μ± λͺ μΈκ° λ¬λΌμ§λ€.
μ΄λ κ° νκ²½μ μμ±λ€μ application.ymlμλ μ€μ ν μ μκ³
λν μ΄μ체μ μ νκ²½ λ³μλ₯Ό μ¬μ©ν΄μ μ€μ ν μλ μλ€.
νμ§λ§ νλ μ΄μμ κ΅¬μ± μμ±μ νκ²½ λ³μλ‘ μ§μ νλ κ²μ λ²κ±°λ‘λ€.
κ²λ€κ° νκ²½ λ³μμ λ³κ²½μ μΆμ κ΄λ¦¬νκ±°λ μ€λ₯κ° μμ κ²½μ°μ
λ³κ²½ μ μΌλ‘ λ°λ‘ λλ릴 μ μλ λ°©λ²μ΄ λ§λ μΉ μλ€.
λ°λΌμ μ€νλ§ νλ‘νμΌμ μ΄μ©νλ κ²μ΄ μ νΈλλ€.
λ°νμ μμ νμ±νλλ νλ‘νμΌμ λ°λΌ μλ‘ λ€λ₯Έ λΉ, κ΅¬μ± ν΄λμ€, κ΅¬μ± μμ±λ€μ΄
μ μ© λλ 무μλλλ‘ νλ κ²μ΄ νλ‘νμΌμ΄λ€.
μλ₯Ό λ€μ΄, κ°λ°κ³Ό λλ²κΉ λͺ©μ μΌλ‘ λ΄μ₯ H2 DBλ₯Ό μ¬μ©νκ³
νμ½ ν΄λΌμ°λ μ½λμ λ‘κΉ μμ€μ DEBUGλ‘ μ€μ νλ€κ³ ν΄λ³΄μ.
μ΄ κ²½μ° κ°λ° μμλ λ°μ΄ν° μμ€ μμ±μ λ°λ‘ μ€μ νμ§ μμλ
μλ-ꡬμ±λ H2 DBλ₯Ό μΆ©λΆν μ¬μ©ν μ μλ€.
κ·Έλ¦¬κ³ λ‘κΉ μμ€μ tacos κΈ°λ³Έ ν¨ν€μ§μ logging.level.tacos μμ±μ application.ymlμ DEBUGλ‘ μ€μ νλ©΄ λλ€.
logging:
level:
tacos: DEBUG
κ·Έλ¬λ νλ‘λμ νκ²½μμλ μΈλΆμ MySQL DBλ₯Ό μ¬μ©νκ³ λ‘κΉ μμ€μ WARNμΌλ‘ μ€μ νκ³ μ νλ€.
μ΄ λμλ νκ²½λ³λ‘ μ ν©ν μμ±λ€μ μ€μ νλ νλ‘νμΌμ μ μν΄μΌ νλ€.
νλ‘νμΌ νΉμ μμ± μ μνκΈ°
νλ‘νμΌμ νΉμ ν μμ±μ μ μνλ ν κ°μ§ λ°©λ²μ νλ‘λμ νκ²½μ μμ±λ€λ§
ν¬ν¨νλ λ λ€λ₯Έ .ymlμ μμ±νλ κ²μ΄λ€. μ΄λ νμΌ μ΄λ¦μ λ€μ κ·μΉμ λ°λΌμΌ νλ€.
application-[νλ‘νμΌ μ΄λ¦].yml
κ·Έλ¬λ©΄ ν΄λΉ νλ‘νμΌμ μ ν©ν κ΅¬μ± μμ±λ€μ κ° νμΌμ μ§μ ν μ μλ€.
λν YAML ꡬμ±μμλ§ μ¬μ©ν μ μλ λ€λ₯Έ λ°©λ²μ΄ μλ€.
μ΄λλ νλ‘νμΌμ νΉμ λμ§ μκ³ κ³΅ν΅μΌλ‘ μ μ©λλ κΈ°λ³Έ μμ±κ³Ό ν¨κ»
νλ‘νμΌ νΉμ μμ±μ 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λ₯Ό μ§μ νμ§ μμ DEBUG μμ±μ λͺ¨λ νλ‘νμΌμ κΈ°λ³Έ 곡ν΅μΌλ‘ μ μ©λλ€.
νλ‘νμΌ νμ±ννκΈ°
νλ‘νμΌ νΉμ μμ±λ€μ μ€μ μ ν΄λΉ νλ‘νμΌμ΄ νμ±νλμ΄μΌ μ ν¨νλ€.
κ·Έλ λ€λ©΄ μ΄λ»κ² νλ‘νμΌμ νμ±νν μ μμκΉ? spring.profiles.active μμ±μ μ§μ νλ©΄ λλ€.
spring:
profiles:
active:
- prod
νμ§λ§ μ΄κ²μ μ¬λ¬ νμ±ν λ°©λ² μ€ κ°μ₯ μ’μ§ μμ λ°©λ²μ΄λ€.
νμ±νλ₯Ό νλμ½λ©νκ² λκΈ° λλ¬Έμ νΉμ μμ±μ κ°λ° μμ±κ³Ό λΆλ¦¬μν¬ μ μλ€.
μ΄ λ°©λ² λμ νκ²½ λ³μλ₯Ό μ¬μ©ν΄μ νμ±ν νλ‘νμΌμ μ€μ νλ κ²μ΄ λ λμ λ°©λ²μ΄λ€.
export SPRING_PROFILES_ACTIVE=prod
νμ§λ§ μ΄λ κ² ν΄λ ν΄λΉ μ»΄ν¨ν°μ λ°°ν¬λλ λͺ¨λ μ ν리μΌμ΄μ μ prod νλ‘νμΌμ΄ νμ±νλλ€λ λ¨μ μ΄ μλ€.
μ€ν κ°λ₯ν JAR νμΌλ‘ μ ν리μΌμ΄μ μ μ€ννλ€λ©΄, λ€μκ³Ό κ°μ΄ λͺ λ Ήν μΈμλ‘ νμ±ν νλ‘νμΌμ μ€μ νλ€.
κ·Έλ¬λ©΄ μ ν리μΌμ΄μ λ³λ‘ νμ±νλ₯Ό μ€μ ν μ μλ€.
java -jar taco-cloud.jar --spring.profiles.active=prod
spring.profiles.active μμ±μλ μ¬λ¬ κ°μ νλ‘νμΌμ΄ ν¬ν¨λ μ μλ€.
java -jar taco-cloud.jar --spring.profiles.active=prod,audit,ha
YAMLμμλ λ€μκ³Ό κ°μ΄ μ§μ νλ©΄ λλ€.
spring:
profiles:
active:
- prod
- audit
- ha
ννΈ, μ€νλ§ μ ν리μΌμ΄μ μμ 쑰건λ³λ‘ κ΅¬μ± μμ±μ μ€μ ν λλ§ νλ‘νμΌμ΄ μ μ©ν κ²μ μλλ€.
μ§κΈλΆν°λ νμ±ν νλ‘νμΌμ λΉμ μ μ©νλ λ°©λ²μ μμ보μ.
νλ‘νμΌμ μ¬μ©ν΄μ 쑰건λ³λ‘ λΉ μμ±νκΈ°
μλ‘ λ€λ₯Έ νλ‘νμΌ κ°κ°μ μ ν©ν λΉλ€μ μ 곡νλ κ²μ΄ μ μ©ν λκ° μλ€.
μΌλ°μ μΌλ‘ μλ° κ΅¬μ± ν΄λμ€μ μ μΈλ λΉμ νμ±νλλ νλ‘νμΌκ³Όλ 무κ΄νκ² μμ±λλ€.
κ·Έλ¬λ νΉμ νλ‘νμΌμ΄ νμ±νλ λλ§ μμ±λμ΄μΌ νλ λΉλ€μ΄ μλ€κ³ κ°μ ν΄λ³΄μ.
μ΄λ @Profile μ λ Έν μ΄μ μ μ¬μ©νλ©΄ μ§μ λ νλ‘νμΌμλ§ μ ν©ν λΉλ€μ μμ±ν μ μλ€.
μλ₯Ό λ€μ΄, TacoCloudApplicationμλ CommandLineRunner λΉμ΄ μ μΈλμ΄ μλ€.
κ·Έλ¦¬κ³ μ ν리μΌμ΄μ μ΄ μμλ λλ§λ€ μμμ¬ λ°μ΄ν°λ₯Ό λ΄μ₯ DBμ λ‘λνκΈ° μν΄ CommandLineRunner λΉμ΄ μ¬μ©λλ€.
νλ‘λμ νκ²½μμλ λΉνμ±ννλ κ²μ΄ λμ κ²μ΄λ€.
μ΄λ CommandLineRunner λΉ λ©μλμ @Profileμ μ§μ νλ©΄ νλ‘λμ νκ²½μμ μμμ¬ λ°μ΄ν°κ° λ‘λλλ κ²μ λ°©μ§ν μ μλ€.
@Bean
@Profile("dev")
public CommandLineRunner dataLoader(IngredientRepository repo) {
return new CommandLineRunner() {
@Override
public void run(String... args) throws Exception {
repo.save(new Ingredient("FLTO", "Flour Tortilla", Ingredient.Type.WRAP));
repo.save(new Ingredient("COTO", "Corn Tortilla", Ingredient.Type.WRAP));
repo.save(new Ingredient("GRBF", "Ground Beef", Ingredient.Type.PROTEIN));
repo.save(new Ingredient("CARN", "Carnitas", Ingredient.Type.PROTEIN));
repo.save(new Ingredient("TMTO", "Diced Tomatoes", Ingredient.Type.VEGGIES));
repo.save(new Ingredient("LETC", "Lettuce", Ingredient.Type.VEGGIES));
repo.save(new Ingredient("CHED", "Cheddar", Ingredient.Type.CHEESE));
repo.save(new Ingredient("JACK", "Monterrey Jack", Ingredient.Type.CHEESE));
}
};
}
λλ dev νλ‘νμΌμ΄λ qa νλ‘νμΌ μ€ νλκ° νμ±νλ λμλ μνλ νλ‘νμΌμ μΆκ°νλ©΄ λλ€.
@Profile({"dev", "qa"})
νΉμ μ΄λ κ² μ§μ ν μλ μλ€.
@Profile("!prod")
@Profileμ @Configurationμ΄ μ§μ λ ν΄λμ€ μ 체μ λν΄ μ¬μ©ν μλ μλ€.
μλ₯Ό λ€μ΄, DevelopmentConfigλΌλ μ΄λ¦μ κ΅¬μ± ν΄λμ€λ‘
CommandLineRunner λΉμ μ£Όμ ν λ λ€μκ³Ό κ°μ΄ @Profileμ μ§μ ν μ μλ€.
package tacos;
/*
* @USER JungHyun
* @DATE 2020-07-31
* @DESCRIPTION
*/
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Profile;
import org.springframework.security.crypto.password.PasswordEncoder;
import tacos.data.IngredientRepository;
import tacos.data.UserRepository;
@Profile({"!prod", "!qa"})
public class DevelopmentConfig {
@Bean
public CommandLineRunner dataLoader(IngredientRepository repo, UserRepository userRepo, PasswordEncoder encoder) {
...
}
}
μ΄ κ²½μ°λ prod νλ‘νμΌκ³Ό qa νλ‘νμΌ λͺ¨λ νμ±νλμ§ μμ λλ§ CommandLineRunner λΉμ΄ μμ±λλ€.