본문 바로가기
spring

[SpringBoot] Spring Profile과 환경별 resource 설정

by moonsiri 2024. 11. 4.
728x90
반응형

애플리케이션을 개발하면서 여러 환경(예: local, dev, staging, production)에 맞춘 구성을 제공하는 일은 매우 중요합니다.
과거에는 Maven의 profile 기능을 사용해 환경별 빌드를 관리하는 방식이 널리 사용되었습니다. 하지만 Spring Boot는 자체적으로 프로파일(profile)과 설정 라이프사이클을 제공하여, Maven 의존성 없이도 환경별 속성을 손쉽게 관리할 수 있습니다.


Spring Profiles와 설정 파일 구성


Spring Boot에서는 application.yml 파일을 기본으로 사용하고, 각 환경에 맞춘 설정 파일을 application-{profile}.yml 형태로 추가하여 관리할 수 있습니다.
예를 들어, application-local.yml, application-dev.yml 등 환경별 설정 파일을 만들고, 실행 시 활성화할 프로파일을 지정하면 됩니다.

application.yml

spring:
  profiles:
    active: dev # 기본적으로 dev 프로파일 활성화


application-local.yml

server:
  port: 8080


application-dev.yml

server:
  port: 8081



이처럼 프로파일을 사용하면, 특정 환경에 맞춘 속성 파일이 로드됩니다. Spring Boot는 애플리케이션 구동 시 application.yml을 먼저 읽고, 이후 프로파일을 기반으로 해당 환경의 설정 파일을 병합합니다.


환경별 설정 파일 관리

Spring Boot 2.4 이후부터는 spring.config.import 옵션을 사용해 외부 구성 파일을 가져올 수 있습니다.
특히, 특정 프로파일이 활성화될 때만 설정 파일을 로드하기 위해 spring.config.activate.on-profile 속성을 추가할 수 있습니다.

application.yml

spring:
  profiles:
    active: local


application-local.yml

spring:
  config:
    import:
      - "classpath:properties/local/common.properties"


기본적으로 Spring Boot는 application-{profile}.yml 파일을 자동으로 로드하는 방식은 유지하고, spring.config.activate.on-profile 을 통해 하나의 application.yml 파일 안에서도 여러 환경별 설정을 쉽게 관리할 수 있게 되었습니다.

1. 자동 로드 (application-{profile}.yml):
Spring Boot는 여전히 application-{profile}.yml 파일을 자동으로 로드합니다.
예를 들어 spring.profiles.active=dev가 설정되어 있으면 application-dev.yml 파일이 자동으로 로드됩니다.

2. on-profile 사용:
application.yml 하나의 파일 내에 on-profile을 설정하면, 별도로 파일을 분리하지 않고도 프로파일별 설정을 적용할 수 있습니다. 이 방식은 application.yml 내에서 조건부로 설정을 적용하므로, 별도의 파일(application-{profile}.yml)을 만들 필요가 없습니다.
예를 들어, application.yml에 다음과 같이 on-profile을 사용하면:

# application.yml
spring:
  profiles:
    active: dev  # 활성화할 프로파일 설정
---
spring:
  config:
    activate:
      on-profile: dev
  datasource:
    url: jdbc:mysql://localhost/devdb
---
spring:
  config:
    activate:
      on-profile: prod
  datasource:
    url: jdbc:mysql://localhost/proddb


위 설정에서 spring.profiles.active=dev일 경우, on-profile: dev 블록의 설정이 적용됩니다. 이렇게 하면 별도의 application-dev.yml 없이도 환경별 설정을 할 수 있습니다.


@ActiveProfiles 어노테이션

@ActiveProfiles는 Spring 테스트 코드에서 특정 프로파일을 활성화하기 위해 사용되는 어노테이션입니다. 이 어노테이션을 사용하면 테스트 실행 시 지정된 프로파일이 활성화되어 해당 프로파일의 설정을 로드하고 실행합니다.

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;

@SpringBootTest
@ActiveProfiles("test") // "test" 프로파일을 활성화
public class MyServiceTest {

    @Test
    public void testServiceFunctionality() {
        // 테스트 코드
    }
}


@ActiveProfiles는 애플리케이션의 실행 시점 설정, Maven 프로파일은 mvn clean package -P dev처럼 명령어로 활성화된 Maven프로파일에 따라 빌드 시점 설정을 위해 사용됩니다.



요약


Spring Boot의 프로파일과 설정 파일 관리 기능을 활용하면 Maven profile 구성을 최소화할 수 있습니다.
Maven은 빌드 툴로서 소스 코드 컴파일과 패키징을 중심으로 관리하고, 환경별 설정은 Spring Boot의 프로파일로 관리하는 방식입니다.
이를 통해 빌드 도구에 대한 의존성을 줄이고, 개발과 배포의 일관성을 유지할 수 있습니다.


[Reference]
https://docs.spring.io/spring-boot/reference/features/profiles.html#features.profiles
https://spring.io/blog/2020/08/14/config-file-processing-in-spring-boot-2-4#profile-specific-documents

728x90
반응형

댓글