Using @Value(한글)

@Value 는 일반적으로 외부화된 프로퍼티를 주입하는 데 사용됩니다:

  • Java

  • Kotlin

@Component
public class MovieRecommender {

    private final String catalog;

    public MovieRecommender(@Value("${catalog.name}") String catalog) {
        this.catalog = catalog;
    }
}
@Component
class MovieRecommender(@Value("\${catalog.name}") private val catalog: String)

다음 구성을 사용합니다:

  • Java

  • Kotlin

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

And the following application.properties file:

catalog.name=MovieCatalog

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

Spring에서는 기본적으로 관대한 임베디드 값 리졸버를 제공합니다. 속성 값을 확인하려고 시도하고 확인할 수 없는 경우 속성 이름(예: ${catalog.name})이 값으로 주입됩니다. 존재하지 않는 값에 대한 엄격한 제어를 유지하려면 다음 예제에서와 같이 PropertySourcesPlaceholderConfigurer Bean을 선언해야 합니다:

  • Java

  • Kotlin

@Configuration
public class AppConfig {

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

	@Bean
	fun propertyPlaceholderConfigurer() = PropertySourcesPlaceholderConfigurer()
}
JavaConfig를 사용하여 PropertySourcesPlaceholderConfigurer 를 구성하는 경우, @Bean 메서드는 static 이어야 합니다.

위의 구성을 사용하면 ${} 플레이스홀더를 확인할 수 없는 경우 Spring 초기화에 실패할 수 있습니다. 또한 setPlaceholderPrefix, setPlaceholderSuffix, setValueSeparator 또는 setEscapeCharacter 와 같은 메서드를 사용하여 자리 표시자를 사용자 지정할 수 있습니다.

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

Spring에서 제공하는 내장된 변환기 지원을 통해 간단한 유형 변환(예: Integer 또는 int 로)을 자동으로 처리할 수 있습니다. 쉼표로 구분된 여러 개의 값을 별도의 작업 없이 String 배열로 자동 변환할 수 있습니다.

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

  • Java

  • Kotlin

@Component
public class MovieRecommender {

    private final String catalog;

    public MovieRecommender(@Value("${catalog.name:defaultCatalog}") String catalog) {
        this.catalog = catalog;
    }
}
@Component
class MovieRecommender(@Value("\${catalog.name:defaultCatalog}") private val catalog: String)

Spring BeanPostProcessor@ValueString 값을 대상 유형으로 변환하는 프로세스를 처리하기 위해 백그라운드에서 ConversionService 를 사용합니다. 사용자 정의 유형에 대한 변환 지원을 제공하려는 경우 다음 예제와 같이 자체 ConversionService Bean 인스턴스를 제공할 수 있습니다:

  • Java

  • Kotlin

@Configuration
public class AppConfig {

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

	@Bean
	fun conversionService(): ConversionService {
		return DefaultFormattingConversionService().apply {
			addConverter(MyCustomConverter())
		}
	}
}

'@Value’에 SpEL이 포함되어 있으면 다음 예제에서 보는 것처럼 런타임에 값이 동적으로 계산됩니다:

  • Java

  • Kotlin

@Component
public class MovieRecommender {

    private final String catalog;

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

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

  • Java

  • Kotlin

@Component
public class MovieRecommender {

    private final Map<String, Integer> countOfMoviesPerCatalog;

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