1. @NoArgsConstructor
1) 사용 예시
게시글 작성 request
@Getter
@Setter
@NoArgsConstructor
public class BoardRequestDto {
private String title;
private String contents;
}
회원가입 request
@Getter
@Setter
@NoArgsConstructor
public class SignupRequestDto {
@NotBlank
private String username;
@NotBlank
private String password;
}
로그인 request
@Getter
@Setter
@NoArgsConstructor
public class LoginRequestDto {
private String username;
private String password;
}
각 코드를 보면 모두 '@NoArgsConstructor' 가 붙어있다.
@NoArgsConstructor 가 없어도 에러가 나지 않고, 결과 또한 동일하게 반환된다.
그렇다면 에러를 발생시키지도 않는데 굳이 @NoArgsConstructor 를 붙여야하는 이유는 무엇일까?
2) 사용 상황
(1) Entity
- @Entity 가 붙은 클래스
- Entity 클래스에서 기본 생성자가 필요한 이유는 JPA 와 관련있다
- JPA 는 기본 스펙상 데이터화 하려는 객체의 기본 생성자를 요구
- JPA 가 프록시 객체를 생성하기 위해서 기본 생성자가 반드시 필요
- JPA 가 리플렉션(reflection API)을 이용해 Bean 클래스를 만드는데, 이 때 기본 생성자를 이용한다
(2) RequestDto
-
Client에서 JSON 데이터를 보내면, RequestDto 에 담아 데이터가 이동된다.
- JSON 을 RequestDto 객체에 담을 때, 기본 생성자가 필요하다
-
Spring 이 JSON을 DTO로 매핑할 때, Jackson 라이브러리의 ObjectMapper를 사용
- ObjectMapper
- 직렬화(serialize), 역직렬화(deserialize)를 수행
- 직렬화 : Java Object → JSON
- 역직렬화 : JSON → Java Object (기본 생성자로 DTO 생성하여 데이터를 파싱한다.)
- JSON → Java Object 로 역직렬화 할 때, DTO의 기본 생성자를 이용해 DTO를 생성하여 진행
2. @Getter
(1) DTO
- JSON → DTO 로 데이터를 파싱할 때, ObjectMapper의 getter 또는 setter를 이용해서 DTO 필드를 가져온다.
- 단, 값을 주입할 때는 reflection 기능을 통해 주입하므로, setter를 굳이 쓸 필요는 없다.
(2) RequestDto
- Service에서 requestDto 의 값을 사용하는 일이 빈번한데
- Service 에서 requestDto getter 메서드를 사용할 때, DTO 클래스에 @Getter가 없으면 컴파일러가 에러를 체크한다.
(3) ResponseDto
- 값을 반환하는 DTO이기 때문에 getter 메서드를 쓸 일이 없다.
- 실제로 쓰지 않아도 컴파일러 에러 체크도 발생하지 않고, 실제 서버도 작동한다.
- 단, @Getter가 없는 DTO를 사용하는 로직을 수행하면 예외가 발생한다.
- Spring이 Jackson 라이브러리를 사용해서 DTO → Json 으로 데이터를 변환해주는데,
이 때 ResponseDto의 데이터를 호출하게 되고, getter 메서드를 사용하게 된다.
결론
Entity
: @NoArgsConstructor
RequestDto
: @Getter, @NoArgsConstructor (@Setter는 선택 사항)
ResponseDto
: @Getter (@Setter는 선택 사항)
참고: @NoArgsConstructor, @Getter 언제, 왜 사용할까?
참고: DTO에 기본 생성자가 필요한 이유