멘질멘질] 2023 졸업 프로젝트

Spring Boot] STOMP 프로토콜

2023. 9. 1. 21:48
목차
  1. 1. STOMP 프로토콜과 POST 요청 동시에 테스트
  2. APIC 도구를 사용한 테스트
  3. apic을 설치한 이후, 동일한 폴더 아래에 Stomp, Post Request를 생성 및 저장한다.
  4. POST 요청 설정. json 으로 보낸다.
  5. STOMP 프로토콜 설정. connect
  6. 이후 POST API에서 요청을 실행하면, Messages에 결과가 출력되는 것을 확인할 수 있다. 
  7. 그 외 시도했으나 해결하지 못한 방법들(log truncated 해결 시도)
  8. 2. convertAndSend() 메서드 사용 시 주의사항
반응형

 

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
  1. 1. STOMP 프로토콜과 POST 요청 동시에 테스트
  2. APIC 도구를 사용한 테스트
  3. apic을 설치한 이후, 동일한 폴더 아래에 Stomp, Post Request를 생성 및 저장한다.
  4. POST 요청 설정. json 으로 보낸다.
  5. STOMP 프로토콜 설정. connect
  6. 이후 POST API에서 요청을 실행하면, Messages에 결과가 출력되는 것을 확인할 수 있다. 
  7. 그 외 시도했으나 해결하지 못한 방법들(log truncated 해결 시도)
  8. 2. convertAndSend() 메서드 사용 시 주의사항
'멘질멘질] 2023 졸업 프로젝트' 카테고리의 다른 글
  • Spring Boot] API 문서의 신뢰도를 높이기 위한 Spring Rest Docs 도입
  • AWS] 컨테이너 이미지를 사용한 AWS Lambda 배포
  • Junit5] @CreatedDate NullPointer Exception
  • Ubuntu] Docker 용량 줄이기
나른한 찰리
나른한 찰리
반응형
나른한 찰리
Moojun's Storage
나른한 찰리
전체
오늘
어제
  • 분류 전체보기 (83)
    • 포트폴리오 스프링 부트 프로젝트 (1)
    • 멘질멘질] 2023 졸업 프로젝트 (16)
    • 학부연구생 (5)
    • Spring Boot (17)
      • Test Code (10)
    • Amazon Web Services(AWS) (3)
    • Ubuntu Server (1)
    • RDB (6)
    • git (1)
    • 오류 (9)
    • MacOS (4)
    • python library (5)
    • 기타 (8)
    • 프로그래밍 도서 (4)
      • 클린 코드(로버트 마틴) (4)
    • 코딩 테스트 (3)
      • 프로그래머스 (3)
    • 회고 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • pandas#dataframe
  • 우분투#ubuntu#mysql#mysql설치#mysql오류

최근 댓글

최근 글

hELLO · Designed By 정상우.
내 관리 화면으로 이동
나른한 찰리
Spring Boot] STOMP 프로토콜
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.