Home @Value와 Environment
Post
Cancel

@Value와 Environment

application.yml에 데이터를 가져오는 방법을 @Value만 사용했었는데, Environment도 있다는 것을 알게되어 정리해본다.

@Value와 Environment

 @ValueEnvironment
장점간단하게 필요한 값 주입 가능복잡한 설정 다룸
여러 속성 그룹화 및 특정 프로퍼티 소스 접근 가능
빈으로 바인딩하여 사용 가능
단점여러 값 또는 비슷한 설정이 많을 때 코드 복잡성 증가코드가 조금 더 길어질 수 있음
@Value보다 설정이 더 번거로울 수 있음


1
2
3
4
5
6
7
8
spring:
  kafka:
    bootstrap-servers: localhost:9092
    producer:
      retries: 0
      batch-size: 4096
      linger-ms: 1
      buffer-memory: 40960

위의 application.yml 파일에서 @ValueEnvironment는 어떻게 값을 받아보는지 살펴보자.

@Value의 사용 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Configuration
@RequiredArgsConstructor
@Slf4j(topic = "KafkaProducerConfiguration 실행")
public class KafkaProducerConfiguration {

    @Value("${spring.kafka.bootstrap-servers}")
    private String bootstrapServers;

    @Value("${spring.kafka.producer.retries}")
    private int retries;

    @Value("${spring.kafka.producer.batch-size}")
    private int batchSize;

    public Map<String, Object> producerConfig() {
        Map<String, Object> props = new HashMap<>();
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
        props.put(ProducerConfig.RETRIES_CONFIG, retries);
        props.put(ProducerConfig.BATCH_SIZE_CONFIG, batchSize);
        return props;
    }
}

위와 같이 @Valueapplication.yml파일에서 가져올 경로를 작성하면 작성된 값을 반환받을 것이다.

Environment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
@Configuration
@RequiredArgsConstructor
@Slf4j(topic = "KafkaProducerConfiguration 실행")
public class KafkaProducerConfiguration {

    private final Environment env;

    public Map<String, Object> producerConfig() {
        Map<String, Object> props = new HashMap<>();

        // server host 지정
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
                env.getProperty("spring.kafka.bootstrap-servers"));

        // retries 횟수
        props.put(ProducerConfig.RETRIES_CONFIG,
                env.getProperty("spring.kafka.producer.retries"));

        // batch size 설정
        props.put(ProducerConfig.BATCH_SIZE_CONFIG,
                env.getProperty("spring.kafka.producer.batch-size"));

        // linger.ms
        props.put(ProducerConfig.LINGER_MS_CONFIG,
                env.getProperty("spring.kafka.producer.linger-ms"));

        // buffer memory size 설정
        props.put(ProducerConfig.BUFFER_MEMORY_CONFIG,
                env.getProperty("spring.kafka.producer.buffer-memory"));

        // key serializer 지정
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
                StringSerializer.class);

        // value serializer 지정
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
                StringSerializer.class);

        return props;
    }

env.getProperty()를 통해 application.yml 값을 가져올 수 있다.

결론

  • 단순한 설정 값들을 사용할 때는 @Value를 통해 간단하게 주입받는 것이 편리하다.
  • 여러 속성을 그룹화하거나 빈으로 바인딩하려면 Environment와 @ConfigurationProperties를 함께 사용하는 것이 좋다.
  • 프로젝트의 규모와 복잡성에 따라 선택하면 된다. 작은 프로젝트에서는 @Value를 사용해도 충분하겠지만, 대규모 프로젝트에서는 Environment와 @ConfigurationProperties를 사용하여 유지보수성을 높일 수 있다.