-
Notifications
You must be signed in to change notification settings - Fork 0
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
(REVERT) Fix/notification token : 잘못 삭제한 브랜치 #284
Merged
Merged
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
notificationToken 재생성 로직 수정 - 이전에 같은 기기에서 로그인한 이력이 있다면 재활용 함 (다른 유저에서 사용했던 pushToken이라면 다른 유저의 NotificationToken의 pushToken은 null처리해줌) - 같은 pushToken을 갖고 있는 다른 유저라면 해당 pushToken을 포함하는 NotificationToken의 pushToken의 값은 null이 됨
chore 및 null 처리
chore (테스트 시에 설정해둔 주석 해제)
보낼 대상자가 notificationToken값이 없을 때의 Exception 핸들링 -> 넘어가도록
- fix : 본인이 보낸 채팅은 unholdChatCount에 포함되지 않도록 수정 - refactor : 싱글 채팅방 퇴장 메시지 보내지지 않도록, 단 메시지 전송을 제외한 EXITED 상태 변경 로직은 동일
KooSuYeon
force-pushed
the
fix/notificationToken
branch
from
November 14, 2024 08:25
1a9d39c
to
a93036a
Compare
KooSuYeon
added a commit
that referenced
this pull request
Nov 14, 2024
* fix/notificationToken-1: notificationToken 재생성 로직 수정 - 이전에 같은 기기에서 로그인한 이력이 있다면 재활용 함 (다른 유저에서 사용했던 pushToken이라면 다른 유저의 NotificationToken의 pushToken은 null처리해줌) - 같은 pushToken을 갖고 있는 다른 유저라면 해당 pushToken을 포함하는 NotificationToken의 pushToken의 값은 null이 됨 * fix/notificationToken-2: chore 및 null 처리 * fix/notificationToken-3: chore (테스트 시에 설정해둔 주석 해제) * hotfix/chatroom-lastholdat: lastHoldAt ChatroomMember 만들 시에 명시할 것 * fix/notificationToken-4: 보낼 대상자가 notificationToken값이 없을 때의 Exception 핸들링 -> 넘어가도록 * fix/notificationToken-5: - fix : 본인이 보낸 채팅은 unholdChatCount에 포함되지 않도록 수정 - refactor : 싱글 채팅방 퇴장 메시지 보내지지 않도록, 단 메시지 전송을 제외한 EXITED 상태 변경 로직은 동일
KooSuYeon
added a commit
that referenced
this pull request
Nov 14, 2024
* fix/ddl-content-toLongText-1: (#281) * fix/ddl-content-toLongText-1: - POST, COMMENT : DDL 긴 게시글 내용 작성 가능하도록 수정 - MEMBER : 한줄소개 이모지 생성 가능한 타입 LONGTEXT로 수정 (프론트쪽에서 글자 수 제한 유) * fix/ddl-content-toLongText-2: spotlessapply * fix/ddl-content-toLongText-3: 불필요한 Chat의 otherRead 삭제 (DDL) * fix/ddl-content-toLongText-4: otherRead 삭제 반영 * fix(profile): MBTI 선택 안함 옵션을 위해 null로 저장 (#283) * Rebase/from prod to dev (#285) * Dev (#274) * Perf/single chatroom: 베타테스트를 위한 채팅 DTO 수정 (#240) * perf/singleChatroom-1: 채팅 조회 총정리, 채팅방 조회 DTO 수정 - SINGLE, AUTH : 본인이 속한 일대일 채팅방 조회 - GROUP, AUTH : 본인이 속한 그룹 채팅방 조회 - AUTH : 본인이 방장인 그룹 채팅방 조회 - 채팅방 DTO 재활용을 위한 인터페이스 화 진행 - 싱글 채팅방 조회 메서드 새로 생성 - 채팅방 조회 DTO에서 채팅들 삭제 * perf/singleChatroom-2: JPA 간단화 및 채팅 RedisDTO에 민감한 정보 제외 * perf/singleChatroom-3: chore 및 누락 Liquibase 되살리기 * perf/singleChatroom-4: Spotlessapply 적용 * perf/singleChatroom-5: @JsonIgnoreProperty 적용해 Override해서 불러오지 말아야 할 값 안 가져옴 * perf/singleChatroom-7: 중복해서 들어간 @JsonIgnoreProperty 삭제 * perf/singleChatroom-8: 중복해서 들어간 Liquibase 코드 삭제 * perf/singleChatroom-9: 채팅 응답 DTO에서 누락된 채팅 ID 표시 * perf/exceptMemberDto-1: 수정 회원 응답 DTO 적용 (MemberService 제외) (#241) * perf/exceptMemberDto-1: 수정 회원 응답 DTO 적용 (MemberService 제외) * perf/exceptMemberDto-2: 1차 서비스 코드 정리 * hotfix/bookmarkAndtime-1: Created 기준 시간 -> 한국 시간으로 변경 & 북마크 공개/비공개 게시글 상관없이 가능하도록 수정 (#243) * fix/comment-toMe-notification-1: 자신이 작성한 게시글에는 댓글 작성 알림 오지 않도록 (이전 회의 사항 미 반영본) (#244) * hotfix/chatroom-getChatError-1: 채팅방 조회시 작성자와 다름 문제 해결 (#245) * fix/comment-toMe-notification-1: 자신이 작성한 게시글에는 댓글 작성 알림 오지 않도록 (이전 회의 사항 미 반영본) * hotfix/chatroom-getChatError-1: 채팅방 조회시 작성자와 다름 문제 해결 * hotfix/file-presignurl-1: 누락된 presignurl 수정 코드 추가 (#251) * hotfix/file-profileImg-1: File presignURL ID로 가져오기 작업 - ProfileImg (#253) * Feat/single chatroom exit : 싱글 채팅방 퇴장 및 혼자 남아있을 경우 (상대방 퇴장 시)알림 구현 (#255) * feat/singleChatroom-1: 싱글 채팅방 퇴장 구현 - 기존 채팅방 퇴장은 그룹 채팅방 퇴장만 구현되어 있음 -> 싱글 채팅방 퇴장도 추가 구현 - 그룹 채팅방은 Redisson 처리한 사항이 있어 DB 저장 작업이 필수적임 -> 구별되게 그룹 채팅방 퇴장과 싱글 채팅방 퇴장을 구분 - 채팅 퇴장 시 퇴장 채팅 저장과 Redis 발행은 기존대로 유지 (채팅 보내기와 동일하게 동작함) * feat/singleChatroom-2: 채팅방 퇴장 시 혼자 남은 채팅방 알림구현 - 그룹, 싱글 알림 모두 구현 - 기존 알림 서비스와 동일 - Set의 members에서 한 명의 유저만 남아있을 경우 stream.findFirst() 사용함 - 사용자 언어설정에 따른 번역 알림 추가 * feat/singleChatroom-isRead-1: 싱글 채팅방 읽음 대상자(상대방) 읽었는지 표시 구현 (#256) * feat/singleChatroom-isRead- 1: 싱글 채팅방 읽음 대상자(상대방) 읽었는지 표시 구현 - Chat 엔티티에 해당 Boolean 값인 isOtherRead 생성 - 읽음 대상자 (상대방)이 GET :chats?chatroomId={채팅방 ID}를 하면 해당 isOtherRead를 true로 바꿔줌 * hotfix/chatroom-bookmark-individual-1: 채팅방 별 북마크 조회 가능하도록 수정 * feat/singleChatroom-isRead- 2: 싱글 채팅방 퇴장 시 알림 구현 사항 되돌리기 - 이유 : 불필요 * Feat/chat authorization : 일대일 채팅 JWT Authorization 넣기 (#254) * feat/chat-authorization-1: STOMP 시큐리티 작업 - SecurityWebSockConfig: - SecurityConfig로 보호되지 않았던 /pub, /sub 보안 잠그기 - WebSockConfig: - 채팅 발행하기에 앞서 Client에서 보내준 Authorization 값 STOMP Session에 포함시키기 위한 Interceptor 주입 * feat/chat-authorization-2: WebSocketInterceptor 작업 - WebSocketInterceptor: - CONNCECT -> SEND 모두 authorization을 받아 JWTFilter의 doFilterChain 메서드가 하는 일을 수행함 - 자격증명이 마친다면 StompHeaderAccessor로 회원 이메일을 전달함 * hotfix/chatroom-exit-unsubscribe-1: 기존에 DISCONNECT 했던 채팅방을 UNSUBSCRIBE로 퇴장을 구현함 (#258) * hotfix/chatroom-exit-unsubscribe-1: 기존에 DISCONNECT 했던 채팅방을 UNSUBSCIRBE로 퇴장을 수정함 * hotfix/chatroom-exit-unsubscribe-2: spotlessapply * feat(채팅): 더 세밀한 채팅 관련 인증/인가 조절 구현 (#259) 개요 - 현재 SecurityWebSocketConfig에서 HttpSecurity를 사용하고 있는데, 이를 authorizationManager로 바꾸어 STOMP 명령어별로 인증/인가를 설정할 수 있도록 한다. 수정사항 - 누구나 접속해도 되는 CONNECT, UNSUB, DISCONNECT, HEARTBEAT는 풀어놓고 - MESSAGE, SUB은 인증이 될 경우에만 호출할 수 있도록 한다. - 추가로, SEND /pub, SUBSCRIBE /sub으로의 destination은 무조건 인증된 경우만 접근할 수 있도록 - 이외의 호출은 모두 거절한다. - csrfChannelInterceptor는 csrf 활성화를 제거하기 위한 작업. (브라우저는 어플에서 사용하지 않으므로 csrf 비활성화) - Interceptor의 로직 같은 경우, 초기 CONNECT하는 경우에만 JWT로 해당 유저의 인증상태를 확인한다. (만료된 상황에서 확인하는 과정은 다음 PR에서 진행하도록 하겠습니다.) - authenticated()를 AuthorizationManager에서 사용하려면, 현재 컨텍스트에 setAuthentication을 해주고, 이후의 활용을 위해 accessor.setUser까지 추가해줘야한다. 그래야만 인증이 되었을 때, 문제없이 인증을 할 수 있다. - 참고로, Websocket 자체에서 인증 인가를, Header에서 simpUser로 진행하기 때문에, 기존에 header에 넣어줬던 userEmail을 제거하고 SocketController의 UserDetails 주입을 통해 해당 인증 정보를 가져올 수 있도록 한다. 기존의 userEmail을 이렇게 변경한 이유는, 웹소켓이 초기에 연결이 성립되고 이후에 메시지보내기 등을 사용하면 기존의 Auth 정보는 header에 저장이 되지만, 우리가 직접 넣어줬던 userEmail은 요청마다 새로 다시 넣어줘야하기 때문이다. * fix(error): 웹소켓 에러 시에 이유 함께 보낼 수 있도록 처리 (#260) 개요 - 현재 웹소켓의 연결이 끊길 때 원인이 잘 나오지 않는 문제가 있다. - 에러 발생 시, 원인을 전달하기 위해 StompSubProtocolHandler를 직접 작성한다. - Interceptor에서 에러 체킹을 추가한다. 수정 사항 - 에러 발생 시, 원인을 전달하기 위해 StompSubProtocolHandler를 직접 - 빠른 구현을 위해 링크 참고해서 일부만 수정함: https://velog.io/@jkijki12/%EC%B1%84%ED%8C%85-STOMP-JWT - WebsocketInterceptor에서, JWT가 필요한 Command와 그렇지 않은 Command를 구분해서 알맞게 상황처리를 해준다. - CONNECT, SEND, MESSAGE, SUBSCRIBE는 JWT 필요 - CONNECT의 경우에는 초기 auth 설정해줌 - SUBSCRIBE의 경우에 destination 체킹 진행 - SUBSCRIBE 때, 구독 권한이 있는지 확인한다. - chatroom.getMembers().contains(member) 이 부분에서 Member 인스턴스가 달라도, id로 멤버가 포함되어있는지 체킹이 필요하기 때문에, equals와 hashcode 함께 override (Convention 따라, o 변수 사용) * refactor/chat-exit-auth-1: 개선된 채팅 인증/인가 적용한 채팅방 퇴장 수정 (#261) - 기존에 채팅방 퇴장하면 DISCONNECT 했던 것을 UNSUBSCRIBE로 수정 - messagingTemplate 이용해 UNSUBSCRIBE 메시지 직접 서버에서 전송 chore - 이전에 DISCONNECT 하지 않았어야 하는 enter 부분 코드 Exception 던지는 것으로 수정 - 불필요한 퇴장 시 빈 채팅방 확인 코드 삭제 * Revert "Feat/chatroom re enter (#264)" (#267) This reverts commit c75de60. * Merge/dev (#270) * feat/chatroom-reEnter-1: 재입장 가능하도록 - 중간 테이블 chatroom_exited_member 생성 재입장 로직: - EXIT을 하게 되면 chatroom_member에서 member이 삭제되는 것이 아닌 chatroom_exited_member에 member가 추가되는 것임 - 응답 DTO에 퇴장한 회원 정보 표시 (그룹 채팅방에 접속한 회원 수 표시 목적) * feat/chatroom-reEnter-2: 채팅방 조회 코드 수정 및 chore - ChatService: - EXIT: - 퇴장을 하게 되면 chatroom의 members에서 삭제되는 것이 아닌 exitedMembers에 추가되는 것임 - CHAT: - 퇴장을 한 회원에게는 채팅 알림이 가지 않아야 하기 때문에 제외 코드를 추가함 - ENTER: - 그 후 재 입장을 하게 되면 원래 있던 채팅방에 입장해야 하기 때문에 exitedMembers에서 삭제를 진행하며 입장 알림이 가도록 함 - ChatroomService: - GET 채팅방 조회시에 퇴장한 채팅방은 포함되지 않아야 하기 때문에 filter 코드 추가함 - 퇴장한 채팅방 조회도 가능하도록 추가 - GET : /api/chatrooms?type=EXITED chore - 방장인 채팅방 조회: - GET : /api/chatrooms?type=MANAGER - Test 통과를 위한 JVM 크기 2GB로 늘림 - SWAGGER 반영 완료 * feat/chatroom-reEnter-3: 퇴장한 채팅방 접근 강화 * feat/chatroom-reEnter-4: build messaging 추가 * Merge/dev (#270) (#273) * feat/chatroom-reEnter-1: 재입장 가능하도록 - 중간 테이블 chatroom_exited_member 생성 재입장 로직: - EXIT을 하게 되면 chatroom_member에서 member이 삭제되는 것이 아닌 chatroom_exited_member에 member가 추가되는 것임 - 응답 DTO에 퇴장한 회원 정보 표시 (그룹 채팅방에 접속한 회원 수 표시 목적) * feat/chatroom-reEnter-2: 채팅방 조회 코드 수정 및 chore - ChatService: - EXIT: - 퇴장을 하게 되면 chatroom의 members에서 삭제되는 것이 아닌 exitedMembers에 추가되는 것임 - CHAT: - 퇴장을 한 회원에게는 채팅 알림이 가지 않아야 하기 때문에 제외 코드를 추가함 - ENTER: - 그 후 재 입장을 하게 되면 원래 있던 채팅방에 입장해야 하기 때문에 exitedMembers에서 삭제를 진행하며 입장 알림이 가도록 함 - ChatroomService: - GET 채팅방 조회시에 퇴장한 채팅방은 포함되지 않아야 하기 때문에 filter 코드 추가함 - 퇴장한 채팅방 조회도 가능하도록 추가 - GET : /api/chatrooms?type=EXITED chore - 방장인 채팅방 조회: - GET : /api/chatrooms?type=MANAGER - Test 통과를 위한 JVM 크기 2GB로 늘림 - SWAGGER 반영 완료 * feat/chatroom-reEnter-3: 퇴장한 채팅방 접근 강화 * feat/chatroom-reEnter-4: build messaging 추가 --------- Co-authored-by: Seungho Lee <[email protected]> * Dev (#280) * Perf/single chatroom: 베타테스트를 위한 채팅 DTO 수정 (#240) * perf/singleChatroom-1: 채팅 조회 총정리, 채팅방 조회 DTO 수정 - SINGLE, AUTH : 본인이 속한 일대일 채팅방 조회 - GROUP, AUTH : 본인이 속한 그룹 채팅방 조회 - AUTH : 본인이 방장인 그룹 채팅방 조회 - 채팅방 DTO 재활용을 위한 인터페이스 화 진행 - 싱글 채팅방 조회 메서드 새로 생성 - 채팅방 조회 DTO에서 채팅들 삭제 * perf/singleChatroom-2: JPA 간단화 및 채팅 RedisDTO에 민감한 정보 제외 * perf/singleChatroom-3: chore 및 누락 Liquibase 되살리기 * perf/singleChatroom-4: Spotlessapply 적용 * perf/singleChatroom-5: @JsonIgnoreProperty 적용해 Override해서 불러오지 말아야 할 값 안 가져옴 * perf/singleChatroom-7: 중복해서 들어간 @JsonIgnoreProperty 삭제 * perf/singleChatroom-8: 중복해서 들어간 Liquibase 코드 삭제 * perf/singleChatroom-9: 채팅 응답 DTO에서 누락된 채팅 ID 표시 * perf/exceptMemberDto-1: 수정 회원 응답 DTO 적용 (MemberService 제외) (#241) * perf/exceptMemberDto-1: 수정 회원 응답 DTO 적용 (MemberService 제외) * perf/exceptMemberDto-2: 1차 서비스 코드 정리 * hotfix/bookmarkAndtime-1: Created 기준 시간 -> 한국 시간으로 변경 & 북마크 공개/비공개 게시글 상관없이 가능하도록 수정 (#243) * fix/comment-toMe-notification-1: 자신이 작성한 게시글에는 댓글 작성 알림 오지 않도록 (이전 회의 사항 미 반영본) (#244) * hotfix/chatroom-getChatError-1: 채팅방 조회시 작성자와 다름 문제 해결 (#245) * fix/comment-toMe-notification-1: 자신이 작성한 게시글에는 댓글 작성 알림 오지 않도록 (이전 회의 사항 미 반영본) * hotfix/chatroom-getChatError-1: 채팅방 조회시 작성자와 다름 문제 해결 * hotfix/file-presignurl-1: 누락된 presignurl 수정 코드 추가 (#251) * hotfix/file-profileImg-1: File presignURL ID로 가져오기 작업 - ProfileImg (#253) * Feat/single chatroom exit : 싱글 채팅방 퇴장 및 혼자 남아있을 경우 (상대방 퇴장 시)알림 구현 (#255) * feat/singleChatroom-1: 싱글 채팅방 퇴장 구현 - 기존 채팅방 퇴장은 그룹 채팅방 퇴장만 구현되어 있음 -> 싱글 채팅방 퇴장도 추가 구현 - 그룹 채팅방은 Redisson 처리한 사항이 있어 DB 저장 작업이 필수적임 -> 구별되게 그룹 채팅방 퇴장과 싱글 채팅방 퇴장을 구분 - 채팅 퇴장 시 퇴장 채팅 저장과 Redis 발행은 기존대로 유지 (채팅 보내기와 동일하게 동작함) * feat/singleChatroom-2: 채팅방 퇴장 시 혼자 남은 채팅방 알림구현 - 그룹, 싱글 알림 모두 구현 - 기존 알림 서비스와 동일 - Set의 members에서 한 명의 유저만 남아있을 경우 stream.findFirst() 사용함 - 사용자 언어설정에 따른 번역 알림 추가 * feat/singleChatroom-isRead-1: 싱글 채팅방 읽음 대상자(상대방) 읽었는지 표시 구현 (#256) * feat/singleChatroom-isRead- 1: 싱글 채팅방 읽음 대상자(상대방) 읽었는지 표시 구현 - Chat 엔티티에 해당 Boolean 값인 isOtherRead 생성 - 읽음 대상자 (상대방)이 GET :chats?chatroomId={채팅방 ID}를 하면 해당 isOtherRead를 true로 바꿔줌 * hotfix/chatroom-bookmark-individual-1: 채팅방 별 북마크 조회 가능하도록 수정 * feat/singleChatroom-isRead- 2: 싱글 채팅방 퇴장 시 알림 구현 사항 되돌리기 - 이유 : 불필요 * Feat/chat authorization : 일대일 채팅 JWT Authorization 넣기 (#254) * feat/chat-authorization-1: STOMP 시큐리티 작업 - SecurityWebSockConfig: - SecurityConfig로 보호되지 않았던 /pub, /sub 보안 잠그기 - WebSockConfig: - 채팅 발행하기에 앞서 Client에서 보내준 Authorization 값 STOMP Session에 포함시키기 위한 Interceptor 주입 * feat/chat-authorization-2: WebSocketInterceptor 작업 - WebSocketInterceptor: - CONNCECT -> SEND 모두 authorization을 받아 JWTFilter의 doFilterChain 메서드가 하는 일을 수행함 - 자격증명이 마친다면 StompHeaderAccessor로 회원 이메일을 전달함 * hotfix/chatroom-exit-unsubscribe-1: 기존에 DISCONNECT 했던 채팅방을 UNSUBSCRIBE로 퇴장을 구현함 (#258) * hotfix/chatroom-exit-unsubscribe-1: 기존에 DISCONNECT 했던 채팅방을 UNSUBSCIRBE로 퇴장을 수정함 * hotfix/chatroom-exit-unsubscribe-2: spotlessapply * feat(채팅): 더 세밀한 채팅 관련 인증/인가 조절 구현 (#259) 개요 - 현재 SecurityWebSocketConfig에서 HttpSecurity를 사용하고 있는데, 이를 authorizationManager로 바꾸어 STOMP 명령어별로 인증/인가를 설정할 수 있도록 한다. 수정사항 - 누구나 접속해도 되는 CONNECT, UNSUB, DISCONNECT, HEARTBEAT는 풀어놓고 - MESSAGE, SUB은 인증이 될 경우에만 호출할 수 있도록 한다. - 추가로, SEND /pub, SUBSCRIBE /sub으로의 destination은 무조건 인증된 경우만 접근할 수 있도록 - 이외의 호출은 모두 거절한다. - csrfChannelInterceptor는 csrf 활성화를 제거하기 위한 작업. (브라우저는 어플에서 사용하지 않으므로 csrf 비활성화) - Interceptor의 로직 같은 경우, 초기 CONNECT하는 경우에만 JWT로 해당 유저의 인증상태를 확인한다. (만료된 상황에서 확인하는 과정은 다음 PR에서 진행하도록 하겠습니다.) - authenticated()를 AuthorizationManager에서 사용하려면, 현재 컨텍스트에 setAuthentication을 해주고, 이후의 활용을 위해 accessor.setUser까지 추가해줘야한다. 그래야만 인증이 되었을 때, 문제없이 인증을 할 수 있다. - 참고로, Websocket 자체에서 인증 인가를, Header에서 simpUser로 진행하기 때문에, 기존에 header에 넣어줬던 userEmail을 제거하고 SocketController의 UserDetails 주입을 통해 해당 인증 정보를 가져올 수 있도록 한다. 기존의 userEmail을 이렇게 변경한 이유는, 웹소켓이 초기에 연결이 성립되고 이후에 메시지보내기 등을 사용하면 기존의 Auth 정보는 header에 저장이 되지만, 우리가 직접 넣어줬던 userEmail은 요청마다 새로 다시 넣어줘야하기 때문이다. * fix(error): 웹소켓 에러 시에 이유 함께 보낼 수 있도록 처리 (#260) 개요 - 현재 웹소켓의 연결이 끊길 때 원인이 잘 나오지 않는 문제가 있다. - 에러 발생 시, 원인을 전달하기 위해 StompSubProtocolHandler를 직접 작성한다. - Interceptor에서 에러 체킹을 추가한다. 수정 사항 - 에러 발생 시, 원인을 전달하기 위해 StompSubProtocolHandler를 직접 - 빠른 구현을 위해 링크 참고해서 일부만 수정함: https://velog.io/@jkijki12/%EC%B1%84%ED%8C%85-STOMP-JWT - WebsocketInterceptor에서, JWT가 필요한 Command와 그렇지 않은 Command를 구분해서 알맞게 상황처리를 해준다. - CONNECT, SEND, MESSAGE, SUBSCRIBE는 JWT 필요 - CONNECT의 경우에는 초기 auth 설정해줌 - SUBSCRIBE의 경우에 destination 체킹 진행 - SUBSCRIBE 때, 구독 권한이 있는지 확인한다. - chatroom.getMembers().contains(member) 이 부분에서 Member 인스턴스가 달라도, id로 멤버가 포함되어있는지 체킹이 필요하기 때문에, equals와 hashcode 함께 override (Convention 따라, o 변수 사용) * refactor/chat-exit-auth-1: 개선된 채팅 인증/인가 적용한 채팅방 퇴장 수정 (#261) - 기존에 채팅방 퇴장하면 DISCONNECT 했던 것을 UNSUBSCRIBE로 수정 - messagingTemplate 이용해 UNSUBSCRIBE 메시지 직접 서버에서 전송 chore - 이전에 DISCONNECT 하지 않았어야 하는 enter 부분 코드 Exception 던지는 것으로 수정 - 불필요한 퇴장 시 빈 채팅방 확인 코드 삭제 * Revert "Feat/chatroom re enter (#264)" (#267) This reverts commit c75de60. * Merge/dev (#270) * feat/chatroom-reEnter-1: 재입장 가능하도록 - 중간 테이블 chatroom_exited_member 생성 재입장 로직: - EXIT을 하게 되면 chatroom_member에서 member이 삭제되는 것이 아닌 chatroom_exited_member에 member가 추가되는 것임 - 응답 DTO에 퇴장한 회원 정보 표시 (그룹 채팅방에 접속한 회원 수 표시 목적) * feat/chatroom-reEnter-2: 채팅방 조회 코드 수정 및 chore - ChatService: - EXIT: - 퇴장을 하게 되면 chatroom의 members에서 삭제되는 것이 아닌 exitedMembers에 추가되는 것임 - CHAT: - 퇴장을 한 회원에게는 채팅 알림이 가지 않아야 하기 때문에 제외 코드를 추가함 - ENTER: - 그 후 재 입장을 하게 되면 원래 있던 채팅방에 입장해야 하기 때문에 exitedMembers에서 삭제를 진행하며 입장 알림이 가도록 함 - ChatroomService: - GET 채팅방 조회시에 퇴장한 채팅방은 포함되지 않아야 하기 때문에 filter 코드 추가함 - 퇴장한 채팅방 조회도 가능하도록 추가 - GET : /api/chatrooms?type=EXITED chore - 방장인 채팅방 조회: - GET : /api/chatrooms?type=MANAGER - Test 통과를 위한 JVM 크기 2GB로 늘림 - SWAGGER 반영 완료 * feat/chatroom-reEnter-3: 퇴장한 채팅방 접근 강화 * feat/chatroom-reEnter-4: build messaging 추가 * Merge/dev (#270) (#273) * feat/chatroom-reEnter-1: 재입장 가능하도록 - 중간 테이블 chatroom_exited_member 생성 재입장 로직: - EXIT을 하게 되면 chatroom_member에서 member이 삭제되는 것이 아닌 chatroom_exited_member에 member가 추가되는 것임 - 응답 DTO에 퇴장한 회원 정보 표시 (그룹 채팅방에 접속한 회원 수 표시 목적) * feat/chatroom-reEnter-2: 채팅방 조회 코드 수정 및 chore - ChatService: - EXIT: - 퇴장을 하게 되면 chatroom의 members에서 삭제되는 것이 아닌 exitedMembers에 추가되는 것임 - CHAT: - 퇴장을 한 회원에게는 채팅 알림이 가지 않아야 하기 때문에 제외 코드를 추가함 - ENTER: - 그 후 재 입장을 하게 되면 원래 있던 채팅방에 입장해야 하기 때문에 exitedMembers에서 삭제를 진행하며 입장 알림이 가도록 함 - ChatroomService: - GET 채팅방 조회시에 퇴장한 채팅방은 포함되지 않아야 하기 때문에 filter 코드 추가함 - 퇴장한 채팅방 조회도 가능하도록 추가 - GET : /api/chatrooms?type=EXITED chore - 방장인 채팅방 조회: - GET : /api/chatrooms?type=MANAGER - Test 통과를 위한 JVM 크기 2GB로 늘림 - SWAGGER 반영 완료 * feat/chatroom-reEnter-3: 퇴장한 채팅방 접근 강화 * feat/chatroom-reEnter-4: build messaging 추가 * feat/chatroom-dto-add-lastChat-1: 채팅방 GET요청 시 최신 순 정렬된 마지막 채팅 DTO에 추가 (#272) * chore(log): 버그 확인 용도로 사용한 로깅 삭제 (#275) 개요 - 꿀팁게시판 자유게시판이 섞이는 부분의 확인을 위해 로깅함수를 사용했는데 이를 삭제한다. * fix(ws): 웹소켓 HEARTBEAT 안되는 문제 구현 (#276) * hotfix/member-like-mapping-1: 회원정보 불러올 때 ResponseMapper 수정 (제대로 Hobbies와 Languages 불러오도록) (#278) * Feat/chatroom exit and re enter : 퇴장 후 재 입장 코드 로직 수정 및 개선 (#277) * feat/chatroom-exit-and-reEnter-1: 퇴장 채팅방과 회원 엔티티 간의 중간 테이블 생성 - 생성한 원인으로는 기존에 만들었던 테이블 (채팅방과 회원)으로는 reEnterTime 컬럼을 생성할 수 없었기 때문 - 퇴장 로직 설명: - 퇴장을 하면 중간테이블인 ChatroomExitedMember가 생김 - 해당 테이블에 채팅방, 회원 reEnterTime이 생김 - 재입장 하지 않는 한 해당 테이블의 reEnterTime은 null임 (퇴장, 재입장, 퇴장 시에도 null) - 채팅방, 회원 간에 unique해야 하는 테이블이므로 uniqueConstraints 값 설정 * feat/chatroom-exit-and-reEnter-2: 퇴장 후 재입장 및 채팅 불러오기 로직 정리 - 재입장 로직: - 재입장 시에는 CheckPoint에 시각이 찍힘 - 이는 채팅 불러오기, 채팅방 구독 전 EXITED 채팅방 불러오기 시에 사용 - GET :/chats?chatroomId={} 시에 getChats를 할 때에 reEnterTime 이후에 유효한 채팅이 자동으로 적용되어 들어감 - docs : Liquibase 문 기존에 만들어 둔 단순 중간 테이블 삭제 후 새 테이블 생성 (이중 테이불이 생기는 경우이므로 기존 DDL update 문 삭제 후 생성을 진행함) * feat/chatroom-exit-and-reEnter-3: Migration은 삭제가 아닌 수정을 하자 - 기존 외래키 관계 및 고유 키 drop 후 새로 중간 테이블 새로 생성 - 이전에 선언했던 단순 중간 테이블 v1.0.5.xml 되살리기 * feat/chatroom-exit-and-reEnter-4: 중간 테이블 ChatroomMember 재 선언 - ExitMember과 ActiveMember를 함께 관리 * feat/chatroom-exit-and-reEnter-5: 주요 수정 Service - 기존 퇴장, 재입장 로직과 동일 - 채팅방의 ACTIVE 한 채팅방 회원들만 가져오는 함수 모듈화 - getSingleChatroom에 앞선 모듈화 함수를 사용하지 않은 이유로는 재입장 시에 사용하는 엔드포인트에서도 (EXITED) 사용하기 때문 - 재입장 시에만 EXITED 조건을 허용해 주기 때문에 다른 메서드에서는 ACTIVE한 상태인지 확인하는 조건이 추가됨 - 웹소켓 preSend 조건에서 사용하는 isMemberInChatroom에서는 Sub 시에 사용하기 때문에 재 입장 시에도 Sub 먼저 해야 하기 때문에 채팅방과 회원간에 관계가 없을 경우에만 Exception을 내뱉도록 수정함 * feat/chatroom-exit-and-reEnter-6: getMembers -> validMembers 메서드 이용후 contains() 메서드 이용 * feat/chatroom-exit-and-reEnter-7: chore/docs * feat/chatroom-exit-and-reEnter-8: SUB 보안 되살리기 - 앞선 코드에서 SUB를 퇴장한 회원에 한해서는 허용해왔지만 - 퇴장한 회원 가운데에 재입장한 회원에 한해 허용하도록 엔드포인트를 하나 더 생성함 (서버에서 채팅방 회원의 status를 Active로 바꿔주는 엔드포인트) * feat/chatroom-count-1: 채팅방 list 조회 시에 count가 보이도록 구현 (#279) - lastHoldAt : ChatroomMember에 채팅방을 떠날 때에 TimeStamp를 기록 - 해당 값은 채팅방 뒤로가기를 누를 시에, 채팅 목록 조회 시에 업데이트 됨 - Put :/chatrooms/{chatroomId}/hold 엔드포인트 생성 : - 해당 엔드포인트는 채팅방 안읽은 채팅 갯수를 업데이트 하기 위한 용도로 사용됨 --------- Co-authored-by: Seungho Lee <[email protected]> * fix/ddl-content-toLongText-1: (#281) * fix/ddl-content-toLongText-1: - POST, COMMENT : DDL 긴 게시글 내용 작성 가능하도록 수정 - MEMBER : 한줄소개 이모지 생성 가능한 타입 LONGTEXT로 수정 (프론트쪽에서 글자 수 제한 유) * fix/ddl-content-toLongText-2: spotlessapply * fix/ddl-content-toLongText-3: 불필요한 Chat의 otherRead 삭제 (DDL) * fix/ddl-content-toLongText-4: otherRead 삭제 반영 --------- Co-authored-by: Seungho Lee <[email protected]> * (REVERT) Fix/notification token : 잘못 삭제한 브랜치 (#284) * fix/notificationToken-1: notificationToken 재생성 로직 수정 - 이전에 같은 기기에서 로그인한 이력이 있다면 재활용 함 (다른 유저에서 사용했던 pushToken이라면 다른 유저의 NotificationToken의 pushToken은 null처리해줌) - 같은 pushToken을 갖고 있는 다른 유저라면 해당 pushToken을 포함하는 NotificationToken의 pushToken의 값은 null이 됨 * fix/notificationToken-2: chore 및 null 처리 * fix/notificationToken-3: chore (테스트 시에 설정해둔 주석 해제) * hotfix/chatroom-lastholdat: lastHoldAt ChatroomMember 만들 시에 명시할 것 * fix/notificationToken-4: 보낼 대상자가 notificationToken값이 없을 때의 Exception 핸들링 -> 넘어가도록 * fix/notificationToken-5: - fix : 본인이 보낸 채팅은 unholdChatCount에 포함되지 않도록 수정 - refactor : 싱글 채팅방 퇴장 메시지 보내지지 않도록, 단 메시지 전송을 제외한 EXITED 상태 변경 로직은 동일 --------- Co-authored-by: Seungho Lee <[email protected]>
KooSuYeon
added a commit
that referenced
this pull request
Nov 21, 2024
* Dev (#274) * Perf/single chatroom: 베타테스트를 위한 채팅 DTO 수정 (#240) * perf/singleChatroom-1: 채팅 조회 총정리, 채팅방 조회 DTO 수정 - SINGLE, AUTH : 본인이 속한 일대일 채팅방 조회 - GROUP, AUTH : 본인이 속한 그룹 채팅방 조회 - AUTH : 본인이 방장인 그룹 채팅방 조회 - 채팅방 DTO 재활용을 위한 인터페이스 화 진행 - 싱글 채팅방 조회 메서드 새로 생성 - 채팅방 조회 DTO에서 채팅들 삭제 * perf/singleChatroom-2: JPA 간단화 및 채팅 RedisDTO에 민감한 정보 제외 * perf/singleChatroom-3: chore 및 누락 Liquibase 되살리기 * perf/singleChatroom-4: Spotlessapply 적용 * perf/singleChatroom-5: @JsonIgnoreProperty 적용해 Override해서 불러오지 말아야 할 값 안 가져옴 * perf/singleChatroom-7: 중복해서 들어간 @JsonIgnoreProperty 삭제 * perf/singleChatroom-8: 중복해서 들어간 Liquibase 코드 삭제 * perf/singleChatroom-9: 채팅 응답 DTO에서 누락된 채팅 ID 표시 * perf/exceptMemberDto-1: 수정 회원 응답 DTO 적용 (MemberService 제외) (#241) * perf/exceptMemberDto-1: 수정 회원 응답 DTO 적용 (MemberService 제외) * perf/exceptMemberDto-2: 1차 서비스 코드 정리 * hotfix/bookmarkAndtime-1: Created 기준 시간 -> 한국 시간으로 변경 & 북마크 공개/비공개 게시글 상관없이 가능하도록 수정 (#243) * fix/comment-toMe-notification-1: 자신이 작성한 게시글에는 댓글 작성 알림 오지 않도록 (이전 회의 사항 미 반영본) (#244) * hotfix/chatroom-getChatError-1: 채팅방 조회시 작성자와 다름 문제 해결 (#245) * fix/comment-toMe-notification-1: 자신이 작성한 게시글에는 댓글 작성 알림 오지 않도록 (이전 회의 사항 미 반영본) * hotfix/chatroom-getChatError-1: 채팅방 조회시 작성자와 다름 문제 해결 * hotfix/file-presignurl-1: 누락된 presignurl 수정 코드 추가 (#251) * hotfix/file-profileImg-1: File presignURL ID로 가져오기 작업 - ProfileImg (#253) * Feat/single chatroom exit : 싱글 채팅방 퇴장 및 혼자 남아있을 경우 (상대방 퇴장 시)알림 구현 (#255) * feat/singleChatroom-1: 싱글 채팅방 퇴장 구현 - 기존 채팅방 퇴장은 그룹 채팅방 퇴장만 구현되어 있음 -> 싱글 채팅방 퇴장도 추가 구현 - 그룹 채팅방은 Redisson 처리한 사항이 있어 DB 저장 작업이 필수적임 -> 구별되게 그룹 채팅방 퇴장과 싱글 채팅방 퇴장을 구분 - 채팅 퇴장 시 퇴장 채팅 저장과 Redis 발행은 기존대로 유지 (채팅 보내기와 동일하게 동작함) * feat/singleChatroom-2: 채팅방 퇴장 시 혼자 남은 채팅방 알림구현 - 그룹, 싱글 알림 모두 구현 - 기존 알림 서비스와 동일 - Set의 members에서 한 명의 유저만 남아있을 경우 stream.findFirst() 사용함 - 사용자 언어설정에 따른 번역 알림 추가 * feat/singleChatroom-isRead-1: 싱글 채팅방 읽음 대상자(상대방) 읽었는지 표시 구현 (#256) * feat/singleChatroom-isRead- 1: 싱글 채팅방 읽음 대상자(상대방) 읽었는지 표시 구현 - Chat 엔티티에 해당 Boolean 값인 isOtherRead 생성 - 읽음 대상자 (상대방)이 GET :chats?chatroomId={채팅방 ID}를 하면 해당 isOtherRead를 true로 바꿔줌 * hotfix/chatroom-bookmark-individual-1: 채팅방 별 북마크 조회 가능하도록 수정 * feat/singleChatroom-isRead- 2: 싱글 채팅방 퇴장 시 알림 구현 사항 되돌리기 - 이유 : 불필요 * Feat/chat authorization : 일대일 채팅 JWT Authorization 넣기 (#254) * feat/chat-authorization-1: STOMP 시큐리티 작업 - SecurityWebSockConfig: - SecurityConfig로 보호되지 않았던 /pub, /sub 보안 잠그기 - WebSockConfig: - 채팅 발행하기에 앞서 Client에서 보내준 Authorization 값 STOMP Session에 포함시키기 위한 Interceptor 주입 * feat/chat-authorization-2: WebSocketInterceptor 작업 - WebSocketInterceptor: - CONNCECT -> SEND 모두 authorization을 받아 JWTFilter의 doFilterChain 메서드가 하는 일을 수행함 - 자격증명이 마친다면 StompHeaderAccessor로 회원 이메일을 전달함 * hotfix/chatroom-exit-unsubscribe-1: 기존에 DISCONNECT 했던 채팅방을 UNSUBSCRIBE로 퇴장을 구현함 (#258) * hotfix/chatroom-exit-unsubscribe-1: 기존에 DISCONNECT 했던 채팅방을 UNSUBSCIRBE로 퇴장을 수정함 * hotfix/chatroom-exit-unsubscribe-2: spotlessapply * feat(채팅): 더 세밀한 채팅 관련 인증/인가 조절 구현 (#259) 개요 - 현재 SecurityWebSocketConfig에서 HttpSecurity를 사용하고 있는데, 이를 authorizationManager로 바꾸어 STOMP 명령어별로 인증/인가를 설정할 수 있도록 한다. 수정사항 - 누구나 접속해도 되는 CONNECT, UNSUB, DISCONNECT, HEARTBEAT는 풀어놓고 - MESSAGE, SUB은 인증이 될 경우에만 호출할 수 있도록 한다. - 추가로, SEND /pub, SUBSCRIBE /sub으로의 destination은 무조건 인증된 경우만 접근할 수 있도록 - 이외의 호출은 모두 거절한다. - csrfChannelInterceptor는 csrf 활성화를 제거하기 위한 작업. (브라우저는 어플에서 사용하지 않으므로 csrf 비활성화) - Interceptor의 로직 같은 경우, 초기 CONNECT하는 경우에만 JWT로 해당 유저의 인증상태를 확인한다. (만료된 상황에서 확인하는 과정은 다음 PR에서 진행하도록 하겠습니다.) - authenticated()를 AuthorizationManager에서 사용하려면, 현재 컨텍스트에 setAuthentication을 해주고, 이후의 활용을 위해 accessor.setUser까지 추가해줘야한다. 그래야만 인증이 되었을 때, 문제없이 인증을 할 수 있다. - 참고로, Websocket 자체에서 인증 인가를, Header에서 simpUser로 진행하기 때문에, 기존에 header에 넣어줬던 userEmail을 제거하고 SocketController의 UserDetails 주입을 통해 해당 인증 정보를 가져올 수 있도록 한다. 기존의 userEmail을 이렇게 변경한 이유는, 웹소켓이 초기에 연결이 성립되고 이후에 메시지보내기 등을 사용하면 기존의 Auth 정보는 header에 저장이 되지만, 우리가 직접 넣어줬던 userEmail은 요청마다 새로 다시 넣어줘야하기 때문이다. * fix(error): 웹소켓 에러 시에 이유 함께 보낼 수 있도록 처리 (#260) 개요 - 현재 웹소켓의 연결이 끊길 때 원인이 잘 나오지 않는 문제가 있다. - 에러 발생 시, 원인을 전달하기 위해 StompSubProtocolHandler를 직접 작성한다. - Interceptor에서 에러 체킹을 추가한다. 수정 사항 - 에러 발생 시, 원인을 전달하기 위해 StompSubProtocolHandler를 직접 - 빠른 구현을 위해 링크 참고해서 일부만 수정함: https://velog.io/@jkijki12/%EC%B1%84%ED%8C%85-STOMP-JWT - WebsocketInterceptor에서, JWT가 필요한 Command와 그렇지 않은 Command를 구분해서 알맞게 상황처리를 해준다. - CONNECT, SEND, MESSAGE, SUBSCRIBE는 JWT 필요 - CONNECT의 경우에는 초기 auth 설정해줌 - SUBSCRIBE의 경우에 destination 체킹 진행 - SUBSCRIBE 때, 구독 권한이 있는지 확인한다. - chatroom.getMembers().contains(member) 이 부분에서 Member 인스턴스가 달라도, id로 멤버가 포함되어있는지 체킹이 필요하기 때문에, equals와 hashcode 함께 override (Convention 따라, o 변수 사용) * refactor/chat-exit-auth-1: 개선된 채팅 인증/인가 적용한 채팅방 퇴장 수정 (#261) - 기존에 채팅방 퇴장하면 DISCONNECT 했던 것을 UNSUBSCRIBE로 수정 - messagingTemplate 이용해 UNSUBSCRIBE 메시지 직접 서버에서 전송 chore - 이전에 DISCONNECT 하지 않았어야 하는 enter 부분 코드 Exception 던지는 것으로 수정 - 불필요한 퇴장 시 빈 채팅방 확인 코드 삭제 * Revert "Feat/chatroom re enter (#264)" (#267) This reverts commit c75de607533575343a5f69be2723d212fdb5a0a7. * Merge/dev (#270) * feat/chatroom-reEnter-1: 재입장 가능하도록 - 중간 테이블 chatroom_exited_member 생성 재입장 로직: - EXIT을 하게 되면 chatroom_member에서 member이 삭제되는 것이 아닌 chatroom_exited_member에 member가 추가되는 것임 - 응답 DTO에 퇴장한 회원 정보 표시 (그룹 채팅방에 접속한 회원 수 표시 목적) * feat/chatroom-reEnter-2: 채팅방 조회 코드 수정 및 chore - ChatService: - EXIT: - 퇴장을 하게 되면 chatroom의 members에서 삭제되는 것이 아닌 exitedMembers에 추가되는 것임 - CHAT: - 퇴장을 한 회원에게는 채팅 알림이 가지 않아야 하기 때문에 제외 코드를 추가함 - ENTER: - 그 후 재 입장을 하게 되면 원래 있던 채팅방에 입장해야 하기 때문에 exitedMembers에서 삭제를 진행하며 입장 알림이 가도록 함 - ChatroomService: - GET 채팅방 조회시에 퇴장한 채팅방은 포함되지 않아야 하기 때문에 filter 코드 추가함 - 퇴장한 채팅방 조회도 가능하도록 추가 - GET : /api/chatrooms?type=EXITED chore - 방장인 채팅방 조회: - GET : /api/chatrooms?type=MANAGER - Test 통과를 위한 JVM 크기 2GB로 늘림 - SWAGGER 반영 완료 * feat/chatroom-reEnter-3: 퇴장한 채팅방 접근 강화 * feat/chatroom-reEnter-4: build messaging 추가 * Merge/dev (#270) (#273) * feat/chatroom-reEnter-1: 재입장 가능하도록 - 중간 테이블 chatroom_exited_member 생성 재입장 로직: - EXIT을 하게 되면 chatroom_member에서 member이 삭제되는 것이 아닌 chatroom_exited_member에 member가 추가되는 것임 - 응답 DTO에 퇴장한 회원 정보 표시 (그룹 채팅방에 접속한 회원 수 표시 목적) * feat/chatroom-reEnter-2: 채팅방 조회 코드 수정 및 chore - ChatService: - EXIT: - 퇴장을 하게 되면 chatroom의 members에서 삭제되는 것이 아닌 exitedMembers에 추가되는 것임 - CHAT: - 퇴장을 한 회원에게는 채팅 알림이 가지 않아야 하기 때문에 제외 코드를 추가함 - ENTER: - 그 후 재 입장을 하게 되면 원래 있던 채팅방에 입장해야 하기 때문에 exitedMembers에서 삭제를 진행하며 입장 알림이 가도록 함 - ChatroomService: - GET 채팅방 조회시에 퇴장한 채팅방은 포함되지 않아야 하기 때문에 filter 코드 추가함 - 퇴장한 채팅방 조회도 가능하도록 추가 - GET : /api/chatrooms?type=EXITED chore - 방장인 채팅방 조회: - GET : /api/chatrooms?type=MANAGER - Test 통과를 위한 JVM 크기 2GB로 늘림 - SWAGGER 반영 완료 * feat/chatroom-reEnter-3: 퇴장한 채팅방 접근 강화 * feat/chatroom-reEnter-4: build messaging 추가 --------- Co-authored-by: Seungho Lee <[email protected]> * Dev (#280) * Perf/single chatroom: 베타테스트를 위한 채팅 DTO 수정 (#240) * perf/singleChatroom-1: 채팅 조회 총정리, 채팅방 조회 DTO 수정 - SINGLE, AUTH : 본인이 속한 일대일 채팅방 조회 - GROUP, AUTH : 본인이 속한 그룹 채팅방 조회 - AUTH : 본인이 방장인 그룹 채팅방 조회 - 채팅방 DTO 재활용을 위한 인터페이스 화 진행 - 싱글 채팅방 조회 메서드 새로 생성 - 채팅방 조회 DTO에서 채팅들 삭제 * perf/singleChatroom-2: JPA 간단화 및 채팅 RedisDTO에 민감한 정보 제외 * perf/singleChatroom-3: chore 및 누락 Liquibase 되살리기 * perf/singleChatroom-4: Spotlessapply 적용 * perf/singleChatroom-5: @JsonIgnoreProperty 적용해 Override해서 불러오지 말아야 할 값 안 가져옴 * perf/singleChatroom-7: 중복해서 들어간 @JsonIgnoreProperty 삭제 * perf/singleChatroom-8: 중복해서 들어간 Liquibase 코드 삭제 * perf/singleChatroom-9: 채팅 응답 DTO에서 누락된 채팅 ID 표시 * perf/exceptMemberDto-1: 수정 회원 응답 DTO 적용 (MemberService 제외) (#241) * perf/exceptMemberDto-1: 수정 회원 응답 DTO 적용 (MemberService 제외) * perf/exceptMemberDto-2: 1차 서비스 코드 정리 * hotfix/bookmarkAndtime-1: Created 기준 시간 -> 한국 시간으로 변경 & 북마크 공개/비공개 게시글 상관없이 가능하도록 수정 (#243) * fix/comment-toMe-notification-1: 자신이 작성한 게시글에는 댓글 작성 알림 오지 않도록 (이전 회의 사항 미 반영본) (#244) * hotfix/chatroom-getChatError-1: 채팅방 조회시 작성자와 다름 문제 해결 (#245) * fix/comment-toMe-notification-1: 자신이 작성한 게시글에는 댓글 작성 알림 오지 않도록 (이전 회의 사항 미 반영본) * hotfix/chatroom-getChatError-1: 채팅방 조회시 작성자와 다름 문제 해결 * hotfix/file-presignurl-1: 누락된 presignurl 수정 코드 추가 (#251) * hotfix/file-profileImg-1: File presignURL ID로 가져오기 작업 - ProfileImg (#253) * Feat/single chatroom exit : 싱글 채팅방 퇴장 및 혼자 남아있을 경우 (상대방 퇴장 시)알림 구현 (#255) * feat/singleChatroom-1: 싱글 채팅방 퇴장 구현 - 기존 채팅방 퇴장은 그룹 채팅방 퇴장만 구현되어 있음 -> 싱글 채팅방 퇴장도 추가 구현 - 그룹 채팅방은 Redisson 처리한 사항이 있어 DB 저장 작업이 필수적임 -> 구별되게 그룹 채팅방 퇴장과 싱글 채팅방 퇴장을 구분 - 채팅 퇴장 시 퇴장 채팅 저장과 Redis 발행은 기존대로 유지 (채팅 보내기와 동일하게 동작함) * feat/singleChatroom-2: 채팅방 퇴장 시 혼자 남은 채팅방 알림구현 - 그룹, 싱글 알림 모두 구현 - 기존 알림 서비스와 동일 - Set의 members에서 한 명의 유저만 남아있을 경우 stream.findFirst() 사용함 - 사용자 언어설정에 따른 번역 알림 추가 * feat/singleChatroom-isRead-1: 싱글 채팅방 읽음 대상자(상대방) 읽었는지 표시 구현 (#256) * feat/singleChatroom-isRead- 1: 싱글 채팅방 읽음 대상자(상대방) 읽었는지 표시 구현 - Chat 엔티티에 해당 Boolean 값인 isOtherRead 생성 - 읽음 대상자 (상대방)이 GET :chats?chatroomId={채팅방 ID}를 하면 해당 isOtherRead를 true로 바꿔줌 * hotfix/chatroom-bookmark-individual-1: 채팅방 별 북마크 조회 가능하도록 수정 * feat/singleChatroom-isRead- 2: 싱글 채팅방 퇴장 시 알림 구현 사항 되돌리기 - 이유 : 불필요 * Feat/chat authorization : 일대일 채팅 JWT Authorization 넣기 (#254) * feat/chat-authorization-1: STOMP 시큐리티 작업 - SecurityWebSockConfig: - SecurityConfig로 보호되지 않았던 /pub, /sub 보안 잠그기 - WebSockConfig: - 채팅 발행하기에 앞서 Client에서 보내준 Authorization 값 STOMP Session에 포함시키기 위한 Interceptor 주입 * feat/chat-authorization-2: WebSocketInterceptor 작업 - WebSocketInterceptor: - CONNCECT -> SEND 모두 authorization을 받아 JWTFilter의 doFilterChain 메서드가 하는 일을 수행함 - 자격증명이 마친다면 StompHeaderAccessor로 회원 이메일을 전달함 * hotfix/chatroom-exit-unsubscribe-1: 기존에 DISCONNECT 했던 채팅방을 UNSUBSCRIBE로 퇴장을 구현함 (#258) * hotfix/chatroom-exit-unsubscribe-1: 기존에 DISCONNECT 했던 채팅방을 UNSUBSCIRBE로 퇴장을 수정함 * hotfix/chatroom-exit-unsubscribe-2: spotlessapply * feat(채팅): 더 세밀한 채팅 관련 인증/인가 조절 구현 (#259) 개요 - 현재 SecurityWebSocketConfig에서 HttpSecurity를 사용하고 있는데, 이를 authorizationManager로 바꾸어 STOMP 명령어별로 인증/인가를 설정할 수 있도록 한다. 수정사항 - 누구나 접속해도 되는 CONNECT, UNSUB, DISCONNECT, HEARTBEAT는 풀어놓고 - MESSAGE, SUB은 인증이 될 경우에만 호출할 수 있도록 한다. - 추가로, SEND /pub, SUBSCRIBE /sub으로의 destination은 무조건 인증된 경우만 접근할 수 있도록 - 이외의 호출은 모두 거절한다. - csrfChannelInterceptor는 csrf 활성화를 제거하기 위한 작업. (브라우저는 어플에서 사용하지 않으므로 csrf 비활성화) - Interceptor의 로직 같은 경우, 초기 CONNECT하는 경우에만 JWT로 해당 유저의 인증상태를 확인한다. (만료된 상황에서 확인하는 과정은 다음 PR에서 진행하도록 하겠습니다.) - authenticated()를 AuthorizationManager에서 사용하려면, 현재 컨텍스트에 setAuthentication을 해주고, 이후의 활용을 위해 accessor.setUser까지 추가해줘야한다. 그래야만 인증이 되었을 때, 문제없이 인증을 할 수 있다. - 참고로, Websocket 자체에서 인증 인가를, Header에서 simpUser로 진행하기 때문에, 기존에 header에 넣어줬던 userEmail을 제거하고 SocketController의 UserDetails 주입을 통해 해당 인증 정보를 가져올 수 있도록 한다. 기존의 userEmail을 이렇게 변경한 이유는, 웹소켓이 초기에 연결이 성립되고 이후에 메시지보내기 등을 사용하면 기존의 Auth 정보는 header에 저장이 되지만, 우리가 직접 넣어줬던 userEmail은 요청마다 새로 다시 넣어줘야하기 때문이다. * fix(error): 웹소켓 에러 시에 이유 함께 보낼 수 있도록 처리 (#260) 개요 - 현재 웹소켓의 연결이 끊길 때 원인이 잘 나오지 않는 문제가 있다. - 에러 발생 시, 원인을 전달하기 위해 StompSubProtocolHandler를 직접 작성한다. - Interceptor에서 에러 체킹을 추가한다. 수정 사항 - 에러 발생 시, 원인을 전달하기 위해 StompSubProtocolHandler를 직접 - 빠른 구현을 위해 링크 참고해서 일부만 수정함: https://velog.io/@jkijki12/%EC%B1%84%ED%8C%85-STOMP-JWT - WebsocketInterceptor에서, JWT가 필요한 Command와 그렇지 않은 Command를 구분해서 알맞게 상황처리를 해준다. - CONNECT, SEND, MESSAGE, SUBSCRIBE는 JWT 필요 - CONNECT의 경우에는 초기 auth 설정해줌 - SUBSCRIBE의 경우에 destination 체킹 진행 - SUBSCRIBE 때, 구독 권한이 있는지 확인한다. - chatroom.getMembers().contains(member) 이 부분에서 Member 인스턴스가 달라도, id로 멤버가 포함되어있는지 체킹이 필요하기 때문에, equals와 hashcode 함께 override (Convention 따라, o 변수 사용) * refactor/chat-exit-auth-1: 개선된 채팅 인증/인가 적용한 채팅방 퇴장 수정 (#261) - 기존에 채팅방 퇴장하면 DISCONNECT 했던 것을 UNSUBSCRIBE로 수정 - messagingTemplate 이용해 UNSUBSCRIBE 메시지 직접 서버에서 전송 chore - 이전에 DISCONNECT 하지 않았어야 하는 enter 부분 코드 Exception 던지는 것으로 수정 - 불필요한 퇴장 시 빈 채팅방 확인 코드 삭제 * Revert "Feat/chatroom re enter (#264)" (#267) This reverts commit c75de607533575343a5f69be2723d212fdb5a0a7. * Merge/dev (#270) * feat/chatroom-reEnter-1: 재입장 가능하도록 - 중간 테이블 chatroom_exited_member 생성 재입장 로직: - EXIT을 하게 되면 chatroom_member에서 member이 삭제되는 것이 아닌 chatroom_exited_member에 member가 추가되는 것임 - 응답 DTO에 퇴장한 회원 정보 표시 (그룹 채팅방에 접속한 회원 수 표시 목적) * feat/chatroom-reEnter-2: 채팅방 조회 코드 수정 및 chore - ChatService: - EXIT: - 퇴장을 하게 되면 chatroom의 members에서 삭제되는 것이 아닌 exitedMembers에 추가되는 것임 - CHAT: - 퇴장을 한 회원에게는 채팅 알림이 가지 않아야 하기 때문에 제외 코드를 추가함 - ENTER: - 그 후 재 입장을 하게 되면 원래 있던 채팅방에 입장해야 하기 때문에 exitedMembers에서 삭제를 진행하며 입장 알림이 가도록 함 - ChatroomService: - GET 채팅방 조회시에 퇴장한 채팅방은 포함되지 않아야 하기 때문에 filter 코드 추가함 - 퇴장한 채팅방 조회도 가능하도록 추가 - GET : /api/chatrooms?type=EXITED chore - 방장인 채팅방 조회: - GET : /api/chatrooms?type=MANAGER - Test 통과를 위한 JVM 크기 2GB로 늘림 - SWAGGER 반영 완료 * feat/chatroom-reEnter-3: 퇴장한 채팅방 접근 강화 * feat/chatroom-reEnter-4: build messaging 추가 * Merge/dev (#270) (#273) * feat/chatroom-reEnter-1: 재입장 가능하도록 - 중간 테이블 chatroom_exited_member 생성 재입장 로직: - EXIT을 하게 되면 chatroom_member에서 member이 삭제되는 것이 아닌 chatroom_exited_member에 member가 추가되는 것임 - 응답 DTO에 퇴장한 회원 정보 표시 (그룹 채팅방에 접속한 회원 수 표시 목적) * feat/chatroom-reEnter-2: 채팅방 조회 코드 수정 및 chore - ChatService: - EXIT: - 퇴장을 하게 되면 chatroom의 members에서 삭제되는 것이 아닌 exitedMembers에 추가되는 것임 - CHAT: - 퇴장을 한 회원에게는 채팅 알림이 가지 않아야 하기 때문에 제외 코드를 추가함 - ENTER: - 그 후 재 입장을 하게 되면 원래 있던 채팅방에 입장해야 하기 때문에 exitedMembers에서 삭제를 진행하며 입장 알림이 가도록 함 - ChatroomService: - GET 채팅방 조회시에 퇴장한 채팅방은 포함되지 않아야 하기 때문에 filter 코드 추가함 - 퇴장한 채팅방 조회도 가능하도록 추가 - GET : /api/chatrooms?type=EXITED chore - 방장인 채팅방 조회: - GET : /api/chatrooms?type=MANAGER - Test 통과를 위한 JVM 크기 2GB로 늘림 - SWAGGER 반영 완료 * feat/chatroom-reEnter-3: 퇴장한 채팅방 접근 강화 * feat/chatroom-reEnter-4: build messaging 추가 * feat/chatroom-dto-add-lastChat-1: 채팅방 GET요청 시 최신 순 정렬된 마지막 채팅 DTO에 추가 (#272) * chore(log): 버그 확인 용도로 사용한 로깅 삭제 (#275) 개요 - 꿀팁게시판 자유게시판이 섞이는 부분의 확인을 위해 로깅함수를 사용했는데 이를 삭제한다. * fix(ws): 웹소켓 HEARTBEAT 안되는 문제 구현 (#276) * hotfix/member-like-mapping-1: 회원정보 불러올 때 ResponseMapper 수정 (제대로 Hobbies와 Languages 불러오도록) (#278) * Feat/chatroom exit and re enter : 퇴장 후 재 입장 코드 로직 수정 및 개선 (#277) * feat/chatroom-exit-and-reEnter-1: 퇴장 채팅방과 회원 엔티티 간의 중간 테이블 생성 - 생성한 원인으로는 기존에 만들었던 테이블 (채팅방과 회원)으로는 reEnterTime 컬럼을 생성할 수 없었기 때문 - 퇴장 로직 설명: - 퇴장을 하면 중간테이블인 ChatroomExitedMember가 생김 - 해당 테이블에 채팅방, 회원 reEnterTime이 생김 - 재입장 하지 않는 한 해당 테이블의 reEnterTime은 null임 (퇴장, 재입장, 퇴장 시에도 null) - 채팅방, 회원 간에 unique해야 하는 테이블이므로 uniqueConstraints 값 설정 * feat/chatroom-exit-and-reEnter-2: 퇴장 후 재입장 및 채팅 불러오기 로직 정리 - 재입장 로직: - 재입장 시에는 CheckPoint에 시각이 찍힘 - 이는 채팅 불러오기, 채팅방 구독 전 EXITED 채팅방 불러오기 시에 사용 - GET :/chats?chatroomId={} 시에 getChats를 할 때에 reEnterTime 이후에 유효한 채팅이 자동으로 적용되어 들어감 - docs : Liquibase 문 기존에 만들어 둔 단순 중간 테이블 삭제 후 새 테이블 생성 (이중 테이불이 생기는 경우이므로 기존 DDL update 문 삭제 후 생성을 진행함) * feat/chatroom-exit-and-reEnter-3: Migration은 삭제가 아닌 수정을 하자 - 기존 외래키 관계 및 고유 키 drop 후 새로 중간 테이블 새로 생성 - 이전에 선언했던 단순 중간 테이블 v1.0.5.xml 되살리기 * feat/chatroom-exit-and-reEnter-4: 중간 테이블 ChatroomMember 재 선언 - ExitMember과 ActiveMember를 함께 관리 * feat/chatroom-exit-and-reEnter-5: 주요 수정 Service - 기존 퇴장, 재입장 로직과 동일 - 채팅방의 ACTIVE 한 채팅방 회원들만 가져오는 함수 모듈화 - getSingleChatroom에 앞선 모듈화 함수를 사용하지 않은 이유로는 재입장 시에 사용하는 엔드포인트에서도 (EXITED) 사용하기 때문 - 재입장 시에만 EXITED 조건을 허용해 주기 때문에 다른 메서드에서는 ACTIVE한 상태인지 확인하는 조건이 추가됨 - 웹소켓 preSend 조건에서 사용하는 isMemberInChatroom에서는 Sub 시에 사용하기 때문에 재 입장 시에도 Sub 먼저 해야 하기 때문에 채팅방과 회원간에 관계가 없을 경우에만 Exception을 내뱉도록 수정함 * feat/chatroom-exit-and-reEnter-6: getMembers -> validMembers 메서드 이용후 contains() 메서드 이용 * feat/chatroom-exit-and-reEnter-7: chore/docs * feat/chatroom-exit-and-reEnter-8: SUB 보안 되살리기 - 앞선 코드에서 SUB를 퇴장한 회원에 한해서는 허용해왔지만 - 퇴장한 회원 가운데에 재입장한 회원에 한해 허용하도록 엔드포인트를 하나 더 생성함 (서버에서 채팅방 회원의 status를 Active로 바꿔주는 엔드포인트) * feat/chatroom-count-1: 채팅방 list 조회 시에 count가 보이도록 구현 (#279) - lastHoldAt : ChatroomMember에 채팅방을 떠날 때에 TimeStamp를 기록 - 해당 값은 채팅방 뒤로가기를 누를 시에, 채팅 목록 조회 시에 업데이트 됨 - Put :/chatrooms/{chatroomId}/hold 엔드포인트 생성 : - 해당 엔드포인트는 채팅방 안읽은 채팅 갯수를 업데이트 하기 위한 용도로 사용됨 --------- Co-authored-by: Seungho Lee <[email protected]> * Fix/rebase prod (#287) * fix/ddl-content-toLongText-1: (#281) * fix/ddl-content-toLongText-1: - POST, COMMENT : DDL 긴 게시글 내용 작성 가능하도록 수정 - MEMBER : 한줄소개 이모지 생성 가능한 타입 LONGTEXT로 수정 (프론트쪽에서 글자 수 제한 유) * fix/ddl-content-toLongText-2: spotlessapply * fix/ddl-content-toLongText-3: 불필요한 Chat의 otherRead 삭제 (DDL) * fix/ddl-content-toLongText-4: otherRead 삭제 반영 * fix(profile): MBTI 선택 안함 옵션을 위해 null로 저장 (#283) * Rebase/from prod to dev (#285) * Dev (#274) * Perf/single chatroom: 베타테스트를 위한 채팅 DTO 수정 (#240) * perf/singleChatroom-1: 채팅 조회 총정리, 채팅방 조회 DTO 수정 - SINGLE, AUTH : 본인이 속한 일대일 채팅방 조회 - GROUP, AUTH : 본인이 속한 그룹 채팅방 조회 - AUTH : 본인이 방장인 그룹 채팅방 조회 - 채팅방 DTO 재활용을 위한 인터페이스 화 진행 - 싱글 채팅방 조회 메서드 새로 생성 - 채팅방 조회 DTO에서 채팅들 삭제 * perf/singleChatroom-2: JPA 간단화 및 채팅 RedisDTO에 민감한 정보 제외 * perf/singleChatroom-3: chore 및 누락 Liquibase 되살리기 * perf/singleChatroom-4: Spotlessapply 적용 * perf/singleChatroom-5: @JsonIgnoreProperty 적용해 Override해서 불러오지 말아야 할 값 안 가져옴 * perf/singleChatroom-7: 중복해서 들어간 @JsonIgnoreProperty 삭제 * perf/singleChatroom-8: 중복해서 들어간 Liquibase 코드 삭제 * perf/singleChatroom-9: 채팅 응답 DTO에서 누락된 채팅 ID 표시 * perf/exceptMemberDto-1: 수정 회원 응답 DTO 적용 (MemberService 제외) (#241) * perf/exceptMemberDto-1: 수정 회원 응답 DTO 적용 (MemberService 제외) * perf/exceptMemberDto-2: 1차 서비스 코드 정리 * hotfix/bookmarkAndtime-1: Created 기준 시간 -> 한국 시간으로 변경 & 북마크 공개/비공개 게시글 상관없이 가능하도록 수정 (#243) * fix/comment-toMe-notification-1: 자신이 작성한 게시글에는 댓글 작성 알림 오지 않도록 (이전 회의 사항 미 반영본) (#244) * hotfix/chatroom-getChatError-1: 채팅방 조회시 작성자와 다름 문제 해결 (#245) * fix/comment-toMe-notification-1: 자신이 작성한 게시글에는 댓글 작성 알림 오지 않도록 (이전 회의 사항 미 반영본) * hotfix/chatroom-getChatError-1: 채팅방 조회시 작성자와 다름 문제 해결 * hotfix/file-presignurl-1: 누락된 presignurl 수정 코드 추가 (#251) * hotfix/file-profileImg-1: File presignURL ID로 가져오기 작업 - ProfileImg (#253) * Feat/single chatroom exit : 싱글 채팅방 퇴장 및 혼자 남아있을 경우 (상대방 퇴장 시)알림 구현 (#255) * feat/singleChatroom-1: 싱글 채팅방 퇴장 구현 - 기존 채팅방 퇴장은 그룹 채팅방 퇴장만 구현되어 있음 -> 싱글 채팅방 퇴장도 추가 구현 - 그룹 채팅방은 Redisson 처리한 사항이 있어 DB 저장 작업이 필수적임 -> 구별되게 그룹 채팅방 퇴장과 싱글 채팅방 퇴장을 구분 - 채팅 퇴장 시 퇴장 채팅 저장과 Redis 발행은 기존대로 유지 (채팅 보내기와 동일하게 동작함) * feat/singleChatroom-2: 채팅방 퇴장 시 혼자 남은 채팅방 알림구현 - 그룹, 싱글 알림 모두 구현 - 기존 알림 서비스와 동일 - Set의 members에서 한 명의 유저만 남아있을 경우 stream.findFirst() 사용함 - 사용자 언어설정에 따른 번역 알림 추가 * feat/singleChatroom-isRead-1: 싱글 채팅방 읽음 대상자(상대방) 읽었는지 표시 구현 (#256) * feat/singleChatroom-isRead- 1: 싱글 채팅방 읽음 대상자(상대방) 읽었는지 표시 구현 - Chat 엔티티에 해당 Boolean 값인 isOtherRead 생성 - 읽음 대상자 (상대방)이 GET :chats?chatroomId={채팅방 ID}를 하면 해당 isOtherRead를 true로 바꿔줌 * hotfix/chatroom-bookmark-individual-1: 채팅방 별 북마크 조회 가능하도록 수정 * feat/singleChatroom-isRead- 2: 싱글 채팅방 퇴장 시 알림 구현 사항 되돌리기 - 이유 : 불필요 * Feat/chat authorization : 일대일 채팅 JWT Authorization 넣기 (#254) * feat/chat-authorization-1: STOMP 시큐리티 작업 - SecurityWebSockConfig: - SecurityConfig로 보호되지 않았던 /pub, /sub 보안 잠그기 - WebSockConfig: - 채팅 발행하기에 앞서 Client에서 보내준 Authorization 값 STOMP Session에 포함시키기 위한 Interceptor 주입 * feat/chat-authorization-2: WebSocketInterceptor 작업 - WebSocketInterceptor: - CONNCECT -> SEND 모두 authorization을 받아 JWTFilter의 doFilterChain 메서드가 하는 일을 수행함 - 자격증명이 마친다면 StompHeaderAccessor로 회원 이메일을 전달함 * hotfix/chatroom-exit-unsubscribe-1: 기존에 DISCONNECT 했던 채팅방을 UNSUBSCRIBE로 퇴장을 구현함 (#258) * hotfix/chatroom-exit-unsubscribe-1: 기존에 DISCONNECT 했던 채팅방을 UNSUBSCIRBE로 퇴장을 수정함 * hotfix/chatroom-exit-unsubscribe-2: spotlessapply * feat(채팅): 더 세밀한 채팅 관련 인증/인가 조절 구현 (#259) 개요 - 현재 SecurityWebSocketConfig에서 HttpSecurity를 사용하고 있는데, 이를 authorizationManager로 바꾸어 STOMP 명령어별로 인증/인가를 설정할 수 있도록 한다. 수정사항 - 누구나 접속해도 되는 CONNECT, UNSUB, DISCONNECT, HEARTBEAT는 풀어놓고 - MESSAGE, SUB은 인증이 될 경우에만 호출할 수 있도록 한다. - 추가로, SEND /pub, SUBSCRIBE /sub으로의 destination은 무조건 인증된 경우만 접근할 수 있도록 - 이외의 호출은 모두 거절한다. - csrfChannelInterceptor는 csrf 활성화를 제거하기 위한 작업. (브라우저는 어플에서 사용하지 않으므로 csrf 비활성화) - Interceptor의 로직 같은 경우, 초기 CONNECT하는 경우에만 JWT로 해당 유저의 인증상태를 확인한다. (만료된 상황에서 확인하는 과정은 다음 PR에서 진행하도록 하겠습니다.) - authenticated()를 AuthorizationManager에서 사용하려면, 현재 컨텍스트에 setAuthentication을 해주고, 이후의 활용을 위해 accessor.setUser까지 추가해줘야한다. 그래야만 인증이 되었을 때, 문제없이 인증을 할 수 있다. - 참고로, Websocket 자체에서 인증 인가를, Header에서 simpUser로 진행하기 때문에, 기존에 header에 넣어줬던 userEmail을 제거하고 SocketController의 UserDetails 주입을 통해 해당 인증 정보를 가져올 수 있도록 한다. 기존의 userEmail을 이렇게 변경한 이유는, 웹소켓이 초기에 연결이 성립되고 이후에 메시지보내기 등을 사용하면 기존의 Auth 정보는 header에 저장이 되지만, 우리가 직접 넣어줬던 userEmail은 요청마다 새로 다시 넣어줘야하기 때문이다. * fix(error): 웹소켓 에러 시에 이유 함께 보낼 수 있도록 처리 (#260) 개요 - 현재 웹소켓의 연결이 끊길 때 원인이 잘 나오지 않는 문제가 있다. - 에러 발생 시, 원인을 전달하기 위해 StompSubProtocolHandler를 직접 작성한다. - Interceptor에서 에러 체킹을 추가한다. 수정 사항 - 에러 발생 시, 원인을 전달하기 위해 StompSubProtocolHandler를 직접 - 빠른 구현을 위해 링크 참고해서 일부만 수정함: https://velog.io/@jkijki12/%EC%B1%84%ED%8C%85-STOMP-JWT - WebsocketInterceptor에서, JWT가 필요한 Command와 그렇지 않은 Command를 구분해서 알맞게 상황처리를 해준다. - CONNECT, SEND, MESSAGE, SUBSCRIBE는 JWT 필요 - CONNECT의 경우에는 초기 auth 설정해줌 - SUBSCRIBE의 경우에 destination 체킹 진행 - SUBSCRIBE 때, 구독 권한이 있는지 확인한다. - chatroom.getMembers().contains(member) 이 부분에서 Member 인스턴스가 달라도, id로 멤버가 포함되어있는지 체킹이 필요하기 때문에, equals와 hashcode 함께 override (Convention 따라, o 변수 사용) * refactor/chat-exit-auth-1: 개선된 채팅 인증/인가 적용한 채팅방 퇴장 수정 (#261) - 기존에 채팅방 퇴장하면 DISCONNECT 했던 것을 UNSUBSCRIBE로 수정 - messagingTemplate 이용해 UNSUBSCRIBE 메시지 직접 서버에서 전송 chore - 이전에 DISCONNECT 하지 않았어야 하는 enter 부분 코드 Exception 던지는 것으로 수정 - 불필요한 퇴장 시 빈 채팅방 확인 코드 삭제 * Revert "Feat/chatroom re enter (#264)" (#267) This reverts commit c75de607533575343a5f69be2723d212fdb5a0a7. * Merge/dev (#270) * feat/chatroom-reEnter-1: 재입장 가능하도록 - 중간 테이블 chatroom_exited_member 생성 재입장 로직: - EXIT을 하게 되면 chatroom_member에서 member이 삭제되는 것이 아닌 chatroom_exited_member에 member가 추가되는 것임 - 응답 DTO에 퇴장한 회원 정보 표시 (그룹 채팅방에 접속한 회원 수 표시 목적) * feat/chatroom-reEnter-2: 채팅방 조회 코드 수정 및 chore - ChatService: - EXIT: - 퇴장을 하게 되면 chatroom의 members에서 삭제되는 것이 아닌 exitedMembers에 추가되는 것임 - CHAT: - 퇴장을 한 회원에게는 채팅 알림이 가지 않아야 하기 때문에 제외 코드를 추가함 - ENTER: - 그 후 재 입장을 하게 되면 원래 있던 채팅방에 입장해야 하기 때문에 exitedMembers에서 삭제를 진행하며 입장 알림이 가도록 함 - ChatroomService: - GET 채팅방 조회시에 퇴장한 채팅방은 포함되지 않아야 하기 때문에 filter 코드 추가함 - 퇴장한 채팅방 조회도 가능하도록 추가 - GET : /api/chatrooms?type=EXITED chore - 방장인 채팅방 조회: - GET : /api/chatrooms?type=MANAGER - Test 통과를 위한 JVM 크기 2GB로 늘림 - SWAGGER 반영 완료 * feat/chatroom-reEnter-3: 퇴장한 채팅방 접근 강화 * feat/chatroom-reEnter-4: build messaging 추가 * Merge/dev (#270) (#273) * feat/chatroom-reEnter-1: 재입장 가능하도록 - 중간 테이블 chatroom_exited_member 생성 재입장 로직: - EXIT을 하게 되면 chatroom_member에서 member이 삭제되는 것이 아닌 chatroom_exited_member에 member가 추가되는 것임 - 응답 DTO에 퇴장한 회원 정보 표시 (그룹 채팅방에 접속한 회원 수 표시 목적) * feat/chatroom-reEnter-2: 채팅방 조회 코드 수정 및 chore - ChatService: - EXIT: - 퇴장을 하게 되면 chatroom의 members에서 삭제되는 것이 아닌 exitedMembers에 추가되는 것임 - CHAT: - 퇴장을 한 회원에게는 채팅 알림이 가지 않아야 하기 때문에 제외 코드를 추가함 - ENTER: - 그 후 재 입장을 하게 되면 원래 있던 채팅방에 입장해야 하기 때문에 exitedMembers에서 삭제를 진행하며 입장 알림이 가도록 함 - ChatroomService: - GET 채팅방 조회시에 퇴장한 채팅방은 포함되지 않아야 하기 때문에 filter 코드 추가함 - 퇴장한 채팅방 조회도 가능하도록 추가 - GET : /api/chatrooms?type=EXITED chore - 방장인 채팅방 조회: - GET : /api/chatrooms?type=MANAGER - Test 통과를 위한 JVM 크기 2GB로 늘림 - SWAGGER 반영 완료 * feat/chatroom-reEnter-3: 퇴장한 채팅방 접근 강화 * feat/chatroom-reEnter-4: build messaging 추가 --------- Co-authored-by: Seungho Lee <[email protected]> * Dev (#280) * Perf/single chatroom: 베타테스트를 위한 채팅 DTO 수정 (#240) * perf/singleChatroom-1: 채팅 조회 총정리, 채팅방 조회 DTO 수정 - SINGLE, AUTH : 본인이 속한 일대일 채팅방 조회 - GROUP, AUTH : 본인이 속한 그룹 채팅방 조회 - AUTH : 본인이 방장인 그룹 채팅방 조회 - 채팅방 DTO 재활용을 위한 인터페이스 화 진행 - 싱글 채팅방 조회 메서드 새로 생성 - 채팅방 조회 DTO에서 채팅들 삭제 * perf/singleChatroom-2: JPA 간단화 및 채팅 RedisDTO에 민감한 정보 제외 * perf/singleChatroom-3: chore 및 누락 Liquibase 되살리기 * perf/singleChatroom-4: Spotlessapply 적용 * perf/singleChatroom-5: @JsonIgnoreProperty 적용해 Override해서 불러오지 말아야 할 값 안 가져옴 * perf/singleChatroom-7: 중복해서 들어간 @JsonIgnoreProperty 삭제 * perf/singleChatroom-8: 중복해서 들어간 Liquibase 코드 삭제 * perf/singleChatroom-9: 채팅 응답 DTO에서 누락된 채팅 ID 표시 * perf/exceptMemberDto-1: 수정 회원 응답 DTO 적용 (MemberService 제외) (#241) * perf/exceptMemberDto-1: 수정 회원 응답 DTO 적용 (MemberService 제외) * perf/exceptMemberDto-2: 1차 서비스 코드 정리 * hotfix/bookmarkAndtime-1: Created 기준 시간 -> 한국 시간으로 변경 & 북마크 공개/비공개 게시글 상관없이 가능하도록 수정 (#243) * fix/comment-toMe-notification-1: 자신이 작성한 게시글에는 댓글 작성 알림 오지 않도록 (이전 회의 사항 미 반영본) (#244) * hotfix/chatroom-getChatError-1: 채팅방 조회시 작성자와 다름 문제 해결 (#245) * fix/comment-toMe-notification-1: 자신이 작성한 게시글에는 댓글 작성 알림 오지 않도록 (이전 회의 사항 미 반영본) * hotfix/chatroom-getChatError-1: 채팅방 조회시 작성자와 다름 문제 해결 * hotfix/file-presignurl-1: 누락된 presignurl 수정 코드 추가 (#251) * hotfix/file-profileImg-1: File presignURL ID로 가져오기 작업 - ProfileImg (#253) * Feat/single chatroom exit : 싱글 채팅방 퇴장 및 혼자 남아있을 경우 (상대방 퇴장 시)알림 구현 (#255) * feat/singleChatroom-1: 싱글 채팅방 퇴장 구현 - 기존 채팅방 퇴장은 그룹 채팅방 퇴장만 구현되어 있음 -> 싱글 채팅방 퇴장도 추가 구현 - 그룹 채팅방은 Redisson 처리한 사항이 있어 DB 저장 작업이 필수적임 -> 구별되게 그룹 채팅방 퇴장과 싱글 채팅방 퇴장을 구분 - 채팅 퇴장 시 퇴장 채팅 저장과 Redis 발행은 기존대로 유지 (채팅 보내기와 동일하게 동작함) * feat/singleChatroom-2: 채팅방 퇴장 시 혼자 남은 채팅방 알림구현 - 그룹, 싱글 알림 모두 구현 - 기존 알림 서비스와 동일 - Set의 members에서 한 명의 유저만 남아있을 경우 stream.findFirst() 사용함 - 사용자 언어설정에 따른 번역 알림 추가 * feat/singleChatroom-isRead-1: 싱글 채팅방 읽음 대상자(상대방) 읽었는지 표시 구현 (#256) * feat/singleChatroom-isRead- 1: 싱글 채팅방 읽음 대상자(상대방) 읽었는지 표시 구현 - Chat 엔티티에 해당 Boolean 값인 isOtherRead 생성 - 읽음 대상자 (상대방)이 GET :chats?chatroomId={채팅방 ID}를 하면 해당 isOtherRead를 true로 바꿔줌 * hotfix/chatroom-bookmark-individual-1: 채팅방 별 북마크 조회 가능하도록 수정 * feat/singleChatroom-isRead- 2: 싱글 채팅방 퇴장 시 알림 구현 사항 되돌리기 - 이유 : 불필요 * Feat/chat authorization : 일대일 채팅 JWT Authorization 넣기 (#254) * feat/chat-authorization-1: STOMP 시큐리티 작업 - SecurityWebSockConfig: - SecurityConfig로 보호되지 않았던 /pub, /sub 보안 잠그기 - WebSockConfig: - 채팅 발행하기에 앞서 Client에서 보내준 Authorization 값 STOMP Session에 포함시키기 위한 Interceptor 주입 * feat/chat-authorization-2: WebSocketInterceptor 작업 - WebSocketInterceptor: - CONNCECT -> SEND 모두 authorization을 받아 JWTFilter의 doFilterChain 메서드가 하는 일을 수행함 - 자격증명이 마친다면 StompHeaderAccessor로 회원 이메일을 전달함 * hotfix/chatroom-exit-unsubscribe-1: 기존에 DISCONNECT 했던 채팅방을 UNSUBSCRIBE로 퇴장을 구현함 (#258) * hotfix/chatroom-exit-unsubscribe-1: 기존에 DISCONNECT 했던 채팅방을 UNSUBSCIRBE로 퇴장을 수정함 * hotfix/chatroom-exit-unsubscribe-2: spotlessapply * feat(채팅): 더 세밀한 채팅 관련 인증/인가 조절 구현 (#259) 개요 - 현재 SecurityWebSocketConfig에서 HttpSecurity를 사용하고 있는데, 이를 authorizationManager로 바꾸어 STOMP 명령어별로 인증/인가를 설정할 수 있도록 한다. 수정사항 - 누구나 접속해도 되는 CONNECT, UNSUB, DISCONNECT, HEARTBEAT는 풀어놓고 - MESSAGE, SUB은 인증이 될 경우에만 호출할 수 있도록 한다. - 추가로, SEND /pub, SUBSCRIBE /sub으로의 destination은 무조건 인증된 경우만 접근할 수 있도록 - 이외의 호출은 모두 거절한다. - csrfChannelInterceptor는 csrf 활성화를 제거하기 위한 작업. (브라우저는 어플에서 사용하지 않으므로 csrf 비활성화) - Interceptor의 로직 같은 경우, 초기 CONNECT하는 경우에만 JWT로 해당 유저의 인증상태를 확인한다. (만료된 상황에서 확인하는 과정은 다음 PR에서 진행하도록 하겠습니다.) - authenticated()를 AuthorizationManager에서 사용하려면, 현재 컨텍스트에 setAuthentication을 해주고, 이후의 활용을 위해 accessor.setUser까지 추가해줘야한다. 그래야만 인증이 되었을 때, 문제없이 인증을 할 수 있다. - 참고로, Websocket 자체에서 인증 인가를, Header에서 simpUser로 진행하기 때문에, 기존에 header에 넣어줬던 userEmail을 제거하고 SocketController의 UserDetails 주입을 통해 해당 인증 정보를 가져올 수 있도록 한다. 기존의 userEmail을 이렇게 변경한 이유는, 웹소켓이 초기에 연결이 성립되고 이후에 메시지보내기 등을 사용하면 기존의 Auth 정보는 header에 저장이 되지만, 우리가 직접 넣어줬던 userEmail은 요청마다 새로 다시 넣어줘야하기 때문이다. * fix(error): 웹소켓 에러 시에 이유 함께 보낼 수 있도록 처리 (#260) 개요 - 현재 웹소켓의 연결이 끊길 때 원인이 잘 나오지 않는 문제가 있다. - 에러 발생 시, 원인을 전달하기 위해 StompSubProtocolHandler를 직접 작성한다. - Interceptor에서 에러 체킹을 추가한다. 수정 사항 - 에러 발생 시, 원인을 전달하기 위해 StompSubProtocolHandler를 직접 - 빠른 구현을 위해 링크 참고해서 일부만 수정함: https://velog.io/@jkijki12/%EC%B1%84%ED%8C%85-STOMP-JWT - WebsocketInterceptor에서, JWT가 필요한 Command와 그렇지 않은 Command를 구분해서 알맞게 상황처리를 해준다. - CONNECT, SEND, MESSAGE, SUBSCRIBE는 JWT 필요 - CONNECT의 경우에는 초기 auth 설정해줌 - SUBSCRIBE의 경우에 destination 체킹 진행 - SUBSCRIBE 때, 구독 권한이 있는지 확인한다. - chatroom.getMembers().contains(member) 이 부분에서 Member 인스턴스가 달라도, id로 멤버가 포함되어있는지 체킹이 필요하기 때문에, equals와 hashcode 함께 override (Convention 따라, o 변수 사용) * refactor/chat-exit-auth-1: 개선된 채팅 인증/인가 적용한 채팅방 퇴장 수정 (#261) - 기존에 채팅방 퇴장하면 DISCONNECT 했던 것을 UNSUBSCRIBE로 수정 - messagingTemplate 이용해 UNSUBSCRIBE 메시지 직접 서버에서 전송 chore - 이전에 DISCONNECT 하지 않았어야 하는 enter 부분 코드 Exception 던지는 것으로 수정 - 불필요한 퇴장 시 빈 채팅방 확인 코드 삭제 * Revert "Feat/chatroom re enter (#264)" (#267) This reverts commit c75de607533575343a5f69be2723d212fdb5a0a7. * Merge/dev (#270) * feat/chatroom-reEnter-1: 재입장 가능하도록 - 중간 테이블 chatroom_exited_member 생성 재입장 로직: - EXIT을 하게 되면 chatroom_member에서 member이 삭제되는 것이 아닌 chatroom_exited_member에 member가 추가되는 것임 - 응답 DTO에 퇴장한 회원 정보 표시 (그룹 채팅방에 접속한 회원 수 표시 목적) * feat/chatroom-reEnter-2: 채팅방 조회 코드 수정 및 chore - ChatService: - EXIT: - 퇴장을 하게 되면 chatroom의 members에서 삭제되는 것이 아닌 exitedMembers에 추가되는 것임 - CHAT: - 퇴장을 한 회원에게는 채팅 알림이 가지 않아야 하기 때문에 제외 코드를 추가함 - ENTER: - 그 후 재 입장을 하게 되면 원래 있던 채팅방에 입장해야 하기 때문에 exitedMembers에서 삭제를 진행하며 입장 알림이 가도록 함 - ChatroomService: - GET 채팅방 조회시에 퇴장한 채팅방은 포함되지 않아야 하기 때문에 filter 코드 추가함 - 퇴장한 채팅방 조회도 가능하도록 추가 - GET : /api/chatrooms?type=EXITED chore - 방장인 채팅방 조회: - GET : /api/chatrooms?type=MANAGER - Test 통과를 위한 JVM 크기 2GB로 늘림 - SWAGGER 반영 완료 * feat/chatroom-reEnter-3: 퇴장한 채팅방 접근 강화 * feat/chatroom-reEnter-4: build messaging 추가 * Merge/dev (#270) (#273) * feat/chatroom-reEnter-1: 재입장 가능하도록 - 중간 테이블 chatroom_exited_member 생성 재입장 로직: - EXIT을 하게 되면 chatroom_member에서 member이 삭제되는 것이 아닌 chatroom_exited_member에 member가 추가되는 것임 - 응답 DTO에 퇴장한 회원 정보 표시 (그룹 채팅방에 접속한 회원 수 표시 목적) * feat/chatroom-reEnter-2: 채팅방 조회 코드 수정 및 chore - ChatService: - EXIT: - 퇴장을 하게 되면 chatroom의 members에서 삭제되는 것이 아닌 exitedMembers에 추가되는 것임 - CHAT: - 퇴장을 한 회원에게는 채팅 알림이 가지 않아야 하기 때문에 제외 코드를 추가함 - ENTER: - 그 후 재 입장을 하게 되면 원래 있던 채팅방에 입장해야 하기 때문에 exitedMembers에서 삭제를 진행하며 입장 알림이 가도록 함 - ChatroomService: - GET 채팅방 조회시에 퇴장한 채팅방은 포함되지 않아야 하기 때문에 filter 코드 추가함 - 퇴장한 채팅방 조회도 가능하도록 추가 - GET : /api/chatrooms?type=EXITED chore - 방장인 채팅방 조회: - GET : /api/chatrooms?type=MANAGER - Test 통과를 위한 JVM 크기 2GB로 늘림 - SWAGGER 반영 완료 * feat/chatroom-reEnter-3: 퇴장한 채팅방 접근 강화 * feat/chatroom-reEnter-4: build messaging 추가 * feat/chatroom-dto-add-lastChat-1: 채팅방 GET요청 시 최신 순 정렬된 마지막 채팅 DTO에 추가 (#272) * chore(log): 버그 확인 용도로 사용한 로깅 삭제 (#275) 개요 - 꿀팁게시판 자유게시판이 섞이는 부분의 확인을 위해 로깅함수를 사용했는데 이를 삭제한다. * fix(ws): 웹소켓 HEARTBEAT 안되는 문제 구현 (#276) * hotfix/member-like-mapping-1: 회원정보 불러올 때 ResponseMapper 수정 (제대로 Hobbies와 Languages 불러오도록) (#278) * Feat/chatroom exit and re enter : 퇴장 후 재 입장 코드 로직 수정 및 개선 (#277) * feat/chatroom-exit-and-reEnter-1: 퇴장 채팅방과 회원 엔티티 간의 중간 테이블 생성 - 생성한 원인으로는 기존에 만들었던 테이블 (채팅방과 회원)으로는 reEnterTime 컬럼을 생성할 수 없었기 때문 - 퇴장 로직 설명: - 퇴장을 하면 중간테이블인 ChatroomExitedMember가 생김 - 해당 테이블에 채팅방, 회원 reEnterTime이 생김 - 재입장 하지 않는 한 해당 테이블의 reEnterTime은 null임 (퇴장, 재입장, 퇴장 시에도 null) - 채팅방, 회원 간에 unique해야 하는 테이블이므로 uniqueConstraints 값 설정 * feat/chatroom-exit-and-reEnter-2: 퇴장 후 재입장 및 채팅 불러오기 로직 정리 - 재입장 로직: - 재입장 시에는 CheckPoint에 시각이 찍힘 - 이는 채팅 불러오기, 채팅방 구독 전 EXITED 채팅방 불러오기 시에 사용 - GET :/chats?chatroomId={} 시에 getChats를 할 때에 reEnterTime 이후에 유효한 채팅이 자동으로 적용되어 들어감 - docs : Liquibase 문 기존에 만들어 둔 단순 중간 테이블 삭제 후 새 테이블 생성 (이중 테이불이 생기는 경우이므로 기존 DDL update 문 삭제 후 생성을 진행함) * feat/chatroom-exit-and-reEnter-3: Migration은 삭제가 아닌 수정을 하자 - 기존 외래키 관계 및 고유 키 drop 후 새로 중간 테이블 새로 생성 - 이전에 선언했던 단순 중간 테이블 v1.0.5.xml 되살리기 * feat/chatroom-exit-and-reEnter-4: 중간 테이블 ChatroomMember 재 선언 - ExitMember과 ActiveMember를 함께 관리 * feat/chatroom-exit-and-reEnter-5: 주요 수정 Service - 기존 퇴장, 재입장 로직과 동일 - 채팅방의 ACTIVE 한 채팅방 회원들만 가져오는 함수 모듈화 - getSingleChatroom에 앞선 모듈화 함수를 사용하지 않은 이유로는 재입장 시에 사용하는 엔드포인트에서도 (EXITED) 사용하기 때문 - 재입장 시에만 EXITED 조건을 허용해 주기 때문에 다른 메서드에서는 ACTIVE한 상태인지 확인하는 조건이 추가됨 - 웹소켓 preSend 조건에서 사용하는 isMemberInChatroom에서는 Sub 시에 사용하기 때문에 재 입장 시에도 Sub 먼저 해야 하기 때문에 채팅방과 회원간에 관계가 없을 경우에만 Exception을 내뱉도록 수정함 * feat/chatroom-exit-and-reEnter-6: getMembers -> validMembers 메서드 이용후 contains() 메서드 이용 * feat/chatroom-exit-and-reEnter-7: chore/docs * feat/chatroom-exit-and-reEnter-8: SUB 보안 되살리기 - 앞선 코드에서 SUB를 퇴장한 회원에 한해서는 허용해왔지만 - 퇴장한 회원 가운데에 재입장한 회원에 한해 허용하도록 엔드포인트를 하나 더 생성함 (서버에서 채팅방 회원의 status를 Active로 바꿔주는 엔드포인트) * feat/chatroom-count-1: 채팅방 list 조회 시에 count가 보이도록 구현 (#279) - lastHoldAt : ChatroomMember에 채팅방을 떠날 때에 TimeStamp를 기록 - 해당 값은 채팅방 뒤로가기를 누를 시에, 채팅 목록 조회 시에 업데이트 됨 - Put :/chatrooms/{chatroomId}/hold 엔드포인트 생성 : - 해당 엔드포인트는 채팅방 안읽은 채팅 갯수를 업데이트 하기 위한 용도로 사용됨 --------- Co-authored-by: Seungho Lee <[email protected]> * fix/ddl-content-toLongText-1: (#281) * fix/ddl-content-toLongText-1: - POST, COMMENT : DDL 긴 게시글 내용 작성 가능하도록 수정 - MEMBER : 한줄소개 이모지 생성 가능한 타입 LONGTEXT로 수정 (프론트쪽에서 글자 수 제한 유) * fix/ddl-content-toLongText-2: spotlessapply * fix/ddl-content-toLongText-3: 불필요한 Chat의 otherRead 삭제 (DDL) * fix/ddl-content-toLongText-4: otherRead 삭제 반영 --------- Co-authored-by: Seungho Lee <[email protected]> * (REVERT) Fix/notification token : 잘못 삭제한 브랜치 (#284) * fix/notificationToken-1: notificationToken 재생성 로직 수정 - 이전에 같은 기기에서 로그인한 이력이 있다면 재활용 함 (다른 유저에서 사용했던 pushToken이라면 다른 유저의 NotificationToken의 pushToken은 null처리해줌) - 같은 pushToken을 갖고 있는 다른 유저라면 해당 pushToken을 포함하는 NotificationToken의 pushToken의 값은 null이 됨 * fix/notificationToken-2: chore 및 null 처리 * fix/notificationToken-3: chore (테스트 시에 설정해둔 주석 해제) * hotfix/chatroom-lastholdat: lastHoldAt ChatroomMember 만들 시에 명시할 것 * fix/notificationToken-4: 보낼 대상자가 notificationToken값이 없을 때의 Exception 핸들링 -> 넘어가도록 * fix/notificationToken-5: - fix : 본인이 보낸 채팅은 unholdChatCount에 포함되지 않도록 수정 - refactor : 싱글 채팅방 퇴장 메시지 보내지지 않도록, 단 메시지 전송을 제외한 EXITED 상태 변경 로직은 동일 --------- Co-authored-by: Seungho Lee <[email protected]> * hotfix/chatroom-delete-backHoldAt-1: (#289) 채팅 불러오기 시에 실행되는 LastHoldAt이 중복으로 실행되는 엔드포인트 PUT :/chatrooms/{roomId}/hold 삭제 * fix(chat): 채팅방 동시 생성 문제 해결 (#290) (#294) * fix(db): 테스트 환경에서 초기 데이터 값이 들어가는 부분 수정 개요 및 수정사항 - 현재 초기에 삽입되는 데이터 sql의 파일명이 init.sql로 되어있어, sql init never를 설정해줘도 테스트 실행 시에 자동으로 스프링에 삽입시킨다. 따라서 data.sql로 바꿔준다. 추가로, test시에 init mode를 never로 바꿔준다. * fix(chat): 채팅방 존재 체크 JPQL 수정 개요 - 현재 채팅방 존재의 JPQL이 잘못되어 있어 올바른 체킹이 이루어지지 않고 있다. - 기존에는 cm.member의 같은 변수로 두개의 값이랑 같은지 비교하므로 성립이 안됨 - 따라서, 따라서, JPQL 쿼리를 수정하여 각 멤버를 별도의 변수(cm1, cm2)로 매핑하고, 각각 :member1, :member2와 비교하도록 변경함. + 싱글 채팅방인 경우 - 이러면 채팅방 중에 member 둘 다 있고, 싱글 채팅방인 경우만 가져오므로 해결이 된다. * fix(chat): 채팅방 동시 생성 경쟁 방지 개요 - 1:1 채팅을 둘이 동시에 만드는 경우에, 둘 다 생겨서 문제가 생긴다. 이를 방지하기 위해, 경쟁 조건을 방지해준다. 수정 사항 - 기존 수연님이 작성해주신 RedisLockChatServiceFacade.java의 코드를 재활용하기 편하게 바꿈 - 우선 락 이름을 외부에서 알아서 넣어주도록 바꿈 - executeWithLock을 오버로딩해서, Runnable (리턴 값없는 경우), Callable (리턴 값 있는 경우)의 경우로 나누어서 함수를 작성함 -> 참고로 이 둘은 쓰레드 태스크 실행 시에 사용 - createSingleChatroom과 기존 함수에서 이 바꾼 함수 사용 - 락 이름 외부에서 변수로 넣어줌 - generateSingleChatroomLockName은 memberId를 기준으로 낮은 id, 높은 id 순으로 두어 획일화된 락네임 설정 - 경쟁조건 테스트를 위해 간단한 테스트 작성함. - 유저 2명이서 동시에 채팅방생성을 해봐서, 생성된 채팅방 개수 1개인지 확인 - 둘 중 하나는 오류로 실패했는지 확인 Co-authored-by: Seungho Lee <[email protected]> * Fix/dev miss hotfix commit (#295) * Dev (#274) * Perf/single chatroom: 베타테스트를 위한 채팅 DTO 수정 (#240) * perf/singleChatroom-1: 채팅 조회 총정리, 채팅방 조회 DTO 수정 - SINGLE, AUTH : 본인이 속한 일대일 채팅방 조회 - GROUP, AUTH : 본인이 속한 그룹 채팅방 조회 - AUTH : 본인이 방장인 그룹 채팅방 조회 - 채팅방 DTO 재활용을 위한 인터페이스 화 진행 - 싱글 채팅방 조회 메서드 새로 생성 - 채팅방 조회 DTO에서 채팅들 삭제 * perf/singleChatroom-2: JPA 간단화 및 채팅 RedisDTO에 민감한 정보 제외 * perf/singleChatroom-3: chore 및 누락 Liquibase 되살리기 * perf/singleChatroom-4: Spotlessapply 적용 * perf/singleChatroom-5: @JsonIgnoreProperty 적용해 Override해서 불러오지 말아야 할 값 안 가져옴 * perf/singleChatroom-7: 중복해서 들어간 @JsonIgnoreProperty 삭제 * perf/singleChatroom-8: 중복해서 들어간 Liquibase 코드 삭제 * perf/singleChatroom-9: 채팅 응답 DTO에서 누락된 채팅 ID 표시 * perf/exceptMemberDto-1: 수정 회원 응답 DTO 적용 (MemberService 제외) (#241) * perf/exceptMemberDto-1: 수정 회원 응답 DTO 적용 (MemberService 제외) * perf/exceptMemberDto-2: 1차 서비스 코드 정리 * hotfix/bookmarkAndtime-1: Created 기준 시간 -> 한국 시간으로 변경 & 북마크 공개/비공개 게시글 상관없이 가능하도록 수정 (#243) * fix/comment-toMe-notification-1: 자신이 작성한 게시글에는 댓글 작성 알림 오지 않도록 (이전 회의 사항 미 반영본) (#244) * hotfix/chatroom-getChatError-1: 채팅방 조회시 작성자와 다름 문제 해결 (#245) * fix/comment-toMe-notification-1: 자신이 작성한 게시글에는 댓글 작성 알림 오지 않도록 (이전 회의 사항 미 반영본) * hotfix/chatroom-getChatError-1: 채팅방 조회시 작성자와 다름 문제 해결 * hotfix/file-presignurl-1: 누락된 presignurl 수정 코드 추가 (#251) * hotfix/file-profileImg-1: File presignURL ID로 가져오기 작업 - ProfileImg (#253) * Feat/single chatroom exit : 싱글 채팅방 퇴장 및 혼자 남아있을 경우 (상대방 퇴장 시)알림 구현 (#255) * feat/singleChatroom-1: 싱글 채팅방 퇴장 구현 - 기존 채팅방 퇴장은 그룹 채팅방 퇴장만 구현되어 있음 -> 싱글 채팅방 퇴장도 추가 구현 - 그룹 채팅방은 Redisson 처리한 사항이 있어 DB 저장 작업이 필수적임 -> 구별되게 그룹 채팅방 퇴장과 싱글 채팅방 퇴장을 구분 - 채팅 퇴장 시 퇴장 채팅 저장과 Redis 발행은 기존대로 유지 (채팅 보내기와 동일하게 동작함) * feat/singleChatroom-2: 채팅방 퇴장 시 혼자 남은 채팅방 알림구현 - 그룹, 싱글 알림 모두 구현 - 기존 알림 서비스와 동일 - Set의 members에서 한 명의 유저만 남아있을 경우 stream.findFirst() 사용함 - 사용자 언어설정에 따른 번역 알림 추가 * feat/singleChatroom-isRead-1: 싱글 채팅방 읽음 대상자(상대방) 읽었는지 표시 구현 (#256) * feat/singleChatroom-isRead- 1: 싱글 채팅방 읽음 대상자(상대방) 읽었는지 표시 구현 - Chat 엔티티에 해당 Boolean 값인 isOtherRead 생성 - 읽음 대상자 (상대방)이 GET :chats?chatroomId={채팅방 ID}를 하면 해당 isOtherRead를 true로 바꿔줌 * hotfix/chatroom-bookmark-individual-1: 채팅방 별 북마크 조회 가능하도록 수정 * feat/singleChatroom-isRead- 2: 싱글 채팅방 퇴장 시 알림 구현 사항 되돌리기 - 이유 : 불필요 * Feat/chat authorization : 일대일 채팅 JWT Authorization 넣기 (#254) * feat/chat-authorization-1: STOMP 시큐리티 작업 - SecurityWebSockConfig: - SecurityConfig로 보호되지 않았던 /pub, /sub 보안 잠그기 - WebSockConfig: - 채팅 발행하기에 앞서 Client에서 보내준 Authorization 값 STOMP Session에 포함시키기 위한 Interceptor 주입 * feat/chat-authorization-2: WebSocketInterceptor 작업 - WebSocketInterceptor: - CONNCECT -> SEND 모두 authorization을 받아 JWTFilter의 doFilterChain 메서드가 하는 일을 수행함 - 자격증명이 마친다면 StompHeaderAccessor로 회원 이메일을 전달함 * hotfix/chatroom-exit-unsubscribe-1: 기존에 DISCONNECT 했던 채팅방을 UNSUBSCRIBE로 퇴장을 구현함 (#258) * hotfix/chatroom-exit-unsubscribe-1: 기존에 DISCONNECT 했던 채팅방을 UNSUBSCIRBE로 퇴장을 수정함 * hotfix/chatroom-exit-unsubscribe-2: spotlessapply * feat(채팅): 더 세밀한 채팅 관련 인증/인가 조절 구현 (#259) 개요 - 현재 SecurityWebSocketConfig에서 HttpSecurity를 사용하고 있는데, 이를 authorizationManager로 바꾸어 STOMP 명령어별로 인증/인가를 설정할 수 있도록 한다. 수정사항 - 누구나 접속해도 되는 CONNECT, UNSUB, DISCONNECT, HEARTBEAT는 풀어놓고 - MESSAGE, SUB은 인증이 될 경우에만 호출할 수 있도록 한다. - 추가로, SEND /pub, SUBSCRIBE /sub으로의 destination은 무조건 인증된 경우만 접근할 수 있도록 - 이외의 호출은 모두 거절한다. - csrfChannelInterceptor는 csrf 활성화를 제거하기 위한 작업. (브라우저는 어플에서 사용하지 않으므로 csrf 비활성화) - Interceptor의 로직 같은 경우, 초기 CONNECT하는 경우에만 JWT로 해당 유저의 인증상태를 확인한다. (만료된 상황에서 확인하는 과정은 다음 PR에서 진행하도록 하겠습니다.) - authenticated()를 AuthorizationManager에서 사용하려면, 현재 컨텍스트에 setAuthentication을 해주고, 이후의 활용을 위해 accessor.setUser까지 추가해줘야한다. 그래야만 인증이 되었을 때, 문제없이 인증을 할 수 있다. - 참고로, Websocket 자체에서 인증 인가를, Header에서 simpUser로 진행하기 때문에, 기존에 header에 넣어줬던 userEmail을 제거하고 SocketController의 UserDetails 주입을 통해 해당 인증 정보를 가져올 수 있도록 한다. 기존의 userEmail을 이렇게 변경한 이유는, 웹소켓이 초기에 연결이 성립되고 이후에 메시지보내기 등을 사용하면 기존의 Auth 정보는 header에 저장이 되지만, 우리가 직접 넣어줬던 userEmail은 요청마다 새로 다시 넣어줘야하기 때문이다. * fix(error): 웹소켓 에러 시에 이유 함께 보낼 수 있도록 처리 (#260) 개요 - 현재 웹소켓의 연결이 끊길 때 원인이 잘 나오지 않는 문제가 있다. - 에러 발생 시, 원인을 전달하기 위해 StompSubProtocolHandler를 직접 작성한다. - Interceptor에서 에러 체킹을 추가한다. 수정 사항 - 에러 발생 시, 원인을 전달하기 위해 StompSubProtocolHandler를 직접 - 빠른 구현을 위해 링크 참고해서 일부만 수정함: https://velog.io/@jkijki12/%EC%B1%84%ED%8C%85-STOMP-JWT - WebsocketInterceptor에서, JWT가 필요한 Command와 그렇지 않은 Command를 구분해서 알맞게 상황처리를 해준다. - CONNECT, SEND, MESSAGE, SUBSCRIBE는 JWT 필요 - CONNECT의 경우에는 초기 auth 설정해줌 - SUBSCRIBE의 경우에 destination 체킹 진행 - SUBSCRIBE 때, 구독 권한이 있는지 확인한다. - chatroom.getMembers().contains(member) 이 부분에서 Member 인스턴스가 달라도, id로 멤버가 포함되어있는지 체킹이 필요하기 때문에, equals와 hashcode 함께 override (Convention 따라, o 변수 사용) * refactor/chat-exit-auth-1: 개선된 채팅 인증/인가 적용한 채팅방 퇴장 수정 (#261) - 기존에 채팅방 퇴장하면 DISCONNECT 했던 것을 UNSUBSCRIBE로 수정 - messagingTemplate 이용해 UNSUBSCRIBE 메시지 직접 서버에서 전송 chore - 이전에 DISCONNECT 하지 않았어야 하는 enter 부분 코드 Exception 던지는 것으로 수정 - 불필요한 퇴장 시 빈 채팅방 확인 코드 삭제 * Revert "Feat/chatroom re enter (#264)" (#267) This reverts commit c75de607533575343a5f69be2723d212fdb5a0a7. * Merge/dev (#270) * feat/chatroom-reEnter-1: 재입장 가능하도록 - 중간 테이블 chatroom_exited_member 생성 재입장 로직: - EXIT을 하게 되면 chatroom_member에서 member이 삭제되는 것이 아닌 chatroom_exited_member에 member가 추가되는 것임 - 응답 DTO에 퇴장한 회원 정보 표시 (그룹 채팅방에 접속한 회원 수 표시 목적) * feat/chatroom-reEnter-2: 채팅방 조회 코드 수정 및 chore - ChatService: - EXIT: - 퇴장을 하게 되면 chatroom의 members에서 삭제되는 것이 아닌 exitedMembers에 추가되는 것임 - CHAT: - 퇴장을 한 회원에게는 채팅 알림이 가지 않아야 하기 때문에 제외 코드를 추가함 - ENTER: - 그 후 재 입장을 하게 되면 원래 있던 채팅방에 입장해야 하기 때문에 exitedMembers에서 삭제를 진행하며 입장 알림이 가도록 함 - ChatroomService: - GET 채팅방 조회시에 퇴장한 채팅방은 포함되지 않아야 하기 때문에 filter 코드 추가함 - 퇴장한 채팅방 조회도 가능하도록 추가 - GET : /api/chatrooms?type=EXITED chore - 방장인 채팅방 조회: - GET : /api/chatrooms?type=MANAGER - Test 통과를 위한 JVM 크기 2GB로 늘림 - SWAGGER 반영 완료 * feat/chatroom-reEnter-3: 퇴장한 채팅방 접근 강화 * feat/chatroom-reEnter-4: build messaging 추가 * Merge/dev (#270) (#273) * feat/chatroom-reEnter-1: 재입장 가능하도록 - 중간 테이블 chatroom_exited_member 생성 재입장 로직: - EXIT을 하게 되면 chatroom_member에서 member이 삭제되는 것이 아닌 chatroom_exited_member에 member가 추가되는 것임 - 응답 DTO에 퇴장한 회원 정보 표시 (그룹 채팅방에 접속한 회원 수 표시 목적) * feat/chatroom-reEnter-2: 채팅방 조회 코드 수정 및 chore - ChatService: - EXIT: - 퇴장을 하게 되면 chatroom의 members에서 삭제되는 것이 아닌 exitedMembers에 추가되는 것임 - CHAT: - 퇴장을 한 회원에게는 채팅 알림이 가지 않아야 하기 때문에 제외 코드를 추가함 - ENTER: - 그 후 재 입장을 하게 되면 원래 있던 채팅방에 입장해야 하기 때문에 exitedMembers에서 삭제를 진행하며 입장 알림이 가도록 함 - ChatroomService: - GET 채팅방 조회시에 퇴장한 채팅방은 포함되지 않아야 하기 때문에 filter 코드 추가함 - 퇴장한 채팅방 조회도 가능하도록 추가 - GET : /api/chatrooms?type=EXITED chore - 방장인 채팅방 조회: - GET : /api/chatrooms?type=MANAGER - Test 통과를 위한 JVM 크기 2GB로 늘림 - SWAGGER 반영 완료 * feat/chatroom-reEnter-3: 퇴장한 채팅방 접근 강화 * feat/chatroom-reEnter-4: build messaging 추가 --------- Co-authored-by: Seungho Lee <[email protected]> * Dev (#280) * Perf/single chatroom: 베타테스트를 위한 채팅 DTO 수정 (#240) * perf/singleChatroom-1: 채팅 조회 총정리, 채팅방 조회 DTO 수정 - SINGLE, AUTH : 본인이 속한 일대일 채팅방 조회 - GROUP, AUTH : 본인이 속한 그룹 채팅방 조회 - AUTH : 본인이 방장인 그룹 채팅방 조회 - 채팅방 DTO 재활용을 위한 인터페이스 화 진행 - 싱글 채팅방 조회 메서드 새로 생성 - 채팅방 조회 DTO에서 채팅들 삭제 * perf/singleChatroom-2: JPA 간단화 및 채팅 RedisDTO에 민감한 정보 제외 * perf/singleChatroom-3: chore 및 누락 Liquibase 되살리기 * perf/singleChatroom-4: Spotlessapply 적용 * perf/singleChatroom-5: @JsonIgnoreProperty 적용해 Override해서 불러오지 말아야 할 값 안 가져옴 * perf/singleChatroom-7: 중복해서 들어간 @JsonIgnoreProperty 삭제 * perf/singleChatroom-8: 중복해서 들어간 Liquibase 코드 삭제 * perf/singleChatroom-9: 채팅 응답 DTO에서 누락된 채팅 ID 표시 * perf/exceptMemberDto-1: 수정 회원 응답 DTO 적용 (MemberService 제외) (#241) * perf/exceptMemberDto-1: 수정 회원 응답 DTO 적용 (MemberService 제외) * perf/exceptMemberDto-2: 1차 서비스 코드 정리 * hotfix/bookmarkAndtime-1: Created 기준 시간 -> 한국 시간으로 변경 & 북마크 공개/비공개 게시글 상관없이 가능하도록 수정 (#243) * fix/comment-toMe-notification-1: 자신이 작성한 게시글에는 댓글 작성 알림 오지 않도록 (이전 회의 사항 미 반영본) (#244) * hotfix/chatroom-getChatError-1: 채팅방 조회시 작성자와 다름 문제 해결 (#245) * fix/comment-toMe-notification-1: 자신이 작성한 게시글에는 댓글 작성 알림 오지 않도록 (이전 회의 사항 미 반영본) * hotfix/chatroom-getChatError-1: 채팅방 조회시 작성자와 다름 문제 해결 * hotfix/file-presignurl-1: 누락된 presignurl 수정 코드 추가 (#251) * hotfix/file-profileImg-1: File presignURL ID로 가져오기 작업 - ProfileImg (#253) * Feat/single chatroom exit : 싱글 채팅방 퇴장 및 혼자 남아있을 경우 (상대방 퇴장 시)알림 구현 (#255) * feat/singleChatroom-1: 싱글 채팅방 퇴장 구현 - 기존 채팅방 퇴장은 그룹 채팅방 퇴장만 구현되어 있음 -> 싱글 채팅방 퇴장도 추가 구현 - 그룹 채팅방은 Redisson 처리한 사항이 있어 DB 저장 작업이 필수적임 -> 구별되게 그룹 채팅방 퇴장과 싱글 채팅방 퇴장을 구분 - 채팅 퇴장 시 퇴장 채팅 저장과 Redis 발행은 기존대로 유지 (채팅 보내기와 동일하게 동작함) * feat/singleChatroom-2: 채팅방 퇴장 시 혼자 남은 채팅방 알림구현 - 그룹, 싱글 알림 모두 구현 - 기존 알림 서비스와 동일 - Set의 members에서 한 명의 유저만 남아있을 경우 stream.findFirst() 사용함 - 사용자 언어설정에 따른 번역 알림 추가 * feat/singleChatroom-isRead-1: 싱글 채팅방 읽음 대상자(상대방) 읽었는지 표시 구현 (#256) * feat/singleChatroom-isRead- 1: 싱글 채팅방 읽음 대상자(상대방) 읽었는지 표시 구현 - Chat 엔티티에 해당 Boolean 값인 isOtherRead 생성 - 읽음 대상자 (상대방)이 GET :chats?chatroomId={채팅방 ID}를 하면 해당 isOtherRead를 true로 바꿔줌 * hotfix/chatroom-bookmark-individual-1: 채팅방 별 북마크 조회 가능하도록 수정 * feat/singleChatroom-isRead- 2: 싱글 채팅방 퇴장 시 알림 구현 사항 되돌리기 - 이유 : 불필요 * Feat/chat authorization : 일대일 채팅 JWT Authorization 넣기 (#254) * feat/chat-authorization-1: STOMP 시큐리티 작업 - SecurityWebSockConfig: - SecurityConfig로 보호되지 않았던 /pub, /sub 보안 잠그기 - WebSockConfig: - 채팅 발행하기에 앞서 Client에서 보내준 Authorization 값 STOMP Session에 포함시키기 위한 Interceptor 주입 * feat/chat-authorization-2: WebSocketInterceptor 작업 - WebSocketInterceptor: - CONNCECT -> SEND 모두 authorization을 받아 JWTFilter의 doFilterChain 메서드가 하는 일을 수행함 - 자격증명이 마친다면 StompHeaderAccessor로 회원 이메일을 전달함 * hotfix/chatroom-exit-unsubscribe-1: 기존에 DISCONNECT 했던 채팅방을 UNSUBSCRIBE로 퇴장을 구현함 (#258) * hotfix/chatroom-exit-unsubscribe-1: 기존에 DISCONNECT 했던 채팅방을 UNSUBSCIRBE로 퇴장을 수정함 * hotfix/chatroom-exit-unsubscribe-2: spotlessapply * feat(채팅): 더 세밀한 채팅 관련 인증/인가 조절 구현 (#259) 개요 - 현재 SecurityWebSocketConfig에서 HttpSecurity를 사용하고 있는데, 이를 authorizationManager로 바꾸어 STOMP 명령어별로 인증/인가를 설정할 수 있도록 한다. 수정사항 - 누구나 접속해도 되는 CONNECT, UNSUB, DISCONNECT, HEARTBEAT는 풀어놓고 - MESSAGE, SUB은 인증이 될 경우에만 호출할 수 있도록 한다. - 추가로, SEND /pub, SUBSCRIBE /sub으로의 destination은 무조건 인증된 경우만 접근할 수 있도록 - 이외의 호출은 모두 거절한다. - csrfChannelInterceptor는 csrf 활성화를 제거하기 위한 작업. (브라우저는 어플에서 사용하지 않으므로 csrf 비활성화) - Interceptor의 로직 같은 경우, 초기 CONNECT하는 경우에만 JWT로 해당 유저의 인증상태를 확인한다. (만료된 상황에서 확인하는 과정은 다음 PR에서 진행하도록 하겠습니다.) - authenticated()를 AuthorizationManager에서 사용하려면, 현재 컨텍스트에 setAuthentication을 해주고, 이후의 활용을 위해 accessor.setUser까지 추가해줘야한다. 그래야만 인증이 되었을 때, 문제없이 인증을 할 수 있다. - 참고로, Websocket 자체에서 인증 인가를, Header에서 simpUser로 진행하기 때문에, 기존에 header에 넣어줬던 userEmail을 제거하고 SocketController의 UserDetails 주입을 통해 해당 인증 정보를 가져올 수 있도록 한다. 기존의 userEmail을 이렇게 변경한 이유는, 웹소켓이 초기에 연결이 성립되고 이후에 메시지보내기 등을 사용하면 기존의 Auth 정보는 header에 저장이 되지만, 우리가 직접 넣어줬던 userEmail은 요청마다 새로 다시 넣어줘야하기 때문이다. * fix(error): 웹소켓 에러 시에 이유 함께 보낼 수 있도록 처리 (#260) 개요 - 현재 웹소켓의 연결이 끊길 때 원인이 잘 나오지 않는 문제가 있다. - 에러 발생 시, 원인을 전달하기 위해 StompSubProtocolHandler를 직접 작성한다. - Interceptor에서 에러 체킹을 추가한다. 수정 사항 - 에러 발생 시, 원인을 전달하기 위해 StompSubProtocolHandler를 직접 - 빠른 구현을 위해 링크 참고해서 일부만 수정함: https://velog.io/@jkijki12/%EC%B1%84%ED%8C%85-STOMP-JWT - WebsocketInterceptor에서, JWT가 필요한 Command와 그렇지 않은 Command를 구분해서 알맞게 상황처리를 해준다. - CONNECT, SEND, MESSAGE, SUBSCRIBE는 JWT 필요 - CONNECT의 경우에는 초기 auth 설정해줌 - SUBSCRIBE의 경우에 destination 체킹 진행 - SUBSCRIBE 때, 구독 권한이 있는지 확인한다. - chatroom.getMembers().contains(member) 이 부분에서 Member 인스턴스가 달라도, id로 멤버가 포함되어있는지 체킹이 필요하기 때문에, equals와 hashcode 함께 override (Convention 따라, o 변수 사용) * refactor/chat-exit-auth-1: 개선된 채팅 인증/인가 적용한 채팅방 퇴장 수정 (#261) - 기존에 채팅방 퇴장하면 DISCONNECT 했던 것을 UNSUBSCRIBE로 수정 - messagingTemplate 이용해 UNSUBSCRIBE 메시지 직접 서버에서 전송 chore - 이전에 DISCONNECT 하지 않았어야 하는 enter 부분 코드 Exception 던지는 것으로 수정 - 불필요한 퇴장 시 빈 채팅방 확인 코드 삭제 * Revert "Feat/chatroom re enter (#264)" (#267) This reverts commit c75de607533575343a5f69be2723d212fdb5a0a7. * Merge/dev (#270) * feat/chatroom-reEnter-1: 재입장 가능하도록 - 중간 테이블 chatroom_exited_member 생성 재입장 로직: - EXIT을 하게 되면 chatroom_member에서 member이 삭제되는 것이 아닌 chatroom_exited_member에 member가 추가되는 것임 - 응답 DTO에 퇴장한 회원 정보 표시 (그룹 채팅방에 접속한 회원 수 표시 목적) * feat/chatroom-reEnter-2: 채팅방 조회 코드 수정 및 chore - ChatService: - EXIT: - 퇴장을 하게 되면 chatroom의 members에서 삭제되는 것이 아닌 exitedMembers에 추가되는 것임 - CHAT: - 퇴장을 한 회원에게는 채팅 알림이 가지 않아야 하기 때문에 제외 코드를 추가함 - ENTER: - 그 후 재 입장을 하게 되면 원래 있던 채팅방에 입장해야 하기 때문에 exitedMembers에서 삭제를 진행하며 입장 알림이 가도록 함 - ChatroomService: - GET 채팅방 조회시에 퇴장한 채팅방은 포함되지 않아야 하기 때문에 filter 코드 추가함 - 퇴장한 채팅방 조회도 가능하도록 추가 - GET : /api/chatrooms?type=EXITED chore - 방장인 채팅방 조회: - GET : /api/chatrooms?type=MANAGER - Test 통과를 위한 JVM 크기 2GB로 늘림 - SWAGGER 반영 완료 * feat/chatroom-reEnter-3: 퇴장한 채팅방 접근 강화 * feat/chatroom-reEnter-4: build messaging 추가 * Merge/dev (#270) (#273) * feat/chatroom-reEnter-1: 재입장 가능하도록 - 중간 테이블 chatroom_exited_member 생성 재입장 로직: - EXIT을 하게 되면 chatroom_member에서 member이 삭제되는 것이 아닌 chatroom_exited_member에 member가 추가되는 것임 - 응답 DTO에 퇴장한 회원 정보 표시 (그룹 채팅방에 접속한 회원 수 표시 목적) * feat/chatroom-reEnter-2: 채팅방 조회 코드 수정 및 chore - ChatService: - EXIT: - 퇴장을 하게 되면 chatroom의 members에서 삭제되는 것이 아닌 exitedMembers에 추가되는 것임 - CHAT: - 퇴장을 한 회원에게는 채팅 알림이 가지 않아야 하기 때문에 제외 코드를 추가함 - ENTER: - 그 후 재 입장을 하게 되면 원래 있던 채팅방에 입장해야 하기 때문에 exitedMembers에서 삭제를 진행하며 입장 알림이 가도록 함 - ChatroomService: - GET 채팅방 조회시에 퇴장한 채팅방은 포함되지 않아야 하기 때문에 filter 코드 추가함 - 퇴장한 채팅방 조회도 가능하도록 추가 - GET : /api/chatrooms?type=EXITED chore - 방장인 채팅방 조회: - GET : /api/chatrooms?type=MANAGER - Test 통과를 위한 JVM 크기 2GB로 늘림 - SWAGGER 반영 완료 * feat/chatroom-reEnter-3: 퇴장한 채팅방 접근 강화 * feat/chatroom-reEnter-4: build messaging 추가 * feat/chatroom-dto-add-lastChat-1: 채팅방 GET요청 시 최신 순 정렬된 마지막 채팅 DTO에 추가 (#272) * chore(log): 버그 확인 용도로 사용한 로깅 삭제 (#275) 개요 - 꿀팁게시판 자유게시판이 섞이는 부분의 확인을 위해 로깅함수를 사용했는데 이를 삭제한다. * fix(ws): 웹소켓 HEARTBEAT 안되는 문제 구현 (#276) * hotfix/member-like-mapping-1: 회원정보 불러올 때 ResponseMapper 수정 (제대로 Hobbies와 Languages 불러오도록) (#278) * Feat/chatroom exit and re enter : 퇴장 후 재 입장 코드 로직 수정 및 개선 (#277) * feat/chatroom-exit-and-reEnter-1: 퇴장 채팅방과 회원 엔티티 간의 중간 테이블 생성 - 생성한 원인으로는 기존에 만들었던 테이블 (채팅방과 회원)으로는 reEnterTime 컬럼을 생성할 수 없었기 때문 - 퇴장 로직 설명: - 퇴장을 하면 중간테이블인 ChatroomExitedMember가 생김 - 해당 테이블에 채팅방, 회원 reEnterTime이 생김 - 재입장 하지 않는 한 해당 테이블의 reEnterTime은 null임 (퇴장, 재입장, 퇴장 시에도 null) - 채팅방, 회원 간에 unique해야 하는 테이블이므로 uniqueConstraints 값 설정 * feat/chatroom-exit-and-reEnter-2: 퇴장 후 재입장 및 채팅 불러오기 로직 정리 - 재입장 로직: - 재입장 시에는 CheckPoint에 시각이 찍힘 - 이는 채팅 불러오기, 채팅방 구독 전 EXITED 채팅방 불러오기 시에 사용 - GET :/chats?chatroomId={} 시에 getChats를 할 때에 reEnterTime 이후에 유효한 채팅이 자동으로 적용되어 들어감 - docs : Liquibase 문 기존에 만들어 둔 단순 중간 테이블 삭제 후 새 테이블 생성 (이중 테이불이 생기는 경우이므로 기존 DDL update 문 삭제 후 생성을 진행함) * feat/chatroom-exit-and-reEnter-3: Migration은 삭제가 아닌 수정을 하자 - 기존 외래키 관계 및 고유 키 drop 후 새로 중간 테이블 새로 생성 - 이전에 선언했던 단순 중간 테이블 v1.0.5.xml 되살리기 * feat/chatroom-exit-and-reEnter-4: 중간 테이블 ChatroomMember 재 선언 - ExitMember과 ActiveMember를 함께 관리 * feat/chatroom-exit-and-reEnter-5: 주요 수정 Service - 기존 퇴장, 재입장 로직과 동일 - 채팅방의 ACTIVE 한 채팅방 회원들만 가져오는 함수 모듈화 - getSingleChatroom에 앞선 모듈화 함수를 사용하지 않은 이유로는 재입장 시에 사용하는 엔드포인트에서도 (EXITED) 사용하기 때문 - 재입장 시에만 EXITED 조건을 허용해 주기 때문에 다른 메서드에서는 ACTIVE한 상태인지 확인하는 조건이 추가됨 - 웹소켓 preSend 조건에서 사용하는 isMemberInChatroom에서는 Sub 시에 사용하기 때문에 재 입장 시에도 Sub 먼저 해야 하기 때문에 채팅방과 회원간에 관계가 없을 경우에만 Exception을 내뱉도록 수정함 * feat/chatroom-exit-and-reEnter-6: getMembers -> validMembers 메서드 이용후 contains() 메서드 이용 * feat/chatroom-exit-and-reEnter-7: chore/docs * feat/chatroom-exit-and-reEnter-8: SUB 보안 되살리기 - 앞선 코드에서 SUB를 퇴장한 회원에 한해서는 허용해왔지만 - 퇴장한 회원 가운데에 재입장한 회원에 한해 허용하도록 엔드포인트를 하나 더 생성함 (서버에서 채팅방 회원의 status를 Active로 바꿔주는 엔드포인트) * feat/chatroom-count-1: 채팅방 list 조회 시에 count가 보이도록 구현 (#279) - lastHoldAt : ChatroomMember에 채팅방을 떠날 때에 TimeStamp를 기록 - 해당 값은 채팅방 뒤로가기를 누를 시에, 채팅 목록 조회 시에 업데이트 됨 - Put :/chatrooms/{chatroomId}/hold 엔드포인트 생성 : - 해당 엔드포인트는 채팅방 안읽은 채팅 갯수를 업데이트 하기 위한 용도로 사용됨 --------- Co-authored-by: Seungho Lee <[email protected]> * hotfix/chatroom-delete-backHoldAt-1: (#289) 채팅 불러오기 시에 실행되는 LastHoldAt이 중복으로 실행되는 엔드포인트 PUT :/chatrooms/{roomId}/hold 삭제 * fix(chat): 채팅방 동시 생성 문제 해결 (#290) * fix(db): 테스트 환경에서 초기 데이터 값이 들어가는 부분 수정 개요 및 수정사항 - 현재 초기에 삽입되는 데이터 sql의 파일명이 init.sql로 되어있어, sql init never를 설정해줘도 테스트 실행 시에 자동으로 스프링에 삽입시킨다. 따라서 data.sql로 바꿔준다. 추가로, test시에 init mode를 never로 바꿔준다. * fix(chat): 채팅방 존재 체크 JPQL 수정 개요 - 현재 채팅방 존재의 JPQL이 잘못되어 있어 올바른 체킹이 이루어지지 않고 있다. - 기존에는 cm.member의 같은 변수로 두개의 값이랑 같은지 비교하므로 성립이 안됨 - 따라서, 따라서, JPQL 쿼리를 수정하여 각 멤버를 별도의 변수(cm1, cm2)로 매핑하고, 각각 :member1, :member2와 비교하도록 변경함. + 싱글 채팅방인 경우 - 이러면 채팅방 중에 member 둘 다 있고, 싱글 채팅방인 경우만 가져오므로 해결이 된다. * fix(chat): 채팅방 동시 생성 경쟁 방지 개요 - 1:1 채팅을 둘이 동시에 만드는 경우에, 둘 다 생겨서 문제가 생긴다. 이를 방지하기 위해, 경쟁 조건을 방지해준다. 수정 사항 - 기존 수연님이 작성해주신 RedisLockChatServiceFacade.java의 코드를 재활용하기 편하게 바꿈 - 우선 락 이름을 외부에서 알아서 넣어주도록 바꿈 - executeWithLock을 오버로딩해서, Runnable (리턴 값없는 경우), Callable (리턴 값 있는 경우)의 경우로 나누어서 함수를 작성함 -> 참고로 이 둘은 쓰레드 태스크 실행 시에 사용 - createSingleChatroom과 기존 함수에서 이 바꾼 함수 사용 - 락 이름 외부에서 변수로 넣어줌 - generateSingleChatroomLockName은 memberId를 기준으로 낮은 id, 높은 id 순으로 두어 획일화된 락네임 설정 - 경쟁조건 테스트를 위해 간단한 테스트 작성함. - 유저 2명이서 동시에 채팅방생성을 해봐서, 생성된 채팅방 개수 1개인지 확인 - 둘 중 하나는 오류로 실패했는지 확인 --------- Co-authored-by: Seungho Lee <[email protected]> --------- Co-authored-by: Seungho Lee <[email protected]>
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
#282 내용 참고