영호

@ConfigurationProperties 는 무엇을 기준으로 값을 주입할까 본문

Spring

@ConfigurationProperties 는 무엇을 기준으로 값을 주입할까

0h0 2024. 7. 15. 23:39

들어가면서,

최근에 같이 우테코를 수료한 지인과 각자 실무를 하면서 기본기를 다시 다지기 위해 Spring 스터디를 시작했습니다.

 

스터디원이 ConfigurationProperties 관련해 흥미로운 점을 알려줬고, 관련해서 조금 더 파본 내용을 간단하게 정리한 글입니다.

실험을 진행한 환경은 Spring Boot 3.x 버전입니다.

 

궁금한 점

꼭 설정 파일의 key 값과 java 코드의 필드명이 같아야 될까?

 

HikariConfig 를 보면 maxPoolSize 란 필드가 있습니다. 그러나 설정파일 에서는 maximum-pool-size 키 값을 사용해 우리가 원하는 값을 주입 해줍니다. 즉, 설정 파일의 key 값과 자바 코드의 필드명이 달라도 매핑이 됩니다.

 

그래서 이를 확인해보기 위해 직접 코드를 쳐봤습니다.

주목할 점은 2가지가 있습니다.

  1. yml 파일의 key 값이 name 이 아닌 na 입니다.
  2. 자바 코드의 필드명은 name 이지만, 파라미터 이름은 설정 파일의 키 값과 동일한 na 입니다.
my:
  name: ee
  age: 5
  school:
    name: wooteco
    course: BE
@ConfigurationProperties("my")
public class ConfigProperty {

    private final String name;
    private final Integer age;
    private final School school;

    public ConfigProperty(String na, Integer age, School school) {
        this.name = na;
        this.age = age;
        this.school = school;
    }

    @PostConstruct
    public void init() {
        System.out.println("school name: " + age);
        System.out.println("school name: " + name);
        System.out.println("school course: " + school.course);

    }

    static class School {
        private String name;
        private String course;

        public School(String name, String course) {
            this.name = name;
            this.course = course;
        }
    }
}

 

이렇게 실행해보면 name 필드에 ee 라는 값으로 정상적으로 매핑됩니다.

어떻게?

내부 코드를 따라가다 보니 Binder 라는 클래스를 찾을 수 있었습니다.

제가 파악한 흐름을 정말 간단하게 요약하자면 아래와 같습니다.

  1. 설정 파일의 키 값을 기준으로 value 를 파싱한다.

 

2. 이를 주입해야 하는 target 클래스에 값을 바인딩한다.

  • 생성자 주입과, getter 와 setter 방식으로 주입하는 경우는 BindMethod 란 enum 에서 이를 구분하여 다르게 동작하고 있습니다.

결론

yml 의 키 값을 토대로 생성자 parameter 이름과 매핑되어 값이 주입된다.

들어가면서,

최근에 같이 우테코를 수료한 지인과 각자 실무를 하면서 기본기를 다시 다지기 위해 Spring 스터디를 시작했습니다.

스터디원이 ConfigurationProperties 관련해 흥미로운 점을 알려줬고, 관련해서 조금 더 파본 내용을 간단하게 정리한 글입니다.

실험을 진행한 환경은 Spring Boot 3.x 버전입니다.

@ConfigurationProperties 주입 방식

해당 어노테이션을 이용해 외부 설정 값을 빈에 주입하는 방법은 생성자를 활용, getter 와 setter 를 활용하는 방법이 있습니다.

yml 파일을 정의하고 생성자를 이용해 java 코드를 작성하면 설정 값을 주입 받은 빈이 생성됩니다.

my:
  name: ee
  age: 5
  school:
    name: wooteco
    course: BE
@Getter
@Setter
@ConfigurationProperties("my")
public class ConfigProperty {

    private String name;
    private Integer age;
    private School school;

    @PostConstruct
    public void init() {
        System.out.println("school name: " + age);
        System.out.println("school name: " + name);
        System.out.println("school course: " + school.course);
    }

    static class School {
        private String name;
        private String course;

        public School(String name, String course) {
            this.name = name;
            this.course = course;
        }
    }
}

궁금한 점

꼭 설정 파일의 key 값과 java 코드의 필드명이 같아야 될까?

HikariConfig 를 보면 maxPoolSize 란 필드가 있습니다. 그러나 설정파일 에서는 maximum-pool-size 키 값을 사용해 우리가 원하는 값을 주입 해줍니다. 즉, 설정 파일의 key 값과 자바 코드의 필드명이 달라도 매핑이 됩니다.

그래서 이를 확인해보기 위해 직접 코드를 쳐봤습니다.

주목할 점은 2가지가 있습니다.

  1. yml 파일의 key 값이 name 이 아닌 na 입니다.
  2. 자바 코드의 필드명은 name 이지만, 파라미터 이름은 설정 파일의 키 값과 동일한 na 입니다.
@ConfigurationProperties("my")
public class ConfigProperty {

    private final String name;
    private final Integer age;
    private final School school;

    public ConfigProperty(String na, Integer age, School school) {
        this.name = na;
        this.age = age;
        this.school = school;
    }

    @PostConstruct
    public void init() {
        System.out.println("school name: " + age);
        System.out.println("school name: " + name);
        System.out.println("school course: " + school.course);

    }

    static class School {
        private String name;
        private String course;

        public School(String name, String course) {
            this.name = name;
            this.course = course;
        }
    }
}

 

이렇게 실행해보면 name 필드에 ee 라는 값으로 정상적으로 매핑됩니다.

어떻게?

내부 코드를 따라가다 보니 Binder 라는 클래스를 찾을 수 있었습니다.

제가 파악한 흐름을 정말 간단하게 요약하자면 아래와 같습니다.

  1. 설정 파일의 키 값을 기준으로 value 를 파싱한다.
  2. 이를 주입해야 하는 target 클래스에 값을 바인딩한다.

결론

yml 의 키 값을 토대로 생성자 parameter 이름과 매핑되어 값이 주입된다.

Comments