Using @Value

Dev.Hammy·2024년 3월 4일
0

@Value는 일반적으로 외부화(externalized)된 속성(property)을 주입하는 데 사용됩니다.

@Component
public class MovieRecommender {

    private final String catalog;

    public MovieRecommender(@Value("${catalog.name}") String catalog) {
        this.catalog = catalog;
    }
}

다음 구성을 사용합니다

@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig { }

그리고 다음 application.properties 파일과 함께요:

catalog.name=MovieCatalog

이 경우 catalog 매개변수와 필드는 MovieCatalog 값과 동일(equal)합니다.

기본 관대한(lenient) 내장 값 resolver는 Spring에서 제공됩니다. 속성(property) 값을 확인하려고 시도하며, 확인할 수 없는 경우 속성 이름(예: ${catalog.name})이 값으로 삽입됩니다. 존재하지 않는 값에 대해 엄격한 제어를 유지하려면 다음 예제와 같이 PropertySourcesPlaceholderConfigurer 빈을 선언해야 합니다.

@Configuration
public class AppConfig {

	@Bean
	public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
		return new PropertySourcesPlaceholderConfigurer();
	}
}

[Note]
JavaConfig를 사용하여 PropertySourcesPlaceholderConfigurer를 구성할 때 @Bean 메서드는 static이어야 합니다.

위 구성을 사용하면 ${} 자리 표시자를 resolve 할 수 없는 경우 Spring 초기화가 실패합니다. setPlaceholderPrefix, setPlaceholderSuffix 또는 setValueSeparator와 같은 메소드를 사용하여 자리 표시자를 사용자 정의하는 것도 가능합니다.

[Note]
Spring Boot는 기본적으로 application.propertiesapplication.yml 파일에서 속성을 가져오는 PropertySourcesPlaceholderConfigurer 빈을 구성합니다.

Spring이 제공하는 내장 변환기(converter) 지원을 통해 간단한 타입 변환(예: Integer 또는 int로)을 자동으로 처리할 수 있습니다. 여러 개의 쉼표로 구분된 값을 추가 노력 없이 자동으로 String 배열로 변환할 수 있습니다.

다음과 같이 기본값을 제공할 수 있습니다.

@Component
public class MovieRecommender {

    private final String catalog;

    public MovieRecommender(@Value("${catalog.name:defaultCatalog}") String catalog) {
        this.catalog = catalog;
    }
}

Spring BeanPostProcessor는 배후에서 ConversionService를 사용하여 @ValueString 값을 대상 타입으로 변환하는 프로세스를 처리합니다. 고유한 사용자 정의 타입에 대한 변환 지원을 제공하려는 경우 다음 예제와 같이 고유한 ConversionService Bean 인스턴스를 제공할 수 있습니다.

@Configuration
public class AppConfig {

    @Bean
    public ConversionService conversionService() {
        DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
        conversionService.addConverter(new MyCustomConverter());
        return conversionService;
    }
}

@ValueSpEL 표현식이 포함된 경우 값은 다음 예제와 같이 런타임 시 동적으로 계산됩니다.

@Component
public class MovieRecommender {

    private final String catalog;

    public MovieRecommender(@Value("#{systemProperties['user.catalog'] + 'Catalog' }") String catalog) {
        this.catalog = catalog;
    }
}

SpEL을 사용하면 더욱 복잡한 데이터 구조도 사용할 수 있습니다.

@Component
public class MovieRecommender {

    private final Map<String, Integer> countOfMoviesPerCatalog;

    public MovieRecommender(
            @Value("#{{'Thriller': 100, 'Comedy': 300}}") Map<String, Integer> countOfMoviesPerCatalog) {
        this.countOfMoviesPerCatalog = countOfMoviesPerCatalog;
    }
}

0개의 댓글