반응형
1. STOMP 프로토콜과 POST 요청 동시에 테스트
챗봇 대화에서, 클라이언트가 POST 요청을 서버로 보내면, MongoDB에 저장된 채팅 메시지 내역을 STOMP 프로토콜로 클라이언트에게 전달한다.
이 과정에서, 아래 코드의 결과로 전달되는 messageResponse 객체의 payload를 확인하고자 하였으나, 아래와 같이 (truncated)로 log가 잘리는 것을 확인할 수 있다.
simpMessagingTemplate.convertAndSend("/queue/chat/room/" + roomDto.getRoomId(), messageResponse);
더보기
2023-09-01 21:28:46.240 TRACE 34120 --- [tboundChannel-7] s.w.s.s.t.s.WebSocketServerSockJsSession : Writing SockJsFrame content='a["MESSAGE\ndestination:/queue/chat/room/c8f4-mentor3\ncontent-type:application/...(truncated)'
APIC 도구를 사용한 테스트
APIC 도구를 설치해서 테스트하였다.
apic을 설치한 이후, 동일한 폴더 아래에 Stomp, Post Request를 생성 및 저장한다.
POST 요청 설정. json 으로 보낸다.
STOMP 프로토콜 설정. connect
이후 POST API에서 요청을 실행하면, Messages에 결과가 출력되는 것을 확인할 수 있다.
그 외 시도했으나 해결하지 못한 방법들(log truncated 해결 시도)
1. stackoverflow를 참고하여, application.yml에 아래와 같이 작성하였으나 해결하지 못함
logging:
level:
org:
springframework:
messaging: trace
web:
socket: trace
servlet:
mvc:
method:
annotation:
RequestResponseBodyMethodProcessor: trace
HttpEntityMethodProcessor: trace
2. logback-spring.yml 파일에 log 길이 설정 및 파일 저장하도록 설정하였으나 해결하지 못함.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<!-- Console Appender -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %.-10000msg%n</pattern>
</encoder>
</appender>
<!-- File Appender -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs/application.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %.-10000msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- Archive log every day -->
<fileNamePattern>./logs/application.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- Keep 7 days worth of history -->
<maxHistory>7</maxHistory>
</rollingPolicy>
</appender>
<!-- Loggers -->
<!-- <logger name="com.your.package" level="DEBUG"/>-->
<!-- Root logger -->
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
2. convertAndSend() 메서드 사용 시 주의사항
기존 REST API 응답과, convertAndSend() 메서드를 사용해서 응답을 보내는 json 결과 양식이 다르다.
1. REST API 응답
@GetMapping("/userinfo")
public ResponseEntity<ApiResponse<List<RoomInfoResponse>>> getAllRoomsOfUser(@RequestParam("nickname") String nickname) {
List<RoomInfoResponse> roomInfoResponseList = mainPageService.getAllRoomsOfUser(nickname);
return ResponseEntity.status(HttpStatus.OK)
.body(ApiResponse.success(SuccessCode.GET_USER_ROOMS_AVAILABLE, roomInfoResponseList));
}
1-1. 결과
{
"code": 200,
"message": "사용자의 채팅방 목록을 불러오는데 성공하였습니다",
"data": [
{
"roomId": "7358c455-e8e5-5237-8576-953b91d49546",
"nickname": "mentor3",
"imgUrl": "https://menjil.s3.ap-northeast-2.amazonaws.com/profile/mentor/mentor_3.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20230829T104937Z&X-Amz-SignedHeaders=host&X-Amz-Expires=604800&X-Amz-Credential=AKIAUWPKLTXOOCDBXFEL%2F20230829%2Fap-northeast-2%2Fs3%2Faws4_request&X-Amz-Signature=ca596afc9aa967fefcd6eb80bc5adda00ff2914a528fb1f7f759825c37e1a703",
"lastMessage": null,
"lastMessageTime": "2023-08-29 19:32:28"
},
{
"roomId": "3ab6ca5e-ceb9-5ee8-9ffa-82d1d8ebe5d0",
"nickname": "mentor1",
"imgUrl": "https://menjil.s3.ap-northeast-2.amazonaws.com/profile/mentor/mentor_1.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20230829T104937Z&X-Amz-SignedHeaders=host&X-Amz-Expires=604799&X-Amz-Credential=AKIAUWPKLTXOOCDBXFEL%2F20230829%2Fap-northeast-2%2Fs3%2Faws4_request&X-Amz-Signature=c7bc7a1b30db6866d0d067733bfc1b9b81f28a62ef2a5e0c0376fd58012ee093",
"lastMessage": null,
"lastMessageTime": "2023-08-29 19:32:06"
},
]
}
2. convertAndSend() 메서드를 사용한 DTO 전달
@PostMapping("/room/enter")
public void enterTheRoom(@RequestBody RoomDto roomDto) {
List<MessageResponse> messageList = roomService.enterTheRoom(roomDto);
ResponseEntity<ApiResponse<List<MessageResponse>>> messageResponse;
if (messageList.size() > 1) {
messageResponse = ResponseEntity.status(HttpStatus.CREATED)
.body(ApiResponse.success(SuccessCode.MESSAGE_LOAD_SUCCESS, messageList));
} else {
// messageList의 개수가 1개인 경우는, 처음 입장했을 때와, 재입장했을 때 두 가지 경우가 동시에 존재한다
if (messageList.get(0).getOrder() == null) {
// This case is when the user enters the room at the first time.
messageResponse = ResponseEntity.status(HttpStatus.CREATED)
.body(ApiResponse.success(SuccessCode.MESSAGE_LOAD_SUCCESS, messageList));
} else {
messageResponse = ResponseEntity.status(HttpStatus.CREATED)
.body(ApiResponse.success(SuccessCode.MESSAGE_LOAD_SUCCESS, messageList));
}
}
// /queue/chat/room/{room id}로 메세지 보냄
simpMessagingTemplate.convertAndSend("/queue/chat/room/" + roomDto.getRoomId(), messageResponse);
}
2-1. 결과
headers, body, statusCode, statusCodeValue 가 생성되어서 같이 전달된다.
{
"headers": {},
"body": {
"code": 201,
"message": "채팅 내역을 불러오는데 성공하였습니다",
"data": [
{
"order": 2,
"roomId": "c8f4-mentor3",
"senderType": "MENTOR",
"senderNickname": "mentor3",
"message": "당신의 궁금증을 빠르게 해결할 수 있게 도와줄 AI 서포터입니다.\n멘토의 답변을 기다리면서, 당신의 질문과 유사한 질문에서 시작된 대화를 살펴보실래요?\n더 신속하게, 다양한 해답을 얻을 수도 있을 거예요!",
"messageList": null,
"messageType": "AI_QUESTION_RESPONSE",
"time": "2023-09-01 21:23:31"
},
{
"order": 1,
"roomId": "c8f4-mentor3",
"senderType": "MENTOR",
"senderNickname": "mentor3",
"message": "안녕하세요 서울과기대21님!\n멘토 mentor3입니다. 질문을 입력해주세요",
"messageList": null,
"messageType": "ENTER",
"time": "2023-09-01 19:07:55"
}
]
},
"statusCode": "CREATED",
"statusCodeValue": 201
}
반응형
'멘질멘질] 2023 졸업 프로젝트' 카테고리의 다른 글
Spring Boot] API 문서의 신뢰도를 높이기 위한 Spring Rest Docs 도입 (0) | 2024.01.22 |
---|---|
AWS] 컨테이너 이미지를 사용한 AWS Lambda 배포 (0) | 2023.08.24 |
Junit5] @CreatedDate NullPointer Exception (0) | 2023.07.22 |
Ubuntu] Docker 용량 줄이기 (0) | 2023.06.25 |
Ubuntu] Next.js Dockerfile 경량화(Optimize) (0) | 2023.06.22 |