스프링 환경별 빈 설정

환경별 빈 설정 개요

소프트웨어 개발 과정에서 애플리케이션을 한 환경에서 다른 환경으로 이전하는 것은 큰 과제입니다. 특정 빈들은 다른 환경에서 다른 구성이 필요하며, 이를 환경별 빈이라고 합니다. 데이터베이스 설정, 암호화 알고리즘, 외부 시스템 통합 등은 환경 간 배포 시 변경될 수 있는 요소들입니다.

이 문제를 해결하기 위해 각 환경별로 별도의 구성 클래스(XML 파일)를 만들고 빌드 단계에서 어떤 구성을 사용할지 결정할 수 있습니다. 하지만 이 방법은 각 환경별로 애플리케이션을 재빌드해야 하며, 이는 새로운 버그를 도입할 수 있습니다.

스프링은 환경별 빈을 위한 해결책으로, 실행 시점에 어떤 빈을 생성할지 결정하는 방식을 제공합니다. 이렇게 하면 동일한 배포 단위(예: WAR 파일)가 모든 환경에서 사용 가능하며 재빌드가 필요 없습니다.

JavaConfig를 이용한 프로파일 빈 설정

프로파일 빈을 설정하는 방법은 다음과 같습니다:

  1. 각 환경별로 별도의 구성 클래스를 생성하고 클래스 수준에서 @Profile 애노테이션 사용
  2. 메서드 수준에서 @Profile 애노테이션 사용
  3. 각 환경별 프로파일 XML 파일 생성 및 profile 속성 사용
  4. XML 구성 파일 내 bean 정의에 profile 속성 사용

JavaConfig에서 @Profile 애노테이션은 클래스 수준 또는 메서드 수준에서 사용할 수 있습니다. 클래스 수준에서 사용하면 해당 클래스의 모든 빈은 특정 프로파일이 활성화된 경우에만 생성됩니다. 스프링 3.2부터는 메서드 수준에서도 사용이 가능합니다.

다음 예제에서는 두 개의 DatabaseConnection 빈을 정의합니다. 둘 다 동일한 타입과 ID를 가지지만, 실행 시점에 활성화된 프로파일에 따라 하나만 생성됩니다.

public class DatabaseConnection {
    // 데이터베이스 연결 구현
}

개발 환경용 클래스 수준 @Profile 설정:

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

@Configuration
@Profile("development")
public class DevelopmentConfig {
    @Bean
    public DatabaseConnection devDatabaseConnection() {
        System.out.println("개발 환경 데이터베이스 연결 생성");
        return new DatabaseConnection();
    }
}

프로덕션 환경용 클래스 수준 @Profile 설정:

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

@Configuration
@Profile("production")
public class ProductionConfig {
    @Bean
    public DatabaseConnection prodDatabaseConnection() {
        System.out.println("프로덕션 환경 데이터베이스 연결 생성");
        return new DatabaseConnection();
    }
}

동일한 구성 클래스 내 메서드 수준 @Profile 설정:

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

@Configuration
public class DatabaseConfig {

    @Bean
    @Profile("development")
    public DatabaseConnection devDatabaseConnection() {
        System.out.println("개발 환용 메서드 레벨 데이터베이스 연결");
        return new DatabaseConnection();
    }
    
    @Bean
    @Profile("production")
    public DatabaseConnection prodDatabaseConnection() {
        System.out.println("프로덕션 환용 메서드 레벨 데이터베이스 연결");
        return new DatabaseConnection();
    }
}

프로파일 활성화

스프링은 어떤 프로파일이 활성화되었는지 결정하기 위해 두 개의 독립적인 속성을 사용합니다: spring.profiles.active와 spring.profiles.default.

spring.profiles.active 속성이 설정된 경우, 해당 값이 활성화된 프로파일로 사용됩니다. spring.profiles.active가 설정되지 않은 경우, spring.profiles.default의 값이 사용됩니다. 두 속성 모두 설정되지 않은 경우, 프로파일이 활성화되지 않으며 프로파일에 정의되지 않은 빈만 생성됩니다.

이 두 속성을 설정하는 방법은 다양합니다:

  • DispatcherServlet의 초기 매개변수로
  • 웹 애플리케이션의 컨텍스트 매개변수로
  • JNDI 항목으로
  • 환경 변수로
  • JVM 시스템 속성으로
  • 통합 테스트 클래스에서 @ActiveProfiles 애노테이션으로

테스트 예제 다음은 JavaConfig로 설정된 환경별 빈을 테스트하는 예제입니다:

import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@Configuration
@ActiveProfiles("development")
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { DevelopmentConfig.class, ProductionConfig.class })
public class DatabaseConnectionTest {

    @Autowired
    private DatabaseConnection databaseConnection;

    @org.junit.Test
    public void testDatabaseConnection() {         
        System.out.println("데이터베이스 연결 테스트");
    }
}

태그: 스프링 빈설정 프로파일

5월 23일 23:11에 게시됨