@Profile

코딩냥이·2024년 9월 10일

Annotation

목록 보기
14/34

@Profile

@Profile 어노테이션은 스프링 프레임워크에서 특정 프로파일이 활성화되었을 때만 빈을 등록하거나 구성을 적용하도록 하는 기능을 제공합니다.

기능

  • 특정 환경(개발, 테스트, 운영 등)에 따라 다른 빈이나 구성을 활성화할 수 있습니다.
  • 클래스 레벨 또는 메소드 레벨에 적용할 수 있습니다.
  • 여러 프로파일을 동시에 지정할 수 있습니다.

사용 방법

import org.springframework.context.annotation.Profile;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DatabaseConfig {

    @Bean
    @Profile("development")
    public DataSource devDataSource() {
        // 개발 환경용 데이터소스 설정
    }

    @Bean
    @Profile("production")
    public DataSource prodDataSource() {
        // 운영 환경용 데이터소스 설정
    }
}

주요 특징

  1. 환경별 구성: 개발, 테스트, 운영 등 다양한 환경에 따라 다른 설정을 적용할 수 있습니다.
  2. 유연한 적용: 클래스나 메소드 레벨에 적용할 수 있어 세밀한 제어가 가능합니다.
  3. 조건부 빈 등록: 특정 프로파일이 활성화된 경우에만 빈을 등록할 수 있습니다.
  4. 다중 프로파일 지원: 하나의 @Profile 어노테이션에 여러 프로파일을 지정할 수 있습니다.

다양한 사용 예제

1. 클래스 레벨 적용

@Configuration
@Profile("production")
public class ProductionConfig {
    // 운영 환경 전용 설정
}

2. 메소드 레벨 적용

@Configuration
public class AppConfig {

    @Bean
    @Profile("development")
    public EmailService devEmailService() {
        return new MockEmailService();
    }

    @Bean
    @Profile("production")
    public EmailService prodEmailService() {
        return new SmtpEmailService();
    }
}

3. 다중 프로파일 지정

@Configuration
@Profile({"development", "testing"})
public class DevTestConfig {
    // 개발 및 테스트 환경에서 사용될 설정
}

4. 프로파일 부정 표현

@Bean
@Profile("!production")
public DataSource devDataSource() {
    // production 프로파일이 아닐 때 사용될 데이터소스
}

프로파일 활성화 방법

  1. 애플리케이션 속성 파일 사용:
    application.properties 또는 application.yml에 다음과 같이 설정:

    spring.profiles.active=development
  2. 환경 변수 사용:

    export SPRING_PROFILES_ACTIVE=production
  3. JVM 시스템 프로퍼티 사용:

    java -Dspring.profiles.active=production -jar myapp.jar
  4. 프로그래밍 방식:

    SpringApplication.setAdditionalProfiles("production");

@Profile vs @Conditional

@Profile@Conditional의 특별한 케이스입니다. @Conditional을 사용하면 더 복잡한 조건을 지정할 수 있습니다:

@Configuration
@Conditional(ProductionCondition.class)
public class ProductionConfig {
    // ProductionCondition 클래스에 정의된 조건이 충족될 때 적용되는 설정
}

프로파일 그룹

스프링 부트 2.4부터는 프로파일 그룹을 정의할 수 있습니다:

spring.profiles.group.production=prod,metrics,actuator

이제 production 프로파일을 활성화하면 prod, metrics, actuator 프로파일도 함께 활성화됩니다.

테스트에서의 사용

테스트 클래스나 메소드에 @Profile을 적용하여 특정 프로파일에서만 테스트를 실행할 수 있습니다:

@SpringBootTest
@ActiveProfiles("test")
class MyServiceTest {

    @Test
    @Profile("development")
    void testDevFeature() {
        // 개발 환경 전용 기능 테스트
    }
}

주의사항

  1. 기본 프로파일: 별도의 프로파일을 지정하지 않으면 default 프로파일이 사용됩니다.
  2. 프로파일 우선순위: 여러 프로파일이 활성화된 경우, 마지막에 정의된 빈이 우선합니다.
  3. 프로파일 이름 중복: 프로파일 이름이 중복되지 않도록 주의해야 합니다.

베스트 프랙티스

  1. 의미 있는 이름 사용: 프로파일 이름은 그 목적이나 환경을 명확히 나타내야 합니다.
  2. 공통 설정 분리: 모든 환경에서 공통으로 사용되는 설정은 별도로 관리하세요.
  3. 보안 고려: 민감한 정보(예: 비밀번호)는 환경 변수나 외부 설정 관리 도구를 사용하세요.
  4. 문서화: 각 프로파일의 용도와 포함된 설정을 문서화하세요.
  5. 테스트 커버리지: 각 프로파일별 설정이 올바르게 작동하는지 테스트하세요.

결론

@Profile 어노테이션은 스프링 애플리케이션의 환경별 구성을 관리하는 강력한 도구입니다. 이를 통해 개발, 테스트, 스테이징, 운영 등 다양한 환경에 맞는 설정을 쉽게 관리하고 전환할 수 있습니다. 적절히 사용하면 애플리케이션의 유연성과 관리 용이성을 크게 향상시킬 수 있습니다.

연관 포스팅

@Configuration
@Conditional
@ConfigurationProperties
@ActiveProfiles
@Value

profile
HelloMeow~!

0개의 댓글