Spring Boot에서는 설정값을 동적으로 변경하고, 환경(프로필)에 따라 다르게 Bean을 등록하는 방법이 여러가지 있다.
application.yml 설정 파일, @ConditionalOnProperty, @Profile, @Value 이 네 가지를 활용하여 환경별로 설정을 관리하는 방법을 알아보자!
discodeit:
repository:
type: file # 사용할 Repository 유형 (file | jcf)
file-directory: "${user.dir}/discodeit/data" # 파일이 저장될 경로
# user.dir을 해줘야 루트 디렉토리에 절대경로처럼 들어가서 안전함
@Repository
@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "file")
public class FileBinaryContentRepository implements BinaryContentRepository {
// 파일 기반 Repository 구현
}
@Repository
@ConditionalOnProperty(name = "discodeit.repository.type", havingValue = "jcf", matchIfMissing = true)
public class JCFBinaryContentRepository implements BinaryContentRepository {
// JCF 기반 Repository 구현
}
@Repository
@Profile("file") //"file" 프로필이 활성화된 경우만 등록됨
public class FileBinaryContentRepository implements BinaryContentRepository {
// 파일 기반 Repository 구현
}
@Repository
@Profile("jcf") //"jcf" 프로필이 활성화된 경우만 등록됨
public class JCFBinaryContentRepository implements BinaryContentRepository {
// JCF 기반 Repository 구현
}
spring:
profiles:
active: file
# [공통 설정]
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 10
---
# [개발 환경 설정 - JCF 사용]
spring:
profiles: dev
datasource:
url: jdbc:mysql://dev-db.local:3306/devdb
username: devuser
password: devpass
discodeit:
repository:
type: jcf # 개발 환경에서는 JCF 사용
---
# [운영 환경 설정 - File 사용]
spring:
profiles: prod
datasource:
url: jdbc:mysql://prod-db.local:3306/proddb
username: produser
password: prodpass
discodeit:
repository:
type: file # 운영 환경에서는 File 사용
file-directory: /var/app/files
public class FileBinaryContentRepository {
private final Path directory;
public FileBinaryContentRepository(@Value("${discodeit.repository.file-directory}") String fileDir) {
this.directory = Paths.get(System.getProperty("user.dir"), fileDir, "binarycontents");
}
}