멍두의 개발새발

[스프링] DTO에 @NoArgsConstructor와 @Gettter이 필요한 이유 본문

Programming/Spring

[스프링] DTO에 @NoArgsConstructor와 @Gettter이 필요한 이유

멍두 2024. 7. 30. 23:31
반응형

📍 서론 

개발을 하다가 Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception 이라는 에러가 발생했다.

responseDTO에 @Getter를 넣어주지않아 발생한 오류였다.

 

그렇다면 왜 필요한 것일까?

 

📍 본문

일단 기본적으로 우리가 dto를 사용하여 response를 보내고, request를 받아오면

Jackson 라이브러리에서 자동으로 ObjectMapper를 사용해

직렬화(object -> json 파싱)와 역직렬화(json -> object 파싱)를 해준다는 것을 알고있자.

 

또한 objectmapper는 직렬화, 역직렬화에 reflection을 사용하는데

reflection이란 런타임에 클래스, 인터페이스, 메소드, 필드 등의 정보를 동적으로 검사하고 조작할 수 있는 프로그래밍 기능이다.

 

1. 직렬화( response )의 경우

 id = 12345, name = "두더지"   => {"id" : "12345", "name" : "두더지"}

 

1. responseDto를 생성한다.

2. getter를 사용하여 필드값을 읽어 json으로 변환한다.

 

그렇다면 왜 setter는 안되고 getter여야만 하는걸까?

jackson 라이브러리는 객체의 필드값을 읽어 json으로 변환하므로 setter가 아닌 getter를 사용한다.

setter는 값을 설정하는 것이다.

 

그럼 setter는 역직렬화에 사용하는걸까?

 

2. 역직렬화(request)의 경우

{"id" : "12345", "name" : "두더지"} =>    id = 12345, name = "두더지" 

 

1. json을 받는다.

2. requestdto를 기본 생성자로 생성한다.

3.  필드를 가져와 값들을 넣어준다.

 

역직렬화 할 때 setter와 NoArgsConsturctor를 사용하는 것이 의미상 옳다.

그러나 setter는 값이 변경될 위험이 있기 때문에 데이터를 전달하는 dto의 데이터 무결성을 위해 getter로 필드명만 가져온 뒤, 필드 접근으로 값을 넣어주는 방법을 사용한다. 

 

📍 요약

responseDto는 @Getter가 반드시 필요하다.
requestDto는 @Getter와 @NoArgsConstructor가 반드시 필요하다

 

반응형