@NoArgsConstructor, @Getter 언제, 왜 사용할까?

Doyeon·2023년 2월 14일
1
post-thumbnail

스프링부트로 게시판 만들기를 진행하면서 lombok 어노테이션을 자주 사용하곤 했다.
주로 Entity 클래스와 DTO 클래스에 @NoArgsConstructor, @Getter 를 붙여 사용했는데,
이 어노테이션을 언제, 왜 사용하는지에 대해 공부해보았다.

@NoArgsConstructor

파라미터가 없는 기본 생성자를 만들어주는 어노테이션

@NoArgsConstructor 언제 사용할까?

  • Entity : @Entity 가 붙은 클래스
    • Entity 클래스에서 기본 생성자가 필요한 이유는 JPA 와 관련이 있다.
    • JPA는 기본 스펙상 데이터화 하려는 객체의 기본 생성자를 요구한다.
    • JPA가 프록시 객체를 생성하기 위해서 기본 생성자가 반드시 필요하다.
    • JPA가 리플렉션(reflection API)을 이용해 Bean 클래스를 만드는데, 이 때 기본 생성자를 이용한다.
  • RequestDto : Client에서 JSON 데이터를 보내면 RequestDto 에 담아 데이터가 이동된다.
    • JSON 을 RequestDto 객체에 담을 때 기본 생성자가 필요하다.
    • 스프링이 JSON을 DTO로 매핑할 때, Jackson 라이브러리의 ObjectMapper를 사용한다.
    • ObjectMapper는 직렬화(serialize), 역직렬화(deserialize)를 수행하는데, JSON → Java Object 로 역직렬화 할 때, DTO의 기본 생성자를 이용해 DTO를 생성하여 진행한다.
      • 직렬화 : Java Object → JSON
      • 역직렬화 : JSON → Java Object (기본 생성자로 DTO 생성하여 데이터를 파싱한다.)

@NoArgsConstructor 주의사항

  • 이 어노테이션을 클래스에 붙이면, 기본 생성자가 public 으로 생성된다.
  • 굳이 외부에서 생성을 열어둘 필요가 없다면 막는 것이 좋다.
  • 무분별한 객체 생성을 막을 수 있도록 접근 권한을 최소화하는 것을 권장한다.
    @NoArgsConstructor(access = AccessLevel.PROTECTED)

@Getter

클래스가 갖고 있는 모든 필드의 Getter 메서드를 생성해주는 어노테이션

  • DTO
    • JSON → DTO 로 데이터를 파싱할 때, ObjectMapper의 getter 또는 setter를 이용해서 DTO 필드를 가져온다.
    • 그런데 값을 주입할 때는 reflection 기능을 통해 주입하므로, setter를 굳이 쓸 필요는 없다.
  • RequestDto
    • 서비스에서 requestDto 의 값을 사용하는 일이 빈번하다.
    • Service 클래스에서 requestDto getter 메서드를 사용할 때, DTO 클래스에 @Getter가 없으면 컴파일러가 에러를 체크한다.
  • ResponseDto
    • 값을 반환하는 DTO이기 때문에 사실 getter 메서드를 쓸 일이 없다. 실제로 쓰지 않아도 컴파일러 에러 체크도 발생하지 않고, 실제 서버도 작동한다.
    • 하지만, @Getter가 없는 DTO를 사용하는 로직을 수행하면 예외가 발생한다.
    • Spring이 Jackson 라이브러리를 사용해서 DTO → Json 으로 데이터를 변환해주는데, 이 때 ResponseDto의 데이터를 호출하게 되고, getter 메서드를 사용하게 된다.

  • RequestDto : @NoArgsConstructor, @Getter 필요
  • ResponseDto : @Getter 필요

[참고자료]
https://ksh-coding.tistory.com/48
https://www.popit.kr/실무에서-lombok-사용법/
https://velog.io/@rara_kim/Spring-DTO에-Getter가-필요한-이유
https://velog.io/@rmswjdtn/Spring-Response-Request-DTO-꽉잡기

profile
🔥

0개의 댓글