문제 상황
ajax로 JSON 데이터를 BODY에 담아 POST API로 전달할 때,
controller 단에 매핑하는 객체DTO의 값이 계속 null 인 상황이 발생했다.
넘겨줄 JSON 데이터
{
"seq" : "1",
"name" : "홍길동"
}
받을 DTO 클래스
@Getter // lombok 사용
public class insertDto {
private Long seq;
private String name;
}
위 코드를 확인해보아도, RequestBody 매핑하기 위한 규칙을 모두 지킨 것을 볼 수 있다.
1. 객체의 필드명과 Json 데이터의 이름이 동일하다.
2. Getter와 기본생성자가 DTO 클래스에 있다.
📣참고!
Spring Boot가 JSON을 매핑하는 구현체로 Jackson 라이브러리를 사용한다. 정확히는 Jackson의 ObjectMapper !
스프링부트 스타터에 포함되어 있는 jackson라이브러리가 있어서 JSON을 Java Object로 변환할 수 있다.
Jackson은 Post요청시 Jackson2HttpMessageConverter이 데이터를 처리하는데 내부적으로 ObjectMapper를 사용한다.
ObjectMapper 는 기본생성자와 public getter 혹은 setter 혹은 public field를 보고 property명을 찾는다.
그래서 기본생성자와 getter만 있어도 prorperty명을 찾아 값을 주입시켜주는 것이다.
내 경우의 에러가 진짜 뭐가 문제인지 모르겠어서 한참 해멨다.
해결
에러의 원인이 무엇인지 결론부터 말하자면,
@RequestBody 의 어노테이션 import를 잘못했다...
객체 mapping을 위한 어노테이션은
org.springframwork.web.bind.annotation 경로에 있는 것을 import 해야 된다.
결론
그래도 이번에 왜 자꾸 객체를 null로 받는 것인지 원인이 무엇인지 찾으면서,
jackson ObjectMapper 에 대해 다시 한 번 공부했고, @RequestBody 에 대해 좀 더 깊게 알아볼 수 있었다!
📌 나처럼 어이없는 실수를 한 분들이 있다면, 도움 되길 바란다.🥲
'Back > Spring Boot' 카테고리의 다른 글
[Gradle] 내부망(폐쇄망, 오프라인)에서 Springboot gradle 빌드 (0) | 2024.08.14 |
---|---|
컨트롤러에서 Enum 타입 @RequestParam @PathVariable로 매핑하기 (2) | 2024.04.15 |
[SpringBoot, Tomcat] Tomcat JNDI DB 정보 암호화 (0) | 2023.10.24 |
[SpringBoot] 외장 tomcat에 JNDI 설정 (+war) (1) | 2023.10.23 |
[SpringBoot] war로 배포하기, 외장 톰캣 구동 (+Trouble Shooting) (1) | 2023.10.11 |
댓글