그 때 당시에는 Spring은 물론 Java에 대한 개념도 매우 약할 때라
지금도 약하지만레퍼런스의 코드를 가져다 사용하기에 급급했다.
당시의 나는 해당 개념에 대한 정확한 이해보다는 기능 구현이 우선이 되었기에, 내가 코드에 적용했던 다른 코드나 기술들에 대해 정확히 왜 사용하고, 어떤 기능인지에 대한 것들은 모두 미뤄뒀었다.
그래서 지금부터 내가 잘 모르고 작성했던 코드들에 대한 공부를 차근히 진행하고자 한다.
나는 아직도 너무 무지하고, 개념을 확실히 알고 넘어 가야 한다는 습관이 완벽히 자리 잡지 않았기에
이 시리즈는 한동안 쭉 작성하지 않을까 싶다.
이 시리즈의 네번째 글의 주제는 DTO에 @Getter
와 @Setter
어노테이션을 왜 사용했을까라는 주제이다.
나는 레퍼런스에서 단순히 DTO마다 @Getter
와 @Setter
어노테이션을 붙여서 사용하길래, 붙이는 이유가 막연히 있겠지라는 생각으로 나 또한 DTO에 @Getter
와 @Setter
어노테이션을 붙였다.
정확히 왜 DTO에 @Getter
와 @Setter
어노테이션을 붙이는 건지에 대해서는 이해하지 못하고 있었다.
이제부터 왜 DTO에 @Getter
와 @Setter
어노테이션을 붙였는지에 대해서 알아보자.
@Getter
@Setter
public class PostRequestDto {
private String title; // 제목
private String content; // 내용
private String hashTag; // 해시태그
위 코드는 내가 프로젝트간 작성했던 코드 중 일부 코드이다.
정확히 왜 Getter와 @Getter
와 @Setter
어노테이션을 붙였는지 위 코드를 예시를 들면서 알아보자.
흔히 Spring boot로 API 서버를 개발하다보면, JSON → POJO, POJO → JSON등을 @RequestBody
나 @ResponseBody
등을 통해서 데이터 바인딩을 많이 해봤을 것이다.
Spring boot에서는 @RequestBody
나 @ResponseBody
등을 통해서 데이터 바인딩을 할 때 Jackson 라이브러리를 사용한다.
정확히는 Spring의 HttpMessageConverter 인터페이스를 구현한 Jackson2HttpMessageConverter
클래스를 통해 데이터 바인딩을 한다.
위 코드를 여러 경우에 빗대어 Jackson2HttpMessageConverter
가 @Getter
와 @Setter
를 어떻게 데이터 바인딩에 이용하는지 알아보자.
public class PostRequestDto {
public String title; // 제목
public String content; // 내용
public String hashTag; // 해시태그
@Getter
public class PostRequestDto {
private String title; // 제목
private String content; // 내용
private String hashTag; // 해시태그
@Getter
를 통해서 json 데이터의 key와 매핑 시킨다.public String getTitle() {
return this.title + "입니다.";
}
@Setter
public class PostRequestDto {
private String title; // 제목
private String content; // 내용
private String hashTag; // 해시태그
Pojo → Json(직렬화)
getter
로 인해서 name 필드의 kevin 값이 {”name”:”kevin”}으로 직렬화된다.Json → POJO(역직렬화)
getter
or setter
로 인해서 name 필드와 매핑이 되며, 역직렬화된다.ㅇㅇ 맞다.
정확히는 Jackson이 사용되는 @RequestBody
나 @ResponseBody
를 통한 데이터 바인딩 시에는 getter로 충분하다.
그 외의 경우 Jackson이 사용되지 않는 Get 요청의 경우, 즉 쿼리 파라미터로 값을 넘기는 경우에는 setter를 사용해야 한다. 그 이유는 Get 요청의 경우에는 WebDataBinder를 사용하고, 이는 Java Bean 방식으로 값을 할당하기 때문이다.
답은 Jackson 라이브러리를 통한 데이터 바인딩을 하기 위해서이고, 이 때 @Setter 또한 역직렬화 시 데이터 바인딩을 할 수 있지만, @Getter만으로 충분하다.