최근 앱 출시를 위해서 밤낮으로 진행하고 있는 예비군 택시 파티 프로젝트의 채팅 부분에서 문제가 생겼다.
"안녕하세요" 이런 식으로 줄바꿈 없이 메시지를 보내면 문제없이 채팅이 전송되고 조회되지만 "안\n녕\n하\n세\n요"와 같이 중간에 줄바꿈을 넣어서 채팅을 보내게 된다면 저장은 되지만 채팅을 조회할 때 Json Parsing 에러가 발생했다.
왜 이런 문제가 생겼을까?
현재 예비군 택시 파티 프로젝트의 채팅은 대략 아래 그림과 같은 순서로 이루어지고 있다.
1. 먼저 stomp를 통해서 클라이언트가 전송한 메시지 객체가 server로 들어온다.
2. server는 메시지 객체를 kafka producer를 통해서 consumer로 전송한다.
3. consumer는 이벤트를 수신하면 redis에 메시지를 저장한다.
이 과정에서 자연스럽게 각 계층 간 전송을 위한 메세지의 직렬화와 역직렬화가 이루어지다가 최종적으로 redis에는 다음과 같은 문자열(json) 형태로 직렬화된 데이터가 저장이 된다.
위와 같이 저장은 잘 되었지만 문제는 채팅 메시지를 조회할 때 발생했다.
{
"id":"89",
"roomId":1,
"userId":"2",
"userNickname":"김준형9253",
"text":"ㅌㅌㅇㅇㅇ
ㅇㅇㅇㅇㅇ
ㅇㅇㅇㅇ",
"imageUrl":"",
"timestamp":"2024-09-07T21:28:03.316742",
"chatMessageType":"TEXT",
"reactions":[],
"isReply":false,
"replyingMessage":""
}
만약에 채팅 메시지의 text가 위 구조처럼 중간에 개행문자가 있다면 해당 값을 꺼내와서 직렬화하는 과정에서 에러가 발생하게 된다.
그 이유는 현재 text는 "ㅌㅌㅇㅇㅇ\nㅇㅇㅇㅇㅇ\nㅇㅇㅇㅇ" 와 같이 개행문자가 포함된 형태로 redis에 저장이 되어 있는 상황인데 이를 바로 직렬화를 하게 된다면 json의 이스케이프에 의해서 우리가 의도한 \n 개행문자가 아닌 이스케이프로 판단하기 때문이다. 따라서 \n을 \\n로 바꿔주어야 직렬화 과정에서 에러 없이 정상적으로 변환이 가능하다.
try {
JsonNode jsonNode = objectMapper.readTree(value.replace("\n","\\n"));
String sender = jsonNode.path("userId").asText();
String content = jsonNode.path("text").asText();
String nickname = jsonNode.path("userNickname").asText();
ChatMessageType chatMessageType = ChatMessageType.valueOf(jsonNode.path("chatMessageType").asText());
LocalDateTime timestamp = objectMapper.convertValue(jsonNode.path("timestamp"), LocalDateTime.class);
return LatestMessageResponse.of(sender, content, nickname, chatMessageType, timestamp);
} catch (JsonProcessingException e) {
throw new BadRequestException(ExceptionCode.FAIL_JSON_PARSING);
}
위와 같이 objectMapper.readTree를 할 때 redis에서 불러온 값인 value에 들어있는 \n 값들을 replace를 통해 \\n으로 바꿔주자. 그러면 정상적으로 json 값이 파싱 되게 된다.
'Spring-Boot' 카테고리의 다른 글
스프링부트 JSESSIONID URL 노출 문제 해결하기 feat.Oauth2 (0) | 2024.10.29 |
---|---|
Spring 테스트에서 @Transactional과 비관적 락 사용 시 주의점 (2) | 2024.10.14 |
스프링부트 filter에서 발생한 예외를 핸들링 해보자 (1) | 2024.08.30 |
스프링부트 JPA 모범 사례 - @ManyToMany 연관관계를 효과적으로 구성하는 방법 (0) | 2024.08.23 |
토비의 스프링 3.1 Vol.1 750p ~ 850p 정리 (완료) (2) | 2024.01.05 |