@NoArgsConsructor, @RequiredArgsConstructor, @AllArgsConstructor

myminimin·2023년 8월 29일
1

Spring/Springboot

목록 보기
9/21
post-custom-banner

23.8.29 복습하면서 추가(아래 내용이 부실해보임..)

  • @RequiredArgsConstuctor
    final이나 @NotNull인 필드 값만 파라미터로 받는 생성자를 생성한다고 적어놨는데 더 자세히 설명하면

초기화되지 않은 모든 final fields와 선언될 때 초기화되지 않은 @NonNull로 표시된 field까지 파라미터로 가지는 것이다.

@NonNull이 달려있는 field의 경우, 생성되는 생성자 내부에 명시적인 null 체크 로직이 생성되기 때문에 @NonNull이 붙어있는 field 중 어떠한 것이라도 NULL 값을 포함한다면 NullPointerException이 발생한다.

  • @AllArgsConstructor
    클래스 내부에 선언된 모든 field마다 하나의 파라미터를 가진 생성자를 생성한다.

얘도 @NonNull이 붙어있는 field의 경우 파라미터에 null check 로직이 생성된다.

그리고 @RequiredArgs와 @AllAgrs 둘 다 생성자의 파라미터 순서는 클래스 내부에서 선언된 field의 순서로 매칭이 된다.

이 순서가 중요한데 프로그래머가 생성자가 선언된 순서가 마음에 들지 않아 마음대로 바꾸게 되면 심각한 로직 에러를 발생시킬 수 있다고 한다!! (두 생성자가 동일한 type를 갖고 있으면 더더욱이 버그를 잡기가 힘들어 진다.)

그래서 @RequiredArgs와 @AllAgrs의 사용을 금지하는 것이 좋다는 얘기도 있다!

아니면 직접 만든 생성자에 @Builder 어노테이션을 붙이는 것을 권장하기도 한다. 이 방법은 파라미터 순서가 아닌 이름으로 값을 설정하기 때문에 리팩토링에 유연하게 대응이 가능하다고 한다!

public class Order {
    private int cancelAmount;
    private int orderAmount;
    
    @Builder
    private Order(int cancelAmount, int orderAmount) {
        this.cancelAmount = cancelAmount;
        this.orderAmount = orderAmount;
    }
}


// field 순서를 변경해도 에러가 없다.
Order order = Order.builder().orderAmount(5).cancelAmount(4).build();

23.8.25 실습 중 추가

@NoArgsConstructor와 @AllArgsConstructor, @RequiredArgsConstuctor 어노테이션을 이용해서 만들어진 생성자의 차이를 보자!


23.8.23 실습 중 추가한 내용

ServiceImpl가 정상적으로 동작하기 위해서는 Mapper 객체가 필요하다.

이는 @Autowired를 사용할 수도 있고, Setter를 이용해서 처리할 수도 있는데 Lombok을 이용한다면 아래와 같은 방식으로 만들어 진다.

  1. @Autowired 방법은 먼저 빈을 생성한 후에 어노테이션이 붙은 필드에 해당하는 빈을 찾아서 주입하는 방법이기 때문에 변화가 없지만

    대신 Beans를 보면 boardServiceImpl가 생성이 되어 있음.

  2. Lombok을 이용한 @Setter(onMethod_ = @Autowired) 같은 경우에는 바로 setMapper(BoardMapper)가 생기고

    Spring Beans에도 동일하게 boardServiceImpl가 생겨있다.

  1. @AllArgsConstructor는 모든 파라미터를 이용하는 생성자를 만들기 때문에 아래와 같이 BoardMapper를 주입받는 생성자가 만들어 진다.

스프링 4.3부터는 단일 파라미터를 받는 생성자의 경우에는 필요한 파라미터를 자동으로 주입할 수 있다!


Spring Beans에도 동일하게 boardServiceImpl가 생겨있다.


post-custom-banner

0개의 댓글