거인의 코딩일지
[Spring] @NoArgsConsructor, @RequiredArgsConstructor, @AllArgsConstructor 본문
코딩/JAVA
[Spring] @NoArgsConsructor, @RequiredArgsConstructor, @AllArgsConstructor
코딩거인 2023. 8. 22. 15:29728x90
@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor
Spirng 과 lombok 을 사용한다면 알고 있어야 하는 생성자 관련 어노테이션들이다
3가지 다 Constructor 라는 단어로 유추 할 수 있듯 개발자 대신 생성자를 만들어 준다!
@NoArgsConsructor
- 기본 생성자를 생성해준다.
- 초기값 세팅이 필요한 final 변수가 있을 경우 컴파일 에러가 발생한다
- @NoArgsConstructor (force = true) 를 사용하면 null/ 0/ false 로 초기화 할 수 있다.
@RequiredArgsConstructor
- final 변수 NotNull 표시가 된 변수 처럼 필수 적인 정보를 세팅 하는 생성자를 만들어 준다.
@AllArgsContructor
- 전체변수를 생성하는 생성자를 만들어 준다.
주의사항 및 단점
@AllArgsConstructor와 @RequiredArgsConstructor는 심각한 버그를 발생할 수 있어서 사용 시에 주의하거나,
아예 사용을 권하지 않는 경우도 있다.
@AllArgsConstructor
public class Order {
private int cancelNum;
private int orderNum;
}
// 취소 4개 주문 5개
Order order = new Order(4, 5);
@AllArgsConstructor 어노테이션은 생성자를 만들어 줄 때, class 내부에 선언된 field의 순서인 cancelNum, orderNum 순서대로 생성자 파라미터를 생성한다.
하지만 개발자가 선언순서가 맘에들지 않아서 아래 처럼 코드를 변경한다면?
@AllArgsConstructor
public class Order {
private int orderNum;
private int cancelNum;
}
IDE가 제공해주는 리팩토링은 작동하지 않게 되고, lombok도 변화를 알아채지 못한다.
심지어 orderAmount, cancelAmount는 int라는 동일한 type을 갖고 있어 더욱 버그를 잡기 어렵다.
그래서 기존에 사용하던 new Order(4, 5)로 객체의 인스턴스를 만들어도 아무 에러없이 잘 동작할테지만,
실제로 입력되는 값은 취소수량과 주문수량이 뒤바뀌어 들어가는 심각한 비즈니스 로직 에러를 발생시킨다.
이 때문에 @AllArgsConstructor와 @RequiredArgsConstructor의 사용을 금지하는 것이 좋다는 주장도 있고,
그 대신, IDE 자동 생성 기능 등으로 아래처럼 생성자를 직접 만들고,
필요한 경우에는 직접 만든 생성자에 @Builder 어노테이션을 붙이는 것을 권장하기도 한다.
이 방법은 파라미터 순서가 아닌 이름으로 값을 설정하기 때문에 리팩토링에 유연하게 대응이 가능하다.
public class Order {
private int cancelNum;
private int orderNum;
@Builder
private Order(int cancelNum, int orderNum) {
this.cancelNum = cancelNum;
this.orderNum = orderNum;
}
}
//순서를 변경해도 에러가 없다.
Order order = Order.builder().orderAmount(5).cancelAmount(4).build();
참고블로그
728x90
'코딩 > JAVA' 카테고리의 다른 글
선언적 트랜잭션? @Transctional? JPA? Proxy? (0) | 2023.08.24 |
---|---|
[JPA] JPA(Java Persistenence API) 란????? (0) | 2023.08.22 |
Math.sqrt() 제곱근 구하기 (0) | 2023.08.14 |
String VS StringBuilder VS StringBuffer (0) | 2023.08.10 |
[Collection]Set_기초 (0) | 2023.04.09 |