23.8.29 복습하면서 추가(아래 내용이 부실해보임..)
초기화되지 않은 모든 final fields와 선언될 때 초기화되지 않은 @NonNull로 표시된 field까지 파라미터로 가지는 것이다.
@NonNull이 달려있는 field의 경우, 생성되는 생성자 내부에 명시적인 null 체크 로직이 생성되기 때문에 @NonNull이 붙어있는 field 중 어떠한 것이라도 NULL 값을 포함한다면 NullPointerException이 발생한다.
얘도 @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을 이용한다면 아래와 같은 방식으로 만들어 진다.
@Autowired 방법은 먼저 빈을 생성한 후에 어노테이션이 붙은 필드에 해당하는 빈을 찾아서 주입하는 방법이기 때문에 변화가 없지만
대신 Beans를 보면 boardServiceImpl가 생성이 되어 있음.
Lombok을 이용한 @Setter(onMethod_ = @Autowired) 같은 경우에는 바로 setMapper(BoardMapper)가 생기고
Spring Beans에도 동일하게 boardServiceImpl가 생겨있다.
@AllArgsConstructor
는 모든 파라미터를 이용하는 생성자를 만들기 때문에 아래와 같이 BoardMapper
를 주입받는 생성자가 만들어 진다.스프링 4.3부터는 단일 파라미터를 받는 생성자의 경우에는 필요한 파라미터를 자동으로 주입할 수 있다!
Spring Beans에도 동일하게 boardServiceImpl가 생겨있다.