Dto 에서의 어노테이션 언제 사용할까

박영준·2023년 7월 1일
1

Spring

목록 보기
32/58

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에 기본 생성자가 필요한 이유

profile
개발자로 거듭나기!

0개의 댓글