본문 바로가기
Spring/Spring-detail

@ConfigurationProperties / @ConfigurationPropertiesBean

by YoonJong 2023. 8. 23.
728x90
url:
  naver: www.naver.com
  depth:
    google: www.google.com

yml 에 설정한 값들을 편리하게 사용할 수 있는 어노테이션입니다.

기존에 프로젝트에서 사용했던 방법은 2가지를 사용했습니다.

1. Enviroment 를 사용

2. 각각의 설정파일을 불러 객체로 만들어 사용

 

@ConfigurationProperties / @ConfigurationPropertiesBean 를 사용하게 되면 객체지향적으로 설정파일의 값을 사용할 수 있습니다.

 

application.yml 을 간단히 설정했습니다.

naver 처럼 첫 줄에 값을 설정할 수도 있지만, google 처럼 두번째 depth 로 사용하는 경우도 많습니다.

url:
  naver: www.naver.com
  depth:
    google: www.google.com

 

@ConfigurationProperties 의 어노테이션을 사용해서 클래스를 만들어줍니다.

하나의 클래스를 만들어서, url 로 시작되는 값을 모두 객체로 만들어 사용할 수 있습니다.

주의해야 할점은, naver 처럼 url.naver 가 아닌 url.depth.google 로 가져와야하는 값들은 따로 클래스를 만들어야 합니다.

이너 클래스로 만들어도되고, 따로 클래스를 작성해도 상관없습니다.

@Data
@Component
@ConfigurationProperties(prefix = "url")
public class ConfigurationPropertiesTest {

    private String naver;
    private Depth depth;

    @Data
    public static class Depth {
        private String google;
    }

}

 

적용되었는지 테스트하기 위해 컨트롤러 API 로 테스트해보겠습니다.

@RestController
@RequiredArgsConstructor
@Slf4j
public class HelloController {

    private final ConfigurationPropertiesTest configurationPropertiesTest;

    @GetMapping("/naver")
    public String naver() {
        return configurationPropertiesTest.getNaver();
    }

    @GetMapping("/google")
    public String google() {
        return configurationPropertiesTest.getDepth().getGoogle();
    }
}

 

 

http://localhost:7777/naver 테스트

http://localhost:7777/google 테스트

 

 

위와 같이 정상적으로 값을 읽어와 사용할 수 있는 것을 확인할 수 있습니다.

 

저는 설정 값이 많지 않을 경우에는 굳이 사용해야 하나? 라고 생각했고, 지금까지 환경변수의 값을 가져와 사용하는데 아무 생각없이 중복된 코드를 작성하고 있었습니다.

 

실무, 특히 MSA 환경에서는 서로 콜을 해야하는 경우가 많고 값을 yml 이나 properties 에 등록해 사용하는 경우가 많습니다.

이에 처음에 번거롭더라도 클래스를 만들어 객체로 사용하게 되면 객체지향적으로 사용할 수 있을 것 같습니다.

 

물론, 설정파일의 값을 설정할 때 이름을 더욱 신경써서 지어주어야 헷갈리지 않을 것 같습니다.

 

728x90

댓글