코드를 작성하면서 기존 코드를 참고하거나 습관적으로
@Entity 어노테이션이 붙은 클래스 즉, 엔티티 클래스에 @NoArgsConstructor를 붙여왔다.
@Entity
@NoArgsConstructor
@AllArgsConstructor
그런데 왜 ?! 필요한지, 왜 붙이는지에 대해서 정확히 알지 못했다.
그냥 하라는대로 했을 뿐
그래서 그에 대한 내용을 정리해보고자 한다.
먼저 아래의 세 어노테이션은 객체의 생성자를 만들어주는 어노테이션이다.
@RequiredArgsConstructor는 final로 선언된 필드와 not null 조건이 붙은 필드에 한하여 생성자를 만들고
@AllArgsConstructor는 모든 필드를 가지는 생성자를 만들고
@NoArgsConstructor는 어떤 필드도 가지지 않는 기본 생성자를 만든다.
@NoArgsConstructor는 Java의 ORM 기술인 JPA에서 기본적으로 요구하는 어노테이션이다.
없으면 에러가 난다.
@Entity 어노테이션을 붙이면 내부적으로 해당 어노테이션을 붙인 것과 같이 기본 생성자를 만들어준다.
그런데 @@@!!!! 이미 생성자가 있을 경우에는 만들지 않는다.
@AllArgsConstructor 어노테이션을 적용하면 !! 이미 생성자가 있는 것이기 때문에 자동으로 기본 생성자를 추가해주지 않는단다........
그래서 해당 @NoArgsConstructor를 명시적으로 붙여줘야 한다.
근디 @AllArgsConstructor는 사용을 지양하라고 한다.
같은 타입의 매개변수를 서로 바꿔 입력하거나 접근할 필요가 없는 필드값에 접근할 수 있게 되어 문제가 발생할 수 있다.
꼭 받아야 하는 필드값만 넣는 생성자를 따로 만들어 사용하자 or Builder 패턴 사용하자.
- @AllArgsConstructor는 모든 필드를 매개변수로 가지는 생성자를 자동으로 생성, 사용 시 필드의 순서에 주의해야 하며, 필드가 많아질수록 가독성이 떨어질 수 있음
- @Builder는 가독성, 명확성, 선택적 매개변수 처리, 유지 보수성, 디버깅 용이성 등 여러 면에서 장점이 있으며, 특히 복잡한 객체 생성 시 유용