Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

채팅방 생성 및 채팅 기능 구현 #85

Merged
merged 18 commits into from
Nov 6, 2023
Merged

채팅방 생성 및 채팅 기능 구현 #85

merged 18 commits into from
Nov 6, 2023

Conversation

yumyeonghan
Copy link
Collaborator

이슈번호

close: #79

작업 내용 설명

  • 채팅방 생성 및 채팅 기능 구현

리뷰어에게 한마디

ChattingConfig 클래스 설정 파일에서 웹소켓 관련 설정을 해줍니다.

   // 웹소켓 연결을 위한 엔드 포인트를 설정하는 코드이며, CORS 오류를 해결하기 위해 모든 오리진으로부터 연결을 허용했습니다.
  @Override
  public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/stomp").setAllowedOriginPatterns("*");
  }
  
   // "/pub" 경로를 통해클라이언트에서 서버로 메세지를 발행(전송) 하며
   // "/sub" 경로를 구독자(채팅방 사람)에게 메시지 전송을 위한 브로커로 활성화합니다
  @Override
  public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.enableSimpleBroker("/sub");
    registry.setApplicationDestinationPrefixes("/pub");
  }

   // 웹 소켓 연결할 때 인증 및 인가 절차를 위해 인터셉터를 추가 설정합니다.
  @Override
  public void configureClientInboundChannel(ChannelRegistration registration) {
    registration.interceptors(new StompInterceptor(jwtTokenProvider, refreshTokenQuery));
  }

StompInterceptor 인터셉터 클래스에서 인증 및 인가 절차를 진행합니다.

  • 예외 발생
    • StompHeaderAccessor 를 찾을 수 없을때
    • 액세스 토큰으로부터의 사용자 정보가 유효하지 않을때
  @Override
  public Message<?> preSend(Message<?> message, MessageChannel channel) {
    StompHeaderAccessor headerAccessor = MessageHeaderAccessor.getAccessor(message,
        StompHeaderAccessor.class);
    if (headerAccessor == null) {
      throw new InvalidAuthException(
          STOMP_ACCESSOR_NOT_FOUND,
          STOMP_ACCESSOR_NOT_FOUND_MESSAGE
      );
    }

    if (headerAccessor.getCommand() == StompCommand.CONNECT) {
      String authHeader = String.valueOf(headerAccessor.getNativeHeader("Authorization"));
      if (authHeader != null && authHeader.startsWith("Bearer ", 1)) {
        String token = authHeader.substring(7, authHeader.length() - 1);
        Long userId = jwtTokenProvider.extractUserId(token);
        refreshTokenQuery.getRefreshToken(userId);
        headerAccessor.addNativeHeader("userId", String.valueOf(userId));
      } else {
        throw new InvalidAuthException(
            AUTHENTICATION_FAILED,
            String.format(HEADER_AUTHENTICATION_FAILED_MESSAGE, authHeader)
        );
      }
    }
    return message;
  }

ChattingMessageController 컨트롤러 클래스에서 메세징 기능 작성

  • /pub/chatting/messages 경로를 통해 메세지를 발행한다.
  • /sub/chatting/room/" + request.roomId() 의 경로에 구독자에 메세지를 전송할 브로커를 활성화 한다.
  @MessageMapping("/chatting/messages")
  public void message(@Valid ChatStomp.Request request, SimpMessageHeaderAccessor accessor) {
    Long userId = sessions.get(accessor.getSessionId());
    chattingMessageService.createChattingMessage(request.roomId(), request.content(), userId);
    simpMessageSendingOperations.convertAndSend("/sub/chatting/room/" + request.roomId(),
        request.content());
  }

@yumyeonghan yumyeonghan added the feat 기능 개발 label Nov 6, 2023
@yumyeonghan yumyeonghan added this to the 2차 스프린트 milestone Nov 6, 2023
@yumyeonghan yumyeonghan self-assigned this Nov 6, 2023
Copy link

github-actions bot commented Nov 6, 2023

Test Results

66 tests   66 ✔️  6s ⏱️
30 suites    0 💤
30 files      0

Results for commit 4767225.

@yumyeonghan yumyeonghan merged commit 8bc6a17 into dev Nov 6, 2023
3 checks passed
@yumyeonghan yumyeonghan deleted the feat/#79 branch November 6, 2023 12:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feat 기능 개발
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

🚀 [Feature] 채팅방 생성 기능 구현
2 participants