티스토리 뷰
1. 문제점
뉴스 요약 서버를 제작하던 중에 만난 에러이다.
database 에 저장되어 있는 news를 다음과 같이 json 형식으로 서빙해주는 과정에서
news id 가 실제 id와 다르게 전달되는 문제가 발생했다.
실제 news_id : 11000010011308327
반환 news_id : 11000010011308328
2. 원인
id가 변하는 시점을 파악하기 위하여 spring server 내부에서 id가 전달되는 과정 마다 log 를 찍어 보았다.
dto → controller → service → repository → domain
→ dto → repository → service → controller 순 으로 데이터가 전달 되는데 서버 내부에서는 변화가 없었다.
즉 dto가 json 으로 변환되는 과정에서 값이 변한다고 예측이 가능했다.
json 에서 지정하는 value 값의 종류를 확인할 수 있는데 숫자와 관련된 타입은 전부 number 로 처리하는 것을 확인할 수 있다.
따라서 java의 대부분의 json parser (entity or dto 객체를 json으로 변환시켜주는 역할을 수행) 는
java의 Integer , double, Long 과 같은 숫자 타입을 전부 double로 먼저 바꾼뒤 double을 json의 number 에 매칭 시킨다. 이때 java 의 double type은 15 - 16자리의 유효숫자를 가지는데, 만약 double 로 변형하려는 long type이 15 - 16 자리 이상의 길이를 가진다면 정확도 측면에서 에러를 마주칠 수 있다.
3. 해결
1) dto 의 id type을 Long 에서 String 으로 바꾸면 해결된다.
2)
spring 은 JsonConverter 로 MappingJackson2HttpMessageConverter 을 이용하는데 이 부분을 수정해서 기존의 long 에서 string으로 타입변화 없이 정확한 json 매핑이 가능할듯 하다.
(더 많은 조사와 공부 이후에 내용 추가하겠습니다.)
'spring' 카테고리의 다른 글
[Spring] Spring Security [로그인한 사용자 정보 가져오기/ get user principal] (0) | 2021.07.02 |
---|