본문 바로가기
GD's IT Lectures : 기초부터 시리즈/스프링부트(Spring Boot) 기초부터 ~

[스프링 부트(SpringBoot) : 중급] 스프링 부트 고급 구성

by GDNGY 2023. 5. 5.

1. 스프링 부트 고급 구성

1.1. 프로파일 사용

프로파일은 스프링 부트 애플리케이션에서 다양한 환경에서의 설정을 분리하는 데 사용됩니다. 예를 들어, 개발, 테스트, 프로덕션 환경의 설정을 별도로 관리할 수 있습니다. 프로파일을 사용하면 애플리케이션을 특정 환경에 쉽게 적용할 수 있습니다.

 

먼저, src/main/resources 디렉토리에 개발 환경용 프로파일 설정 파일을 생성합니다. application-dev.yml 파일을 생성하고 다음과 같이 작성합니다.

# application-dev.yml
server:
  port: 8080
spring:
  datasource:
    url: jdbc:h2:mem:devdb
    username: sa
    password:

 

프로덕션 환경용 프로파일 설정 파일 application-prod.yml을 생성하고 다음과 같이 작성합니다.

# application-prod.yml
server:
  port: 80
spring:
  datasource:
    url: jdbc:mysql://localhost/proddb
    username: produser
    password: prodpassword

 

애플리케이션을 실행할 때 다음과 같이 --spring.profiles.active=프로파일명 옵션을 사용하여 활성화할 수 있습니다.

java -jar your_app.jar --spring.profiles.active=dev

 

또한, 코드에서 @Profile 어노테이션을 사용하여 특정 프로파일에서만 빈을 생성하도록 설정할 수 있습니다.

@Configuration
public class ProfileConfig {

    @Bean
    @Profile("dev")
    public DevService devService() {
        return new DevService();
    }

    @Bean
    @Profile("prod")
    public ProdService prodService() {
        return new ProdService();
    }
}

 

1.2. 구성 파일 활용

스프링 부트에서는 여러 가지 구성 파일 형식을 지원합니다. 대표적으로 YAML과 properties 파일 형식이 있습니다. 또한, 구성 파일의 위치와 우선순위를 변경할 수도 있습니다.

 

예를 들어, 외부의 설정 파일을 사용하고 싶다면 다음과 같이 실행할 수 있습니다.

java -jar your_app.jar --spring.config.location=file:/path/to/your/config/

 

구성 파일의 우선 순위를 변경하려면 spring.config.import 속성을 사용하여 다른 구성 파일을 명시적으로 불러올 수 있습니다. 예를 들어, application.yml 파일에 다음과 같이 작성하면 custom.yml 파일이 먼저 적용됩니다.

spring:
  config:
    import: file:custom.yml

 

1.3. 조건부 구성

스프링 부트에서는 조건부 구성을 사용하여 특정 조건에 따라 빈을 등록하거나 구성을 변경할 수 있습니다. 예를 들어, 특정 라이브러리가 존재하거나 환경 변수가 설정된 경우에만 빈을 등록할 수 있습니다. 조건부 구성은 @Conditional 어노테이션과 함께 사용됩니다.

 

예를 들어, 다음과 같이 특정 프로파일이 활성화된 경우에만 빈을 등록할 수 있습니다.

@Configuration
public class ConditionalConfig {

    @Bean
    @ConditionalOnProperty(name = "custom.enabled", havingValue = "true")
    public CustomService customService() {
        return new CustomService();
    }
}

 

이렇게 구성을 작성하면, custom.enabled 속성이 true로 설정된 경우에만 CustomService 빈이 등록됩니다.

 

또한, 특정 빈이 존재하는 경우에만 다른 빈을 등록하도록 설정할 수 있습니다.

@Configuration
public class ConditionalBeanConfig {

    @Bean
    @ConditionalOnBean(DataSource.class)
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

 

위의 예제에서는 DataSource 빈이 존재하는 경우에만 JdbcTemplate 빈이 등록됩니다.

 

마지막으로, 특정 클래스가 존재하는 경우에만 빈을 등록하도록 설정할 수 있습니다.

@Configuration
public class ConditionalClassConfig {

    @Bean
    @ConditionalOnClass(name = "com.example.SomeClass")
    public SomeService someService() {
        return new SomeService();
    }
}

 

위의 예제에서는 com.example.SomeClass 클래스가 존재하는 경우에만 SomeService 빈이 등록됩니다.

 

조건부 구성을 활용하면 다양한 환경과 조건에 따라 스프링 부트 애플리케이션의 설정을 유연하게 관리할 수 있습니다.

 

1.4. 외부 구성

외부 구성을 사용하여 애플리케이션의 설정 값을 외부에서 주입할 수 있습니다. 이를 통해 애플리케이션의 설정을 유연하게 관리할 수 있습니다. 외부 구성에는 다음과 같은 방법들이 있습니다.

 

  • 환경 변수 : 시스템 환경 변수를 사용하여 설정 값을 주입할 수 있습니다.
  • Java 시스템 프로퍼티 : -Dproperty=value 형식으로 Java 시스템 프로퍼티를 사용하여 설정 값을 주입할 수 있습니다.
  • 명령행 인수 : --property=value 형식으로 명령행 인수를 사용하여 설정 값을 주입할 수 있습니다.

 

1.5. @ConfigurationProperties

@ConfigurationProperties 어노테이션을 사용하여 구성 파일의 설정 값을 묶어서 관리할 수 있습니다. 이를 통해 구성 속성을 하나의 클래스에서 관리하고, 타입 안전성을 보장할 수 있습니다.

 

예를 들어, 다음과 같은 구성 파일이 있다고 가정합니다.

app:
  name: MyApp
  description: A sample application
  version: 1.0.0

 

이 구성 파일의 속성을 다음과 같이 묶어서 관리할 수 있습니다.

@ConfigurationProperties(prefix = "app")
public class AppConfig {
    private String name;
    private String description;
    private String version;

    // getter and setter 생략
}

 

@ConfigurationProperties 어노테이션을 사용하면 구성 파일의 속성을 쉽게 관리할 수 있으며, 구성 속성의 변경이 발생하더라도 애플리케이션의 코드를 수정하지 않아도 됩니다.

 

1.6. @PropertySource

@PropertySource 어노테이션을 사용하여 다양한 형식의 외부 구성 파일을 로드할 수 있습니다. 예를 들어, 기본적으로 YAML 파일이 아닌 properties 파일을 로드하고 싶을 경우, 다음과 같이 @PropertySource를 사용할 수 있습니다.

@Configuration
@PropertySource("classpath:custom.properties")
public class CustomConfig {
    // ...
}

 

이를 통해 다양한 형식의 구성 파일을 사용하거나, 여러 구성 파일을 동시에 사용할 수 있습니다.

 

1.7. 애플리케이션 이벤트

스프링 부트에서는 애플리케이션 이벤트를 사용하여 구성 변경이 발생할 때, 애플리케이션의 동작을 동적으로 조절할 수 있습니다. 예를 들어, 구성 값이 변경되었을 때 알림을 받거나, 특정 기능을 활성화/비활성화할 수 있습니다.

 

애플리케이션 이벤트를 사용하려면, 먼저 이벤트 클래스를 정의하고, 이벤트 리스너를 작성해야 합니다.

public class ConfigurationChangedEvent {
    // 이벤트에 대한 정보
}

@Component
public class ConfigurationChangedListener implements ApplicationListener<ConfigurationChangedEvent> {
    @Override
    public void onApplicationEvent(ConfigurationChangedEvent event) {
        // 이벤트 발생 시 처리할 로직
    }
}

 

이를 통해 애플리케이션의 구성 변경에 대응하는 동적인 동작을 구현할 수 있습니다.

반응형

댓글