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

[채팅] 채팅 기능 연동 #39

Open
8 tasks done
ypjun100 opened this issue Jul 31, 2024 · 10 comments · Fixed by #50
Open
8 tasks done

[채팅] 채팅 기능 연동 #39

ypjun100 opened this issue Jul 31, 2024 · 10 comments · Fixed by #50
Assignees
Labels
feature 기능 구현 요청 레이블

Comments

@ypjun100
Copy link
Collaborator

ypjun100 commented Jul 31, 2024

Description

MongoDB를 기반한 채팅 기능 추가

Todo

  • 채팅방 관련 엔티티 생성
  • 소켓 채팅 구현
  • MongoDB 연동 (엔티티 생성)
  • 더미 유저 및 채팅방 생성하는 테스트 코드 작성
  • 채팅방 정보 및 메시지 목록 API 구현
  • 현재 사용자가 참여중인 채팅방 목록 API 구현 (JWT 연동, 테스트 코드 포함)
  • 유저가 소켓에 접속 중이 아닌 경우 미확인 메시지에 데이터 추가하도록 구현
  • 미확인 메시지 API 구현 (테스트 코드 포함)

Etc

  • Socket.io 활용하기
@ypjun100 ypjun100 added the feature 기능 구현 요청 레이블 label Jul 31, 2024
@ypjun100 ypjun100 added this to the 서비스 로직 구현 milestone Jul 31, 2024
@ypjun100 ypjun100 self-assigned this Jul 31, 2024
@ypjun100
Copy link
Collaborator Author

ypjun100 commented Aug 3, 2024

  • Socket.io로 구현시 Spring Cloud 환경에서 제대로 Load Balancing 되지 않을 것으로 판단함
    • 기본적으로 Socket.io를 사용하기 위한 Netty 라이브러리는 스프링 애플리케이션과 다른 서버를 별도로 구축하기 때문
    • 따라서, API Gateway와 생성한 Netty 서버가 정상적으로 연결되지 않을 수 있음

@ypjun100
Copy link
Collaborator Author

ypjun100 commented Aug 3, 2024

  • 기존 Legacy WS 코드를 이용한다고 해도, MSA 환경에서는 동일한 애플리케이션이 여러 개가 띄어질 것이므로, 이 애플리케이션 간 연동 문제가 발생할 수 있음
  • 따라서, MongoDB 내에서 소켓 세션을 저장해서 다른 애플리케이션에서 이 소켓 세션에 접근하여 메시지를 전송할 수 있는지 확인이 필요함

  • MongoDB, Redis 확인 결과, 이 DB에는 Unserializable한 객체를 넣을 수 없는 것을 확인
  • 따라서, Unserializable한 객체인 WebSocketSession 또한 저장되지 않았음
  • 결론적으로, Legacy WS 코드를 활용하여 채팅 기능을 구성하고, 나중에 RabbitMQ를 활용하여 chat 서비스 간의 통신 구현

@ypjun100
Copy link
Collaborator Author

ypjun100 commented Aug 3, 2024

  • Socket.io 대신 SockJS를 이용하여 구현 진행
  • JWT 토큰을 요청 헤더에 넣어 검증하는 방식까지 구현 완료 (코드 리팩토링 필요)

@ypjun100
Copy link
Collaborator Author

ypjun100 commented Aug 4, 2024

  • WebSocketInterceptor에서 토큰 내 이메일 정보를 사용자의 ID로 변환 완료
  • SockJS를 이용한 기본적인 소켓 통신 구현 및 간단한 채팅 테스트 페이지 구성

@ypjun100
Copy link
Collaborator Author

ypjun100 commented Aug 5, 2024

소켓 채팅 구현

  • 사용자 입장
  • 사용자 채팅 메시지 (텍스트, 이미지)
  • 사용자 퇴장

@ypjun100
Copy link
Collaborator Author

  • 채팅방을 구독할 때 JWT 토큰을 검증하고, 해당 세션을 접속 중인 유저라고 판단하여 저장하게 됨
    • 만약 올바르지 않은 JWT 토큰인 경우 예외를 발생시켜 연결을 종료하게 됨
    • 검증된 유저는 더이상의 JWT 토큰 필요없이 통신이 가능함
  • 추후에 유저의 세션이 종료될 때, 해당 유저 세션을 제거하여 더 이상 채팅방에 접속해있지 않다고 판단
  • 이 정보를 바탕으로 '읽지 않은 메시지 API' 구현 예정

@ypjun100
Copy link
Collaborator Author

ypjun100 commented Aug 12, 2024

  • 채팅방 메시지 리스트 불러오는 API 구현 (/api2/chat/room-data?id=test-chatroom)

ypjun100 added a commit that referenced this issue Aug 15, 2024
ref: Message 관련 클래스 이름 변경
@ypjun100
Copy link
Collaborator Author

ypjun100 commented Aug 16, 2024

현재 사용자가 참여중인 채팅방 목록 API 구현

  • JWT 데이터 변경 (해당 변경 내용 msa 브런치에 반영)
  • 웹소켓에서 정상적으로 데이터 불러오는지 확인
  • 변경된 데이터 토대로 현재 사용자 판단 및 채팅방 목록 반환

ypjun100 added a commit that referenced this issue Aug 18, 2024
ypjun100 added a commit that referenced this issue Aug 18, 2024
ref: Message 관련 클래스 이름 변경
ypjun100 added a commit that referenced this issue Aug 18, 2024
…-1

# Conflicts:
#	service-user/src/main/java/com/team13/serviceuser/service/SignInService.java
ypjun100 added a commit that referenced this issue Aug 18, 2024
# Conflicts:
#	service-user/src/main/java/com/team13/serviceuser/service/SignInService.java
@ypjun100
Copy link
Collaborator Author

ypjun100 commented Aug 18, 2024

  • 서버와 클라이언트 간 통신 중 필요없는 데이터에 대해 null을 선언할 수 있도록 Dto 필드 자료형을 모두 참조형으로 변환

@ypjun100
Copy link
Collaborator Author

미구현 기능

  • 공동구매 종료 요청(공동구매 게시자) 및 리뷰 작성(공동구매 참여자)
  • 공동구매 참여자의 공동구매 포기

post 서비스 간 연동이 필요하여 서비스 어느정도 제작 후 연동 예정

@ypjun100 ypjun100 linked a pull request Aug 18, 2024 that will close this issue
ypjun100 added a commit that referenced this issue Aug 18, 2024
* feat: MySQL, MongoDB 엔티티 추가 #39

* feat: log4j2 설정

* feat: ws 프로토콜 추가

* feat: service-user의 토큰 바디 내용 수정

* feat: SockJS를 이용한 기본적인 소켓 통신 구현

* feat: 채팅 사용자 입장 로직
feat: 채팅 메시지에 사용자 이름 필드 추가

* feat: 소켓 채팅 구현 #39

* feat: 메시지 저장을 위한 MongoDB, MySQL 연동 #39

* feat: 채팅방을 구독할 때에만 JWT 토큰을 검증
feat: 채팅방에 접속한 유저 정보를 따로 저장

* feat: SUBSCRIBE 메시지 처리
feat: ENTER, EXIT_SESSION 메시지 제거
feat: 컨트롤러, 서비스 로직 분리

* ref: 파일명 수정, 클래스명 변경

* feat: 채팅방 메시지 목록 API 구현

* feat: ChatroomService 클래스와 ChatMessageService 클래스 통합

* feat: MessageDto에 메시지 시간 추가

* feat: MessageService에서 ChatroomRepository 종속성 제거

* feat: 채팅방 생성 및 참여 API 추가 #39
ref: Message 관련 클래스 이름 변경

* feat: 공동구매 개설 및 참여 시 채팅 메시지 추가

* Entity 및 JWT 업데이트 반영 (#45)

* feat:  user entity와 sql문 (#41)

* feat:  database service_users과 database service_posts 분리
users Table과 posts Table구현

* refactor: db table 쿼리문 update

* ref: user entity db외에 작업 pr 제외

* ref : 커밋문제 해결

* Delete service-user/src/main/java/com/team13/serviceuser/service/UserService.java

user-entity외 기능 commit삭제

* Delete service-post/build.gradle

user-entity외 기능 commit삭제

* Delete service-post/src/main/java/com/team13/servicepost/client/UserServiceClient.java

user-entity외 기능 commit삭제

* Delete service-post/src/main/java/com/team13/servicepost/controller/PostController.java

user-entity외 기능 commit삭제

* Delete service-post/src/main/java/com/team13/servicepost/dto/PostWithUserDetails.java

user-entity외 기능 commit삭제

* Delete service-post/src/main/java/com/team13/servicepost/dto/User.java

user-entity외 기능 commit삭제

* Delete service-post/src/main/java/com/team13/servicepost/entity/Post.java

user-entity외 기능 commit삭제

* Delete service-post/src/main/java/com/team13/servicepost/repository/PostRepository.java

user-entity외 기능 commit삭제

* Delete service-post/src/main/java/com/team13/servicepost/service/PostService.java

user-entity외 기능 commit삭제

* Delete service-post/src/main/resources/application.yml

user-entity외 기능 commit삭제

* Delete service-post/src/main/resources/schema.sql

user-entity외 기능 commit삭제

* Delete service-user/src/main/java/com/team13/serviceuser/repository/UserRepository.java

user-entity외 기능 commit삭제

* Delete service-user/src/main/java/com/team13/serviceuser/controller/UserController.java

user-entity외 기능 commit삭제

* Update User.java

login_id ->email 로 수정

* Update schema.sql

login_id -> email 수정

* ref : user-entity외의 파일 삭제

* Delete service-post/src/main/java/com/team13/servicepost/client/UserServiceClient.java

user-entity외 기능 commit삭제

* Delete service-post/src/main/resources/schema.sql

user-entity외 기능 commit삭제

* Delete service-post/src/main/java/com/team13/servicepost/dto/User.java

user-entity외 기능 commit삭제

---------

Co-authored-by: joamksh <>

* [엔티티] 단일 db 관련 table추가  (#42)

* feat:  database service_users과 database service_posts 분리
users Table과 posts Table구현

* refactor: db table 쿼리문 update

* ref: user entity db외에 작업 pr 제외

* ref : 커밋문제 해결

* Delete service-user/src/main/java/com/team13/serviceuser/service/UserService.java

user-entity외 기능 commit삭제

* Delete service-post/build.gradle

user-entity외 기능 commit삭제

* Delete service-post/src/main/java/com/team13/servicepost/client/UserServiceClient.java

user-entity외 기능 commit삭제

* Delete service-post/src/main/java/com/team13/servicepost/controller/PostController.java

user-entity외 기능 commit삭제

* Delete service-post/src/main/java/com/team13/servicepost/dto/PostWithUserDetails.java

user-entity외 기능 commit삭제

* Delete service-post/src/main/java/com/team13/servicepost/dto/User.java

user-entity외 기능 commit삭제

* Delete service-post/src/main/java/com/team13/servicepost/entity/Post.java

user-entity외 기능 commit삭제

* Delete service-post/src/main/java/com/team13/servicepost/repository/PostRepository.java

user-entity외 기능 commit삭제

* Delete service-post/src/main/java/com/team13/servicepost/service/PostService.java

user-entity외 기능 commit삭제

* Delete service-post/src/main/resources/application.yml

user-entity외 기능 commit삭제

* Delete service-post/src/main/resources/schema.sql

user-entity외 기능 commit삭제

* Delete service-user/src/main/java/com/team13/serviceuser/repository/UserRepository.java

user-entity외 기능 commit삭제

* Delete service-user/src/main/java/com/team13/serviceuser/controller/UserController.java

user-entity외 기능 commit삭제

* Update User.java

login_id ->email 로 수정

* Update schema.sql

login_id -> email 수정

* ref : user-entity외의 파일 삭제

* Delete service-post/src/main/java/com/team13/servicepost/client/UserServiceClient.java

user-entity외 기능 commit삭제

* Delete service-post/src/main/resources/schema.sql

user-entity외 기능 commit삭제

* Delete service-post/src/main/java/com/team13/servicepost/dto/User.java

user-entity외 기능 commit삭제

* feat : post <images,ingredients> 엔티티 GetMapping

* feat : recipe(processes,ingredients)엔티티, Getmapping

* feat : user 엔티티 getmapping

* ref : 단일 db n1 사용

* feat : db 엔티티

* ref : db정보 통일

* ref : 피드백 반영 이름 변경 및 엔티티 중복 이름 수정

* Delete service-user/src/main/java/com/team13/serviceuser/controller/UserController.java

엔티티 관련 코드만 pr 그외 추후 올릴예정

* Delete service-user/src/main/java/com/team13/serviceuser/service/UserService.java

엔티티 관련 코드만 pr 그외 추후 올릴예정

* Delete service-recipe/src/main/java/com/team13/servicerecipe/controller/RecipeController.java

엔티티 관련 코드만 pr 그외 추후 올릴예정

* Delete service-recipe/src/main/java/com/team13/servicerecipe/dto/RecipeWithUserDetails.java

엔티티 관련 코드만 pr 그외 추후 올릴예정

* Delete service-recipe/src/main/java/com/team13/servicerecipe/dto/RecipesIngredientsDTO.java

엔티티 관련 코드만 pr 그외 추후 올릴예정

* Delete service-recipe/src/main/java/com/team13/servicerecipe/dto/RecipesProcessesDTO.java

엔티티 관련 코드만 pr 그외 추후 올릴예정

* Delete service-recipe/src/main/java/com/team13/servicerecipe/dto/User.java

엔티티 관련 코드만 pr 그외 추후 올릴예정

* Delete service-recipe/src/main/java/com/team13/servicerecipe/service/RecipeService.java

엔티티 관련 코드만 pr 그외 추후 올릴예정

* Delete service-recipe/src/main/java/com/team13/servicerecipe/feign/UserServiceClient.java

엔티티 관련 코드만 pr 그외 추후 올릴예정

* Delete service-recipe/src/main/java/com/team13/servicerecipe/service/RecipesIngredientsService.java

엔티티 관련 코드만 pr 그외 추후 올릴예정

* Delete service-recipe/src/main/java/com/team13/servicerecipe/service/RecipesProcessesService.java

엔티티 관련 코드만 pr 그외 추후 올릴예정

* Delete service-post/src/main/java/com/team13/servicepost/controller/PostController.java

엔티티 관련 코드만 pr 그외 추후 올릴예정

* Delete service-post/src/main/java/com/team13/servicepost/dto/PostWithUserDetails.java

엔티티 관련 코드만 pr 그외 추후 올릴예정

* Delete service-post/src/main/java/com/team13/servicepost/dto/PostsImagesDTO.java

엔티티 관련 코드만 pr 그외 추후 올릴예정

* Delete service-post/src/main/java/com/team13/servicepost/dto/PostsIngredientsDTO.java

엔티티 관련 코드만 pr 그외 추후 올릴예정

* Delete service-post/src/main/java/com/team13/servicepost/dto/User.java

엔티티 관련 코드만 pr 그외 추후 올릴예정

* Delete service-post/src/main/java/com/team13/servicepost/feign/UserServiceClient.java

엔티티 관련 코드만 pr 그외 추후 올릴예정

* Delete service-post/src/main/java/com/team13/servicepost/repository/PostRepository.java

엔티티 관련 코드만 pr 그외 추후 올릴예정

* Delete service-post/src/main/java/com/team13/servicepost/service/PostService.java

엔티티 관련 코드만 pr 그외 추후 올릴예정

* Delete service-post/src/main/java/com/team13/servicepost/service/PostsImagesService.java

엔티티 관련 코드만 pr 그외 추후 올릴예정

* Delete service-post/src/main/java/com/team13/servicepost/service/PostsIngredientsService.java

엔티티 관련 코드만 pr 그외 추후 올릴예정

* ref : 클래스명 이전 규칙에 맞게 변경

* Update application.yml

config에 있는 db정보 삭제

* Update application.yml

config에 있는 db정보 생략

* Update application.yml

config에 있는 db정보 생략

* Update LikePost.java

* Update Post.java

* Update LikeRecipe.java

* Update Recipe.java

* Update RecipeComment.java

* Update Review.java

---------

Co-authored-by: joamksh <>
Co-authored-by: Junyeong Yun <[email protected]>

* feat: service-user의 JWT 페이로드 데이터 수정
feat: log4j2 설정

* feat: 쿠키 생성 과정을 서비스 단에서 수행하도록 변경

* ref: JWT 암호키 변수명 수정

---------

Co-authored-by: joamksh <[email protected]>

* feat: JWT 토큰에서 사용자의 이름과 ID를 추출

* feat: 채팅방 조회 시 유저 정보 검증
ref: 채팅방 조회 로직 분리

* feat: 사용자가 참여중인 채팅방 목록 API #39

* fix: expiration 자료형 수정 #48
feat: 유저 ID를 문자열로 수정

* fix: 테스트 코드 제거

* feat: 테스트 페이지에서 초기 메시지 수신

* feat: 쿠키에서 http-only 옵션 제거

* feat: 미확인 메시지 저장 구현 #39

* feat: 미확인 메시지 확인 시 메시지 삭제 #39

* feat: ChatroomDto의 필드 데이터를 참조형으로 변경 #39

* ref: 레거시 코드 변경

---------

Co-authored-by: joamksh <[email protected]>
ypjun100 added a commit that referenced this issue Aug 18, 2024
# Conflicts:
#	service-chat/src/test/java/com/team13/servicechat/WebSocketTest.java
@ypjun100 ypjun100 reopened this Aug 18, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature 기능 구현 요청 레이블
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant