1. 들어가며
실제 프로젝트에서 dev, stage, production과 같은 개발하는 환경이 다르다. @Profile 어노테이션을 이용해서 다른 profile을 설정하는 방법에 대해서 알아보자.
1.1. @Profile
애노테이션은 어디에 설정?
- 빈으로 등록되어있는 클래스 레벨에 설정 가능
- @Configuration, @Component
// TestConfiguration
@Profile("test")
@Configuration
public class TestConfiguration {
@Bean
public String hello() {
return "hello test";
}
}
// ProdConfiguration
@Profile("prod")
@Configuration
public class BaseConfiguration {
@Bean
public String hello() {
return "hello prod";
}
}
2개의 Configuration클래스를 만들고, hello
라는 빈을 등록했다. 각각 테스트용, 프로덕트용 으로 다른 결과를 return 한다.
@Component
public class Runner implements ApplicationRunner {
@Autowired
private String hello;
@Override
public void run(ApplicationArguments args) {
System.out.println(hello);
}
}
hello 빈을 주입받아 출력한다. 당연히 어떤 profile로 띄울지에 대한 설정이 없기 때문에 예외가 발생한다.
*************************
APPLICATION FAILED TO START
***************************
Description:
Field hello in com.example.demo.Runner required a bean of type 'java.lang.String' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'java.lang.String' in your configuration.
1.2. 프로파일 활성화
- application.properties의 propertiy값을 변경하는 방법
spring.profiles.active=prod
prod 환경으로 springBoot를 띄우면 hello prod
가 찍히고 test로 실행 시키면, hello test
가 콘솔창에 찍힌다.
hello prod
- 패키징을 하고난 jar 파일을 실행할 때 arg로 넘겨서 실행하는 방법
$ mvn clean package -DskipTests
$ java -jar target/*.jar --spring.profiles.active=prod
이 경우에 application.properties의 spring.profiles.active=test로 해놓고 패키징을 해도, [Java] jar를 통해서arg로 넘기는 경우 오버라이딩이 되서, prod 프로파일이 적용됨을 알 수 있다.
1.3. 프로파일용 프로퍼티를 분리하기
application-{stage}.properties 형식의 프로파일용 프로퍼티를 분리할 수 있다.
1.4. 프로파일 Include
# application.properties 파일
spring.profile.include = realdb
이런 식으로 작성하게 되면, application-realdb.properties 정보를 포함하는 application.properties 파일이 만들어 진다.
1.5. Best Practice 는 무엇?
- application-common.properties
- application-test.properties
- application-local.properties
- application-alpha.properties
- application-prod.properties
이런식으로 properties파일을 각 스테이징 별로 나누고, 공통으로 사용하는 app에 대한 정보나, 외부 라이브러리 연동하는 app-key같은 정보를 적용할 수 있다. 또한, 각 stage별로 common의 properties 파일을 includ하여서 공통인 정보를 포함하게 할 수 있다.
2. 정리
profile은 각 Stage환경에 따라 구성해야 하는 빈설정, 정보들이 상이하게 다른 경우에 적용할 수 있다. 각 스테이징환경에 맞는 Configuration파일을 구성, profile을 실행할 때는 spring.profiles.actives 옵션을 통해서 설정했다. 각 스테이징 별 정보들이 많을 때는 프로파일용 프로퍼티를 각각 만들어서 분리했다.
📚 Related Posts
- Spring WebFlux 테스트 방법
- Spring과 MongoDB 연동 실전 가이드
- SpringBoot, MongoDB 시작하기
- Spring Boot 서버 타임존 설정 방법
- SpringBoot CommandLineRunner, ApplicationRunner 초기화 방법
- Jackson, LocalDateTime Serialization, Deserialization 이슈
- Spring Boot, Dockerfile로 이미지 생성, 배포하기
- SpringBoot RabbitMQ 연동하기
- Junit5 정리
- Spring Sentry(에러 트래킹 서비스) 적용하기
- [Spring] 빈 주입하는 방법 && Best Practice
- Thymeleaf 실무에서 자주 사용하는 것들
- Thymeleaf Collection 정보 화면에 렌더링하기
- Spring, JPA를 이용한 REST API 만들기
- [Spring] MultipartFile을 이용한 파일 업로드
- [Spring] 모델 검증(validation)
- [Spring]HandlerMethodArgumentResolver 인터페이스
- [Spring] DispatcherServlet에 대해서 알아보자
- [Spring] MVC 만들어 보기
- [Spring] 메세지 컨버터
- [Spring] MVC 살펴보기
- [Spring] @ConfigurationProperties를 이용해서 properties값들을 클래스로 관리하기
- [Spring] Profile 설정하기
- [Spring] SpringApplication를 통한 코딩
- [Spring Boot] 스프링 부트 3가지 특징
- [Spring] @SpringBootAppllication 어노테이션에 대한 고찰
- [Spring] bean circular dependencies (빈 순환 참조)
- [Spring]Bean에 대해서 알아보자
- SpringBoot, JPA, H2를 이용한 간단한API 작성
- [Spring] Spring Data Common 프로젝트 살펴보기