코드를 작성하면서 기존 코드를 참고하거나 습관적으로
`@Entity` 어노테이션이 붙은 클래스 즉, 엔티티 클래스에 `@NoArgsConstructor`를 붙여왔다.
@Entity
@NoArgsConstructor
@AllArgsConstructor
그런데 왜 ?! 필요한지, 왜 붙이는지에 대해서 정확히 알지 못했다.
그냥 하라는대로 했을 뿐
그래서 그에 대한 내용을 정리해보고자 한다.
먼저 아래의 세 어노테이션은 객체의 생성자를 만들어주는 어노테이션이다.
`@RequiredArgsConstructor`는 final로 선언된 필드와 not null 조건이 붙은 필드에 한하여 생성자를 만들고
`@AllArgsConstructor`는 모든 필드를 가지는 생성자를 만들고
`@NoArgsConstructor`는 어떤 필드도 가지지 않는 기본 생성자를 만든다.
`@NoArgsConstructor`는 Java의 ORM 기술인 JPA에서 기본적으로 요구하는 어노테이션이다.
없으면 에러가 난다.
`@Entity` 어노테이션을 붙이면 내부적으로 `NoArgsConstructor` 어노테이션을 붙인 것과 같이 기본 생성자를 만들어준다.
그런데 @@@!!!! 이미 생성자가 있을 경우에는 만들지 않는다.
`@AllArgsConstructor` 어노테이션을 적용하면 !! 이미 생성자가 있는 것이기 때문에 자동으로 기본 생성자를 추가해주지 않는단다........
그래서 해당 `@NoArgsConstructor`를 명시적으로 붙여줘야 한다.
그런데 `@AllArgsConstructor`는 사용을 지양하라고 한다.
같은 타입의 매개변수를 서로 바꿔 입력하거나 접근할 필요가 없는 필드값에 접근할 수 있게 되어 문제가 발생할 수 있다.
꼭 받아야 하는 필드값만 넣는 생성자를 따로 만들어 사용하거나 `Builder` 패턴을 사용하자.
- `@AllArgsConstructor`는 모든 필드를 매개변수로 가지는 생성자를 자동으로 생성, 사용 시 필드의 순서에 주의해야 하며, 필드가 많아질수록 가독성이 떨어질 수 있음
- `@Builder`는 가독성, 명확성, 선택적 매개변수 처리, 유지 보수성, 디버깅 용이성 등 여러 면에서 장점이 있으며, 특히 복잡한 객체 생성 시 유용
'공부 > Spring' 카테고리의 다른 글
[Spring Cloud] 클라이언트 사이드 로드 밸런싱 (FeignClient와 Ribbon) (0) | 2024.08.05 |
---|---|
[Spring Cloud] MSA Spring Cloud (Eureka) (0) | 2024.08.01 |
Spring Framework 각 계층의 역할 / 비즈니스 로직은 누구의 역할일까? (0) | 2024.07.08 |
Springboot 의존성 주입이란? @Autowired의 원리와 동작 과정 (0) | 2024.06.26 |
[Spring Security] JWT 로그인 흐름 이해하기 (0) | 2024.06.11 |