Loading...
Spring Framework Reference Documentation 7.0.2의 Using @Value의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
@Value@Value는 일반적으로 외부화된 프로퍼티를 주입하는 데 사용됩니다:
1@Component 2public class MovieRecommender { 3 4 private final String catalog; 5 6 public MovieRecommender(@Value("${catalog.name}") String catalog) { 7 this.catalog = catalog; 8 } 9}
1@Component 2class MovieRecommender(@Value("${catalog.name}") private val catalog: String)
다음과 같은 설정과 함께:
1@Configuration 2@PropertySource("classpath:application.properties") 3public class AppConfig { }
1@Configuration 2@PropertySource("classpath:application.properties") 3class AppConfig
그리고 다음과 같은 application.properties 파일:
1catalog.name=MovieCatalog
이 경우, catalog 매개변수와 필드는 MovieCatalog 값과 같게 됩니다.
Spring에 의해 기본적인 관대한 임베디드 값 리졸버가 제공됩니다. 이것은
프로퍼티 값을 해결하려고 시도하고, 만약 해결할 수 없다면 프로퍼티 이름(예를 들어 ${catalog.name})
이 값으로 주입됩니다.
존재하지 않는 값에 대해 엄격한 제어를 유지하고 싶다면,
다음 예제에서 보여주는 것처럼 PropertySourcesPlaceholderConfigurer 빈을 선언해야 합니다:
1@Configuration 2public class AppConfig { 3 4 @Bean 5 public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() { 6 return new PropertySourcesPlaceholderConfigurer(); 7 } 8}
1@Configuration 2class AppConfig { 3 4 @Bean 5 fun propertyPlaceholderConfigurer() = PropertySourcesPlaceholderConfigurer() 6}
JavaConfig를 사용하여
PropertySourcesPlaceholderConfigurer를 구성할 때,<br>@Bean메서드는static이어야 합니다.
위의 설정을 사용하면 어떤 ${} 플레이스홀더라도 해결될 수 없는 경우 Spring 초기화가 실패하도록 보장합니다. 또한
setPlaceholderPrefix(), setPlaceholderSuffix(), setValueSeparator(), 또는
setEscapeCharacter()와 같은 메서드를 사용하여 플레이스홀더 구문을 사용자 정의할 수 있습니다.
추가로,
기본 이스케이프 문자(escape character)는 JVM 시스템 프로퍼티(또는
SpringProperties 메커니즘)를 통해
spring.placeholder.escapeCharacter.default 프로퍼티를 설정함으로써 전역적으로 변경하거나 비활성화할 수 있습니다.
Spring Boot는 기본적으로
application.properties와application.yml파일에서<br>프로퍼티를 가져오는PropertySourcesPlaceholderConfigurer빈을 구성합니다.
Spring이 제공하는 기본 제공 컨버터 지원은 간단한 타입 변환(예를 들어 Integer
또는 int로)을 자동으로 처리할 수 있게 해줍니다. 여러 개의 쉼표로 구분된 값은
추가적인 노력 없이 자동으로 String 배열로 변환될 수 있습니다.
다음과 같이 기본값을 제공하는 것이 가능합니다:
1@Component 2public class MovieRecommender { 3 4 private final String catalog; 5 6 public MovieRecommender(@Value("${catalog.name:defaultCatalog}") String catalog) { 7 this.catalog = catalog; 8 } 9}
1@Component 2class MovieRecommender(@Value("${catalog.name:defaultCatalog}") private val catalog: String)
Spring BeanPostProcessor는 내부적으로 ConversionService를 사용하여
@Value의 String 값을 대상 타입으로 변환하는 프로세스를 처리합니다. 자신만의
커스텀 타입에 대한 변환 지원을 제공하고 싶다면, 다음 예제에서 보여주는 것처럼
자신만의 ConversionService 빈 인스턴스를 제공할 수 있습니다:
1@Configuration 2public class AppConfig { 3 4 @Bean 5 public ConversionService conversionService() { 6 DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(); 7 conversionService.addConverter(new MyCustomConverter()); 8 return conversionService; 9 } 10}
1@Configuration 2class AppConfig { 3 4 @Bean 5 fun conversionService(): ConversionService { 6 return DefaultFormattingConversionService().apply { 7 addConverter(MyCustomConverter()) 8 } 9 } 10}
@Value가 SpEL 표현식을 포함할 때, 다음 예제에서 보여주는 것처럼
값은 런타임에 동적으로 계산됩니다:
1@Component 2public class MovieRecommender { 3 4 private final String catalog; 5 6 public MovieRecommender(@Value("#{systemProperties['user.catalog'] + 'Catalog' }") String catalog) { 7 this.catalog = catalog; 8 } 9}
1@Component 2class MovieRecommender( 3 @Value("#{systemProperties['user.catalog'] + 'Catalog' }") private val catalog: String)
SpEL은 또한 더 복잡한 데이터 구조의 사용을 가능하게 합니다:
1@Component 2public class MovieRecommender { 3 4 private final Map<String, Integer> countOfMoviesPerCatalog; 5 6 public MovieRecommender( 7 @Value("#{{'Thriller': 100, 'Comedy': 300}}") Map<String, Integer> countOfMoviesPerCatalog) { 8 this.countOfMoviesPerCatalog = countOfMoviesPerCatalog; 9 } 10}
1@Component 2class MovieRecommender( 3 @Value("#{{'Thriller': 100, 'Comedy': 300}}") private val countOfMoviesPerCatalog: Map<String, Int>)
Injection with @Resource
Using @PostConstruct and @PreDestroy