Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* 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]>
- Loading branch information