[Spring] @Profile로 활성 프로파일 지정하기
개발을 하다 보면 여러 개의 환경을 관리해야 한다. 예를 들어 테스트 코드를 위한 테스트 환경, 개발을 하고 테스트를 하기 위한 로컬 환경, 실제 서비스가 운영되는 배포 환경 등이 있다.
그렇기 때문에 각각의 환경들에 맞게 서로 다른 빈 또는 프로퍼티들을 정의해야 할 수도 있다.
예를 들어, 배포 환경에서는 S3Service가 필요하겠지만
개발이나 테스트 할 시에는 계속 S3에 업로드 되는 것이 비용적으로 부담이 될 수도 있고 매번 S3를 실행시키는 것이 불필요할 수도 있다.
이를 위해, Spring은 3.1부터 환경에 따라 서로 다르게 빈을 정의할 수 있도록 환경을 분리하는 기술을 제공하는데, 이것을 @Profile이라고 한다. Spring의 다중 Profile을 사용하면 환경을 바꿀 때마다 번거롭게 매번 설정을 수정할 일이 없이 손쉽게 환경에 맞게 변경할 수 있다.
(여기서 Bean이라는 것은 스프링 컨테이너에서 관리되는 어떤 클래스의 인스턴스라고 할 수 있다.)
Bean에 프로파일 지정하기
@Profile("prod")
@Service
@Transactional
@RequiredArgsConstructor
public class S3Service {
private final AmazonS3 s3Client;
...
}
예를 들어서 S3Service는 운영 환경(prod)에서만 사용하기를 원할 수 있다.
그럴 때 클래스 위에 @Profile 어노테이션을 붙이면, 해당 클래스가 원하는 환경에서만 활성화되도록 설정해줄 수 있다.
즉, spring.profiles.active=prod로 지정한 효과를 낼 수 있다. = application-prod.yml 파일이 로드된다.
위의 클래스는 @Profile이 prod로 설정되어 있기 때문에 현재의 프로파일(환경)이 prod일 경우에만 활성화된다.
만약 S3Service를 prod가 아닌 경우에만 사용하기를 원한다면 @Profile("!prod")라고 설정해주면 된다.
애플리케이션 실행 시 활성 프로파일 지정하기
스프링 애플리케이션을 실행할 때 실행 환경을(활성화할 프로파일) JVM 속성 설정으로 지정해줄 수 있다.
-Dspring.profiles.active=dev
- -Dspring.profiles.active=dev: 애플리케이션 실행할 때 프로파일을 지정하는 방식으로 전체 애플리케이션에 대한 프로파일을 설정.
- @Profile("dev"): 특정 빈이나 설정 클래스에 프로파일을 지정
일반적으로 -Dspring.profiles.active= 옵션을 사용하여 애플리케이션 전체의 프로파일을 설정하고, @Profile 어노테이션을 사용하여 특정 빈에 대해 프로파일을 적용한다.
@ActiveProfile로 테스트 수행 시 활성 프로파일 지정하기
@Test
@ActiveProfiles("local")
class ItemServiceTest {
...
}
만약 등록을 안 한 빈(프로필 설정을 하지 않은 빈)은 Default 프로필에 매핑된다.
스프링 부트에서 Profile 사용하기
application.yml에서 활성화할 프로필을 설정할 수 있다.
spring:
profiles:
active: mysql
사용 예시
스프링부트에서는 --- 로 한 파일에 나누어 설정해줄 수 있다.
변하지 않는 default 값을 맨 위에 설정해주고, 변환이 필요한 부분은 밑에 따로 나누어 설정해주었다.
#default
spring:
profiles:
active: h2
# JPA
jpa:
show-sql: true
properties:
hibernate:
format_sql: true
hibernate:
ddl-auto: create
# SQL auto Create allow - use - true, always, notUse - false, never
defer-datasource-initialization: false
---
# local
spring:
config:
activate:
on-profile: local
# H2 DB 설정
datasource:
url: jdbc:h2:tcp://localhost/~/make
driver-class-name: org.h2.Driver
username: root
batch:
jdbc:
initialize-schema: embedded
job:
enabled: true
---
# prod
spring:
config:
activate:
on-profile: prod
# RDS DB 설정
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/make?useSSL=false
username: root
password: 1234
job:
enabled: false