RequestDto에 @Getter말고 다른걸 왜 붙여요?

조성현·2023년 1월 7일
2

바쁜 현대인들을 위한 결과요약

multi-args constructor(다중 인수 생성자) case

  • 지금까지도 잘 되셨죠? 앞으로도 잘 쓰시면 됩니다
  • Jackson objcetMappter가 여러분이 만들거나 @RequiredArgsConstructor을 통해서 만들어둔 생성자를 가져다 써서 역직렬화(Deserialize)해줍니다.
    [역직렬화 -> ex) JSON을 DTO로 만드는 것.]

single-args constructor(단일 인수 생성자) case

  • 여기서 이제 문제가 발생합니다.
  • 문제가 발생하는 이유

    Jackson objcetMappter가 생성자를 가져다 쓰지 못함 (Jackson 개발자의 표현으로는 단일 인수 생성자를 '모호한 생성자'라고 표현)

single-args constructor case 해결방안

  1. @NoArgsConstructor(force=true)를 붙여준다.
    • 전자의 방법으로 기본생성자를 열어버릴 경우 누군가 쥐도새도 모르게 new dto()를 코드 곳곳에 뿌려둬서 Runtime Error 디버깅에 멘탈이 터질 위험도 있습니다.
    • 이를 예방하기 위해 @NoargsConstructor에 access = AccessLevel.PROTECTED를 붙여주는 것을 추천합니다.
      (관련 Ref- @ENTITY에는 왜 AccessLeve.PRIVATE을 붙이면 안되는 걸까)
  2. @JsonProperty를 붙여서 생성자를 만들어준다.
    • @JsonProperty를 붙였을 때, 겁~나게 강한 의존성이 생깁니다.
      -> ex) GSON으로 바꾸게 된다면? 어떡할 것인가

3.@ConstructorProperties [관련 Ref]


바쁜 현대인들을 위한 매커니즘 요약


참고 Ref

  1. [우아한테크코스] 기본 생성자가 필요한 이유 (Why the default constructor is needed) (feat. Jackson ObjectMapper + Reflection)
  2. [@RequestBody에 왜 기본 생성자는 필요하고, Setter는 필요 없을까? - 총 3부작]
  3. [DTO에 기본생성자가 필요한 이유 - JAVA Reflection]
  4. [Jackson ObjectMapper에서 기본 생성자 없이 Deserialization 하기]
  5. [스프링 공식문서 - Jackson으로 불변 객체 역직렬화]
  6. [FasterXML - jackson databind]
  7. [- FasterXML/jackson-modules-java8]
  8. [stackoverflow - When is a @JsonCreator method required for parsing?]

본 글..

팀프로젝트 진행중 다른 팀원이 작성한 Dto를 보던중 나와 다른점을 발견했다.

  • @Getter말고 다른 애들은 왜 붙이는거지..?
  • 팀원분의 대답: "그냥 원래 그래요"

그냥은 없다...! 궁금증에서 출발한 구글링이 꽤나 머리 아픈 일이 되어버렸다.


스프링 공식문서- 1.3.3. 中

MappingJackson2HttpMessageConverter

  • An HttpMessageConverter implementation that can read and write JSON by using Jackson’s ObjectMapper. You can customize JSON mapping as needed through the use of Jackson’s provided annotations. When you need further control (for cases where custom JSON serializers/deserializers need to be provided for specific types), you can inject a custom ObjectMapper through the ObjectMapper property. By default, this converter supports application/json.
  • [크롬 번역기능 사랑해요] HttpMessageConverterJackson의 .json을 사용하여 JSON을 읽고 쓸 수 있는 구현 ObjectMapper. Jackson이 제공하는 주석을 사용하여 필요에 따라 JSON 매핑을 사용자 정의할 수 있습니다. 추가 제어가 필요한 경우(특정 유형에 대해 사용자 지정 JSON 직렬 변환기/역직렬 변환기를 제공해야 하는 경우) 속성 ObjectMapper 을 통해 사용자 지정을 주입할 수 있습니다 ObjectMapper. 기본적으로 이 변환기는 application/json.
  • 순환참조에서 뵀던 잭슨씨를 여기서도 보네요 ^^
    - ObjcetMapper 키워드 획득...

실험을 통해 알아낸 내용

[RequestDto를 불변객체로 받지 않을 경우]

  1. args 여러개 받는 생성자는 굳이 @NoArgsConstructor 필요없다
    • jacson이 알아서 constructor 찾아서 씀
  1. args 한개만 받을때는 기본생성자가 필요함
    • @NoArgsConstructor를 붙여도 되고 아니면 @JsonPropoerty 붙여도 해결됨
    • 근데 사실 생성자를 안만들면 알아서 만들어주니까... DTO에는 굳이 @NoArgsConstructor를 안붙여도 된다는 결론...!

[RequestDto를 불변객체로 받을 경우]

  1. 맨 위 사진의 팀원분 코드처럼 @NoArgsConstructor(force=true) + @Required..
    두개 다 붙이던가
  2. 생성자 parameter에 @JsonProperty("key값")을 붙여주던가 해야함.

그런데 responseDto도아니고 requestDto도 불변객체로 만들 필요가 있을까..?
-> 다음 이시간에 계속...

profile
맛있는 음식과 여행을 좋아하는 당당한 뚱땡이

1개의 댓글

comment-user-thumbnail
2023년 2월 13일

잘 읽고 갑니다

답글 달기