개발일지/2023_한이음

🚨ERROR -[aws] org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Null key for a Map not allowed in JSON

기억지기 개발자 2023. 9. 13. 20:05

🏕️상황

  • 학교 상세보기 페이지에 들어가면 커리큘럼을 확인할 수 있도록 하는 기능을 구현하는 과정 중이었다.
  • 분명히 로컬에서 기능이 문제없이 잘 돌아가는 것을 확인을 한 후에 aws서버에 올리고, db에 데이터를 insert 하고 나서 실행을 시키니 아래와 같은 오류가 프로젝트 실행 중에 발생하였다.
  • 환장할 노릇이었다. 왜 로컬에서는 잘 되는데 여기서는 이런 오류가 발생하는 것인지
Completed initialization in 3 ms 2023-09-13 04:04:53.035 WARN 325428 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Null key for a Map not allowed in JSON (use a converting NullKeySerializer?); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Null key for a Map not allowed in JSON (use a converting NullKeySerializer?) (through reference chain: hanium.highwayspring.config.res.ResponseDTO["data"]->java.util.HashMap["null"])]

 


💦과정

과정 1)  JSON으로 변환할 때 Map 객체를 허용하지 않는다

그래서 "내가 정의한 클래스 (dto든 entity든)에 Map으로 정의한 적이 있나?" 싶어서 살펴봤더니 그런 사실 없음...

🔜 실패

 

과정 2)  @JsonInclude 사용하기

@JsonInclude(JsonInclude.Include.NON_NULL)

entity 클래스 위에 해당 어노테이션을 붙여서 객체를 JSON으로 변환할 때 필드의 값이 'null'인 경우 필드를 JSON 출력에서 제외하도록 하는 기능을 수행한다.

🔜 실패

 


🗝️해결

아~~무리 코드를 수정하고 또 수정을 해도 해결이 안 됐다.

(aws 인스턴스에서 git pull origin main만 몇 번째 한 건지 모르겠다 ㅋㅋㅋㅋㅋ)

이런 방식으로는 해결이 안 될 거 같아 오류 메시지를 꼼꼼히 파악하고 분석했다.

 

JSON 객체의 키(key)로 null 값이 사용되었을 때 발생하는 오류이다.
(JSON 형식에서는 key에 null 값이 들어가는 것을 허용하지 않는다.)

 

{
       "name": null,
       "age": 30
}

🔼 이런 식으로 사용할 수 없다는 것~~

그럼 결국 key와 value가 매칭이 안 된다는 것인데... 그럼 데이터의 문제일 수도 있겠다는 생각이 들었다..!!

그래서 db의 데이터를 확인해 봐야겠다는 생각이 들었다.

( 처음부터 이렇게 생각하기 힘들었던 이유는 insert문을 실행할 때 성공적으로 쿼리가 실행되는 것을 내가 확인했기 때문이다!!)


curriculum_tb 테이블에 있는 content라는 컬럼의 데이터가 엄청 길어서 aws rds 환경에서는 한눈에 테이블 형태를 확인하기 힘들다. 

 

우리가 흔히 쓰는 로컬 환경의 DBMS처럼 확인도 안 되지, UI도 그냥 cmd 환경이지... 눈으로 일일이 확인을 할 수는 있으나 중간에 뭔가 놓칠 확률 10000%....

 

select *
from [테이블 명]
where [속성명] Is NULL;

그래서 다른 방법을 모색했고 기가 막힌 SQL문을 발견했다~

id 칼럼을 제외하면 총 4개의 칼럼이 있었고 하나씩 해보니 차이점이 생기는 부분을 발견했다.

 

--정상--

🔜 원래 저렇게 핑크 박스의 내용처럼 나오는 게 정상임.  null 여부를 확인했을 때 empty가 나오는 것이 정상~

 

--비정상--

🔜 저런 구문을 어떤 칼럼에 실시하니까 저렇게 데이터가 표시된다면 바로 그 부분이 문제... null이라는 거니까!

 

결국 null인 부분을 찾아서 데이터를 정상적으로 기입하면 오류 해결~~