결론부터 말하자면 이는 역직렬화와 관련된 오류이다.
Jackson 라이브러리가 어떻게 직렬화와 역직렬화를 수행하는지 제대로 알아보지 않은 나의 잘못이다....ㅠ
나에게는 다음과 같은 코드가 있었다.
// == 컨트롤러 == //
public Result changeComment(
@Getter
@AllArgsConstructor
private static class ChangeCommentRequest {
String content;
}
해당 uri로 요청을 보내봤는데 계속 400에러가 뜨는 것이다.
정상적으로 작동하는 다른 코드와 비교하며, 삽질을 하며 발견한 것은 다음과 같았다.
1. "" 다른 건 오직 Dto의 필드 개수 뿐인데 ""
정상적으로 작동하는 dto 클래스를 살펴보면 공통적으로 멤버 변수의 개수가 2개 이상이었다. 문제가 되는 dto클래스는 멤버 변수가 1개이다.
2. @RequestBody 를 통해 dto 클래스로 데이터를 받아오지 않고 다른 방식으로 데이터를 받아왔더니 정상 작동한다.
1번과 2번 모두 dto 클래스와 관련이 있었다.따라서 dto 클래스를 이것 저것 건드려보다가 기본 생성자를 생성하니 문제 없이 코드가 작동한다는 사실을 마주해냈다.
문제가 되었던 ChangeCommentRequest dto클래스는 역직렬화 시에 사용되므로 역직렬화와 직렬화에 대해서 알아보기로 했다.
직렬화(Serialization)
자바 vaule가 컴퓨터가 읽을 수 있는 바이트 코드로 변환되는 것
현재 상황에서,
컨트롤러에서 반환되는 객체는 직렬화되어 HTTP body에 쓰여진다.
역직렬화(Deserialization)
바이트 코드를 자바 객체로 바꾸는 것 :
ex.
@RequestBody를 통해
파라미터로 받아오는 request Dto는 역직렬화되어
객체의 형태로 사용할 수 있는 것이다.
따라서 나의 경우 역직렬화 과정에서 문제가 발생하였던 것이었다.
1. dto클래스의 필드가 두 개일 때는 문제가 없는데 왜 한 개 일 때는 문제가 발생할까?
2. 직렬화를 해주는 객체(응답 객체)는 필드가 하나여도 문제가 없었는데.
A1.
역직렬화를 할 때는 기본 생성자가 필요하다.
만약 내가 Spring Boot를 사용하지 않았다면, dto 클래스에 기본생성자를 추가하지 않은 나는
필드가 2개 이상인 dto클래스에서도 문제가 생겼을 것이다.
Spring Boot에서는 dto의 필드가 두 개 이상이라면 jackson라이브러리의 jackson-module-parameter-names 모듈을 이용하여 이 문제를 해결한다.(jackson-module-parameter-names 모듈을 object Mapper에 등록)
바로 역직렬화를 하려고 할 때, dto 클래스의 기본 생성자가 없다면 인자가 있는 생성자를 찾아 객체를 생성하게끔 하는 것이다.(스프링 부트 2.x 이상)
나는 기본적으로 @AllArgsConstructor 어노테이션을 모든 dto 클래스에 추가했으므로, 문제가 되지 않았던 경우에는 해당 어노테이션이 생성해준 생성자가 이용되지 않았을까 싶다.
A2.
응답객체가 문제가 되지 않는 이유는 직렬화를 할 때 사용되는 클래스의 필요조건이 getter, setter 라서 그렇다.
즉 직렬화는 기본 생성자를 사용 하지 않으니 문제가 되지 않는 것이다.
+ 궁금하다면 다음 글을 참고해보자.
+
공부하면서 정리하는 연관 지식
POJO 객체
Plain Old Java Object 의 약자로, '자바로 생성된 순수한 객체'를 뜻한다.
따라서 이 분은 환경과 기술에 연연하지 않는 (영향을 받지 않는) 의연한 모습을 보여준다...
Spring Triangle
- Ioc / DI
- AOP(Aspect Oriented Programming_관점 지향 프로그래밍) : OOP(Object Oriented Programming_객체 지향 프로그래밍) 을 돕는 기술이다. 이는 기능을 핵심 관심 사항(Core Concern)과 공통 관심 사항(Cross-Cutting Concern)으로 분리한다.(관심사의 분리) ex. 프록시 패턴
- PSA(Potable Service Abstraction): 환경의 변화와 관계없이 일관된 방식의 기술로의 접근 환경을 제공하는 추상화 구조를 말한다. 스프링의 라이브러리는 POJO를 철저하게 따른 PSA들의 집합이라고도 볼 수 있다.
https://dev-coco.tistory.com/83 참고
객체 생성 방법
- Java Beans 패턴 : ( 매개변수가 없는 기본 생성자 + setter )조합
- 빌더 패턴
- 정적 팩토리 메서드 패턴
Object Mapper
자바를 Json으로 직렬화 또는 Json을 자바로 역직렬화할 때 사용하는 Jackson라이브러리의 클래스
'Error' 카테고리의 다른 글
List의 NULL을 방지하려고 초기화해줬는데 왜 NPE가? (0) | 2024.01.15 |
---|---|
application.yaml 설정- org.hibernate.sql 작동 안함 (0) | 2024.01.09 |
Git "There is no tracking information for the current branch. Please specify which branch you want to merge with. "오류 (0) | 2024.01.09 |
git push author 변경 (0) | 2023.09.04 |
조회 기능 구현 시 JsonMappingExeception 오류 (0) | 2023.08.04 |