궁금증 배경 )
강의를 듣다보니 자연스럽게 (무의식적으로) @Builder, @NoArgsConstructor, @AllArgsConstructor를 적고 있는 나를 발견했다.. 파악한 부분은 대강 @Builder는 그냥 써도 되지만, 만약 @NoArgsConstructor를 쓰게 된다면 @AllArgsConstructor를 필수적으로 붙여줘야 한다는 것이였다.. 그렇지만 왜? 쓰지는 궁금하여 찾아보게 되었다.
✅ 엔티티 클래스를 생성할 때 Builder 패턴을 쓰게 된다. 이유는 엔티티의 모든 속성들을 다 설정할 필요없이 필요한 값만으로 객체를 쉽게 생성할 수 있기 때문이다.
Q1. 그렇다면 @Builder는 @AllArgsConstructor 와 함께 써야 하는걸까?
A :
앞서 Builder는 생성자 초기화 시, 모든 필드 값에 값을 명시적으로 사용해야 하는 생성자 초기화 방식에 비해, 필요한 데이터만 설정할 수 있어 코드 작성에 유연함을 갖는 장점이 있다. 그러나 빌더 내부에서는 최종 객체 생성 시 객체의 모든 필드 값을 필요로 하게 된다. 따라서 Lombok의 @Builder 어노테이션이 빌더 패턴을 구현할 때, 클래스의 모든 필드를 포함하는 생성자를 필요로 하게 된다.
Q2. Lombok @Builder는 단독으로 써도 에러가 발생하지 않는다. @NoArgsConstructor 때문인데, @NoArgsConstructor(기본 생성자)는 왜 쓰는 걸까?
A :
<참고>
생성자(Constructor)는 객체 지향 프로그래밍에서 클래스의 인스턴스(객체)를 생성할 때 자동으로 호출되는 특별한 유형의 메서드이다. 생성자는 객체의 초기 상태를 설정하여, 객체가 정상적으로 기능할 수 있는 상태로 만드는데 꼭 필요하다!
기본 생성자는 매개변수가 없이, 객체를 생성할 때 객체의 초기 상태를 필드의 기본값으로 설정해주는 역할을 한다. 주로 초기화할 데이터가 없거나 클래스의 인스턴스를 기본 상태로 생성하기만 하면 되는 경우에 유용하다.
명시적으로 다른 생성자를 정의하지 않으면, 클래스는 자동으로 기본 생성자를 사용하게 된다. 따라서 다른 매개변수를 갖는 생성자를 정의했다면, 기본 생성자는 자동 호출되지 않기 때문에 따로 작성을 해줘야 한다.
@NoArgsConstructor는 매개변수가 없는 기본 생성자를 자동으로 생성해주는 Lombok의 어노테이션이다.
스프링 프레임워크에서 DTO클래스에 @NoArgsConstructor를 사용하는 이유에는 아래와 같은 이유가 있다.
1. 프레임워크 호환성 : 스프링의 ORM을 사용하는 JPA 구현체는 엔티티 객체를 생성할 때 기본 생성자를 사용한다. DTO가 엔티티로 변환되거나 그 반대로 변환될 때 기본 생성자가 필요할 수 있다.
2. 직렬화/역직렬화 : DTO 객체는 웹 요청과 응답에서 데이터 전송을 위해 JSON이나 XML과 같은 형식으로 직렬화/역직렬화 되는데 이때 기본 생성자를 사용한다. 따라서 @NoArgsConstructor를 사용하여, 직렬화 도구가 DTO객체를 쉽게 인스턴스화 하도록 해준다.
3. 데이터 바인딩 : 스프링 MVC에서 클라이언트로부터 받은 데이터를 DTO 객체에 바인딩할 때, 기본 생성자를 통해 객체의 인스턴스를 생성한 다음, setter 메서드를 통해 데이터를 주입한다. 때문에 @NoArgsConstructor가 없으면 스프링이 DTO 객체를 자동으로 인스턴스화 하고 요청을 바인딩하는 과정에서 문제가 발생할 수 있다.
'Programming > Spring' 카테고리의 다른 글
[Spring] - @RestControllerAdvice를 통한 커스텀 예외 처리 작성 방법 (0) | 2024.02.27 |
---|---|
[Spring 🤔] - @Autowired vs @RequiredArgsConstructor (2) | 2024.02.22 |
[Spring] - 데이터베이스 (1) | 2024.02.13 |
[Spring] - 스프링 (gradle) springdoc으로 Swagger3 추가하기 (0) | 2024.02.06 |
[Spring] - 스프링부트 API 작성 방법 : Post, Put, Delete Mapping (0) | 2024.02.06 |