멍두의 개발새발
[스프링] DTO에 @NoArgsConstructor와 @Gettter이 필요한 이유 본문
📍 서론
개발을 하다가 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가 반드시 필요하다
'Programming > Spring' 카테고리의 다른 글
[JPA] Entity에서 @Table, @Entity, @Column의 name을 정의해주어야할까? (2) | 2025.05.26 |
---|---|
[JPA] Entity에서 사용되는 Annotation 정리 (@Table, @Entity, @Column, @Enumerated, @Temporal .. ) (2) | 2025.05.26 |
[스프링] - findByIN절, jdbc batchUpdate (bulk Insert)로 쿼리 개선 (0) | 2024.05.29 |
[스프링] [에러해결] 모든 http response의 한글 깨짐을 한방에 해결하기 (1) | 2024.04.30 |
[스프링] @RestControllerAdvice 리팩토링 (1) | 2024.04.14 |