Spring profile 설정 본문
SpringBoot Profile의 필요성
프로젝트 개발을 진행하다보면, 개발환경과 실제 운영환경에서 환경설정이 달라질수 있다. 예를들어
application.properties 파일을 보자.
handlebars.suffix=.html
handlebars.cache=false
handlebars.expose-session-attributes=true
spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:mysql://localhost:3306/database
spring.datasource.username=dev
spring.datasource.password=1234
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
현재 datasource 설정을 보면 개발단를 진행중이라 개발환경에 맞게 설정되어있다. 하지만 이것을 실제 운영서버에 배포할때는 운영환경에 맞게 설정파일을 변경해줘야 한다. 뿐만아니라 logback.xml의 설정파일이나, 또는 기타 다른 환경설정을 변경해야 하는경우도 많다. 하지만 이것을 개발자가 직접 운영에 배포할때마다 수정한다면 실수를 할 가능성이 높다.
이것을 해결할 수 있는 방법이 스프링 Profile을 이용하면 간단히 처리할 수 있다. 스프링 Profile이란 간단히 개발,운영환경의 설정파일을 따로 관리하여 배포할때 환경에 맞는 설정 파일들을 적용할 수 있게 하는 방법이다.
개발, 운영환경 설정파일 분리
단계별로 간단히 application.properties, logback.xml, Configuration 클래스를 환경에 맞춰 변경하는 예제를 진행하겠다.
application.properties
일단 스프링부트의 설정파일 부터 분리를 진행한다. 여기서는 개발,운영환경에 따라 application-dev.properties, applcation-prod.properties 파일로 분리를 진행하겠다. 설정파일은 분리하여 classpath(resources 디렉토리) 밑에서 관리해야 한다.
세개의 설정파일이 있기 때문에 우선 설정파일 간에 적용의 우선순위에 대해서 알고 적용해야한다. 설정파일 우선순위는 profile로 지정(active 지정)한 설정파일이 먼저 적용되고, 마지막으로 application.properties가 마지막으로 적용된다.
예를들어 profile 설정(active)이 dev로 되어있다면, dev에 설정이 먼저 적용되고, 그다음 application.properties 파일이 적용된다. 만약 같은 설정내용이 있다면 profile로 설정된 설정내용이 우선적으로 적용된다.
application-dev.properties의 설정
spring.jpa.hibernate.ddl-auto=create-drop
application.properties의 설정
spring.jpa.hibernate.ddl-auto=validate
만약 profile 설정이 dev로 되어있다면 dev 설정파일이 적용되고 application.properties의 속성은 무시된다.
따라서 공통적으로 적용해야할 설정은 application.properties에 설정하고, 환경에 따라 변경되는 설정은 각 properties에 설정하면 공통적인 부분과 환경에 따라 변경되는 부분을 유용하게 사용할 수 있다.
따라서 아래와 같이 설정파일을 분리할 수 있다.
#application.properties
handlebars.suffix=.html
handlebars.cache=false
handlebars.expose-session-attributes=true
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
#배포시 profile active 설정이 없다면 default로 dev를 적용
spring.profiles.active=dev
#배포시 spring.profiles.active에 설정된 환경에따라 logback.xml 설정파일 적용.
logging.config=classpath:logback-${spring.profiles.active}.xml
#application-dev.properties
spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:mysql://localhost:3306/dev
spring.datasource.username=dev
spring.datasource.password=dev
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
#application-prod.properties
spring.jpa.hibernate.ddl-auto=validate
spring.datasource.url=jdbc:mysql://localhost:3306/prod
spring.datasource.username=prod
spring.datasource.password=prod
위에 부터 공통적인 설정, dev, prod에 따라 설정파일을 분리했다. 참고할 사항은 배포시 설정파일은 지정하는것은 spring.profile.active를 지정해주면 되는데 없을경우 위와같이 default 값을 지정할 수 있다. 또한 logback.xml도 profile에 따라 logback-dev,logback-prod를 자동으로 적용되도록 설정할 수 있다.
Configuration 설정 클래스 분리
스프링부트의 설정파일 뿐만아니라 스프링에서 빈으로 등록하는 Configuration도 설정파일을 분리할 수 있다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
[...]
@Bean
public BasicAuthInterceptor basicAuthInterceptor() {
return new BasicAuthInterceptor();
}
@Bean
public AdminInterceptor adminInterceptor() {
return new AdminInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(adminInterceptor()).addPathPatterns("/admin/**").order(1);
registry.addInterceptor(basicAuthInterceptor()).order(0);
}
}
위와같은 Configuration 클래스가 있을때 BasicAuthInterceptor는 개발환경에서만 사용된다. 하지만 이렇게 운영서버에 배포될 경우 불필요한 빈이 생성될 뿐만아니라 로직수행시 원하지 않는 결과가 발생할 수 있다.
Configuration 클래스에서는 @Profile 애노테이션을 이용하여 설정파일을 분리할 수 있다.
@Configuration
@Profile(value = "dev")
public class WebConfig implements WebMvcConfigurer {
[...]
@Bean
public AdminInterceptor adminInterceptor() {
return new AdminInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(adminInterceptor()).addPathPatterns("/admin/**").order(1);
}
@Configuration
public class TestConfiguration extends WebConfig {
@Bean
public BasicAuthInterceptor basicAuthInterceptor() {
return new BasicAuthInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
super.addInterceptors(registry);
registry.addInterceptor(basicAuthInterceptor()).order(0);
}
}
}
이떄 주의할점은 application-{profile}.properties로 만든 값만 지정할 수 있다. 즉 dev,prod만 지정 가능하다. @Configuration 클래스도 마찬가지로 active된 profile이 먼저 적용되고 그후 공통적인 @Configuration 클래스 설정이 적용된다.
프로파일 적용
profile에 따라 설정파일 및 클래스를 분리했으니 이제 적용방법에 대해 알아보자.
Testcase에 Profile 적용
우선 배포전에 Testcase도 profile에 따라 잘 동작하는지 확인해야한다. Testcase는 Test클래스에 @ActiveProfie 애노테이션으로 profile을 지정하면 된다.
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles(value = "dev")
public abstract class AcceptanceTest {
배포시 Profile 적용
일단 스프링 부트 프로젝트를 빌드를하고 jar파일로 배포를 진행하겠다. 프로젝트 디렉터리로 이동해서 아래의 명령어를 입력하면 된다.
./gradlew clean build
이 명령어를 실행하면 Testcase를 진행하고 전체가 성공하면 빌드를 진행한다. 그 후 build/libs 아라애 jar파일이 생성된다.
그 후 아래의 명령어를 실행하면 profile 지정 및 서버를 기동시킬 수 있다.
java -jar -Dspring.profile.active=prod 생성된파일.jar
- D 옵션을 이용하여 active 뿐만 아니라 application.properties에서 제공하는 모든 설정파일을 서버 기동시 설정을 변경할 수 있다. application.properties의 설정은 아래 사이트에서 참고하면된다.
https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
'개발 > Spring' 카테고리의 다른 글
Spring JPA 관련 어노테이션 정리 (0) | 2021.08.12 |
---|---|
스프링 어노테이션 정리 (0) | 2021.08.12 |
OAuth 2.0 파라미터 정리 (0) | 2021.08.06 |
OAuth 2.0 개념 정리 (0) | 2021.08.06 |
Spring Security 구조 (0) | 2021.08.06 |