multi-args constructor(다중 인수 생성자) case
- 지금까지도 잘 되셨죠? 앞으로도 잘 쓰시면 됩니다
- Jackson objcetMappter가 여러분이 만들거나 @RequiredArgsConstructor을 통해서 만들어둔 생성자를 가져다 써서 역직렬화(Deserialize)해줍니다.
[역직렬화 -> ex) JSON을 DTO로 만드는 것.]
single-args constructor(단일 인수 생성자) case
- 여기서 이제 문제가 발생합니다.
문제가 발생하는 이유
Jackson objcetMappter가 생성자를 가져다 쓰지 못함 (Jackson 개발자의 표현으로는 단일 인수 생성자를 '모호한 생성자'라고 표현)
single-args constructor case 해결방안
@NoArgsConstructor(force=true)
를 붙여준다.
- 전자의 방법으로 기본생성자를 열어버릴 경우 누군가 쥐도새도 모르게
new dto()
를 코드 곳곳에 뿌려둬서Runtime Error
디버깅에 멘탈이 터질 위험도 있습니다.- 이를 예방하기 위해 @NoargsConstructor에
access = AccessLevel.PROTECTED
를 붙여주는 것을 추천합니다.
(관련 Ref- @ENTITY에는 왜 AccessLeve.PRIVATE을 붙이면 안되는 걸까)@JsonProperty
를 붙여서 생성자를 만들어준다.
- @JsonProperty를 붙였을 때, 겁~나게 강한 의존성이 생깁니다.
-> ex) GSON으로 바꾸게 된다면? 어떡할 것인가3.
@ConstructorProperties
[관련 Ref]
- [우아한테크코스] 기본 생성자가 필요한 이유 (Why the default constructor is needed) (feat. Jackson ObjectMapper + Reflection)
- [@RequestBody에 왜 기본 생성자는 필요하고, Setter는 필요 없을까? - 총 3부작]
- [DTO에 기본생성자가 필요한 이유 - JAVA Reflection]
- [Jackson ObjectMapper에서 기본 생성자 없이 Deserialization 하기]
- [스프링 공식문서 - Jackson으로 불변 객체 역직렬화]
- [FasterXML - jackson databind]
- [- FasterXML/jackson-modules-java8]
- [stackoverflow - When is a @JsonCreator method required for parsing?]
팀프로젝트 진행중 다른 팀원이 작성한 Dto를 보던중 나와 다른점을 발견했다.
- @Getter말고 다른 애들은 왜 붙이는거지..?
- 팀원분의 대답: "그냥 원래 그래요"
deserialized
, HttpMessageConverter
키워드를 습득했다...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를 불변객체로 받지 않을 경우]
[RequestDto를 불변객체로 받을 경우]
그런데 responseDto도아니고 requestDto도 불변객체로 만들 필요가 있을까..?
-> 다음 이시간에 계속...
잘 읽고 갑니다