티스토리 뷰

설정파일에 정의한 내용들을 객체에 바인딩할때 @ConfigurationProperties 애노테이션을 이용해서 주입할 수 있다.

// yml file
config:
  person:
    age: 33
    name: LichKing

// binding 할 객체의 클래스
@ConfigurationProperties("config.person")
@NoArgsConstructor @Setter @ToString
public class Person {
    private String name;
    private int age;
}

// 어디엔가 이 애노테이션을 선언해줘야 한다
@ConfigurationPropertiesScan

위처럼 정의하면 spring 컨테이너가 구동될때 Person 의 기본생성자를 이용해 인스턴스를 만들고, setter 를 이용해 설정파일들을 주입해준다. 하지만 setter 보다는 생성자 주입을 하고싶은게 요즘 자바 개발자의 마음일 것이다. 그럴때 사용하라고 spring boot 2.2 부터 나온 애노테이션이 @ConstructorBinding 이다.

@ConstructorBinding
@ConfigurationProperties("config.person")
@RequiredArgsConstructor @ToString
public class Person {
    private final String name;
    private final int age;
}

위처럼 정의하면 생성자를 통해 주입받을 수 있다. 그 덕분에 필드들을 final 로 선언하고, setter 를 없앨 수 있게됐다.

 

하지만 위 코드는 spring boot 3 로 오게되면 컴파일이 되지 않게 되는데, @ConstructorBinding 애노테이션의 패키지가 변경되고, 메타 애노테이션으로 정의된 @Target 내용이 달라졌기 때문이다. 기존에는 Type 에도 달 수 있었기 때문에 클래스에 붙일 수 있었는데 spring boot 3 로 오면서 생성자와 애노테이션에만 붙일 수 있게 됐다.

@ConfigurationProperties("config.person")
@ToString
public class Person {
    private final String name;
    private final int age;

    @ConstructorBinding
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

그래서 이렇게 생성자에 애노테이션을 붙여주면 정상적으로 컴파일도 되고, 설정주입도 되는걸 확인할 수 있다. 하지만 롬복으로 선언한 생성자를 사용할 수 없어 코드 내용은 더 길어졌다.

 

사실 spring boot 3 에서 @ConstructorBinding 의 @Target 이 변경된건 이유가 있는데, 생성자가 1개 일때는 애노테이션이 없어도 단일 생성자를 통해 주입해주도록 변경됐기 때문이다. 이전에 spring bean 주입을 위해선 @Autowired 를 생성자에 붙여줬어야 했는데 생성자가 1개일때는 해당 생성자를 통해 주입할 수 있도록 변경된 것과 유사하다. 그래서 위 코드는 아래와 같이 변경할 수 있다.

 

@ConfigurationProperties("config.person")
@RequiredArgsConstructor @ToString
public class Person {
    private final String name;
    private final int age;
}

때문에 spring boot 3 로 마이그레이션을 한다면 @ConstructorBinding 애노테이션을 생성자에 붙이기보다는 아마도 삭제하는 편으로 마이그레이션하는게 훨씬 편할 것이다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함