-
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
fix(profile): MBTI 선택 안함 옵션을 위해 null로 저장 #283
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
개요 및 수정 사항 - MBTI가 있다가 유저가 MBTI 선택지를 없애는 상황에서는 null을 받는 경우도 있는데 이를 처리해주자. 그런 이유로 굳이 null이어도 set해주자 - 참고로, 프론트에서는 본인 프로필 상태에 따른 ContextAPI를 통해 항상 mbti 선택지가 있는 경우는 본인 MBTI를 변수로 들고 있고, 선택을 안했거나 선택지를 없앴을 때는 null 값을 갖고 있다.
KooSuYeon
approved these changes
Nov 14, 2024
KooSuYeon
pushed a commit
that referenced
this pull request
Nov 14, 2024
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]>
seungholee-dev
added a commit
that referenced
this pull request
Nov 21, 2024
* Refactor/file include url chat byte : 채팅 String으로 이미지 입력을 받자 (#203) * refactor/file-includeUrl-chatByte-1: 파일 upload시 url에 presignURL 적히도록 수정 * refactor/file-includeUrl-chatByte-2: - 1. 파일 List형태의 imgCode (여러개 이미지 파일)로 전송 시 MultipartFile로 바꿈 - 2. File업로드 진행 - 3. Redis로 파일 List형태의 presign URL 전송 - 실패 : 파일 저장도 안되고 전송도 안됨 * refactor/file-includeUrl-chatByte-3: - imgCode에 따른 DTO의 수정사항 * refactor/file-includeUrl-chatByte-4: - else * Refactor/file include url chat byte : 채팅 String으로 이미지 입력을 받자 (#203) (#209) * refactor/file-includeUrl-chatByte-1: 파일 upload시 url에 presignURL 적히도록 수정 * refactor/file-includeUrl-chatByte-2: - 1. 파일 List형태의 imgCode (여러개 이미지 파일)로 전송 시 MultipartFile로 바꿈 - 2. File업로드 진행 - 3. Redis로 파일 List형태의 presign URL 전송 - 실패 : 파일 저장도 안되고 전송도 안됨 * refactor/file-includeUrl-chatByte-3: - imgCode에 따른 DTO의 수정사항 * refactor/file-includeUrl-chatByte-4: - else * fix(채팅): 채팅 파일 전송 수정 (#205) * fix(채팅): 채팅 파일 전송 수정 개요 - 수연님이 구현해주신 PR #203에서 에러나는 부분을 수정하고 동작을 확인한다. 수정 사항 - CustomMulipartFile을 Base64MultipartFile로 이름 변경 - 기존에 DiskFileItem으로 생성했다면, content, type, name을 직접 전달하여 명시적으로 생성하도록 변경 - 불필요한 DiskFileItem 등 삭제. 파일 생성 후 저장 방식을 수연님이 만든 Base64MultipartFile로 생성하여 fileService에 전달 - DisconnectHandler의 함수명 조금 더 명시적으로 변경 - 불필요한 모듈 삭제 * chore(ws): 웹소켓 디버깅 로깅 활성화 개요 - 앞으로 웹소켓 관련 디버깅을 조금 더 정확히 하기 위해 로컬에서 웹소켓 로깅을 활성화 한다. * fix(sql): 채팅방 setting dummy data 수정 개요 및 수정사항 - 현재 dummyData에 count = 0이 들어가지 않아서, 채팅방 입장시 getCount에서 null으로 인식되어 에러가 뜸. * Fix/members chatrooms display tmp (#210) * fix/members-chatrooms-display-1: 내가 쓴 글 / 내가 쓴 댓글 조회 시 좋아요/댓글 , isLiked, isPublic 표시 * fix/members-chatrooms-display-2: 불필요해진 maxCount 삭제 * fix/members-chatrooms-display-3: 게시글 글자수 제한 해제 -> LONGTEXT로 변경 --------- Co-authored-by: suyeon <[email protected]> * fix/notificationToken-byDeviceId-1: DeviceId마다 알림 리스트를 GET할 수 있도록 (#207) * fix/notificationToken-byDeviceId-1: - NotificationController, getNotifications: - 알림 리스트를 받아올 때 pathVariable에 deviceId 추가해 deviceId별 알림 리스트를 받아올 수 있도록 함 - 이때 deviceId를 가진 회원만이 알림들을 가져올 수 있음 - sendNotificationTokens: - deviceId 마다 하나의 토큰만이 생성되도록 로직 수정 - isTokenAlive 메서드를 추가해 이전에 해당 device 앞으로 된 토큰이 있는지 확인하고 없다면 새로 만들고 - 기존에 회원이 등록했던 deviceIdfh 된 토큰이라면 새로 만들지 않고 응답 DTO를 작성함 * fix/notificationToken-byDeviceId-2: 테스트 편의성을 위한 sql 수정 * refactor/enum-string-1: (#208) - 국가코드, 여가, 언어코드 : NOT ENUM - 게시글 타입, 북마크 타입, 채팅방 타입, 채팅 타입, 커넥트 상태, 파일 포맷, 채팅방 목적, MBTI, 좋아요 타입, 알림 타입, 신고 타입 : ENUM - 회원 생성, 채팅방 생성 테스트 완료 * chore(db): Liquibase 적용 및 수정 (#212) * feat/liquibase-implementation-1: Liquibase 적용을 위한 yml 설정 - application.yml: - Liquibase를 통한 DDL 생성으로 인한 ddl-auto 해제 - Liquibase와 import.sql 을 함께 사용하기 위해서 hibernate 초기화 이후 import.sql을 실행하는 옵션값인 defer-datasource-initialization값을 false 로 되돌림 - application-local.yml: - Liquibase 사용 가능하도록 local에 추가 - master인 application.yml과 설정값 통일 시키기 * feat/liquibase-implementation-2: Liquibase XML - migration 시키기 전 테이블 수 26개 작성 - 관계 연결 완료 * feat/liquibase-implementation-3: test의 application.yml - ./gradlew build 통과를 위한 liquibase 명시 * chore(db): Liquibase 적용 및 수정 개요 - 수연님이 작성해주신 Liquibase PR #204를 바탕으로 수정 진행 수정 사항 - Liquibase를 release 버전 별로 관리를 할 수 있도록 폴더 및 구조 추가 - changeset ID를 조금 더 랜덤화하고(중복 방지), type을 대문자로 하여 가독성을 높임 - FK constraint 이름은 자동 생성으로 하여 정하였음. - liquibase가 prod, local에 둘 다 적용이 필요하므로, application.yml에 추가 - ddl-auto 및 defer-datasourc-initialization등 기본값이 none, false이기 때문에 불필요한 코드 삭제 - 추가로, PR #208의 변경 사항으로 ENUM 관련 column들이 string으로 바뀌어서 column type도 함께 liquibase에서 변경해준다. (PR로 squash - 초기 스크립트 에러도 고쳤음 - application-prod가 빈파일이어서 불필요하므로 삭제 --------- Co-authored-by: suyeon <[email protected]> * feat/chatroom-random-1: 랜덤하게 10개 그룹 채팅방 뽑아오는 API 추가 및 탈퇴 시 댓글 삭제 처리 로직 수정 (#211) * feat/chatroom-random-1: 랜덤하게 10개 그룹 채팅방 뽑아오는 API 추가 - 랜덤한 채팅방 10개의 후보군으로는 그룹 채팅방, 인원수가 꽉 차지 않은 채팅방이 보여짐 * feat/chatroom-random-2: 댓글 삭제 로직 변경 - 솔로 댓글일 경우 -> 탈퇴 시 자동 삭제 - 자식 댓글일 경우 -> 탈퇴 시 자동 삭제 - 부모 댓글일 경우 -> 탈퇴 시 NULL 처리 * feat/chatroom-random-3: 방장인 그룹 채팅방은 랜덤 호출 시 안 보이게 수정 * fix(db): 잘못 수정된 group purpose TYPE을 liquibase에 추가 (#213) 개요 및 수정사항 - group_purpose의 type 컬럼을 삭제했었는데, 필요한 컬림이므로 다시 추가해준다. * refactor(file): File 모델의 URL 컬럼 삭제, Exception 리팩토링 (#214) * chore(file): S3 File에 관한 Exception 정의 개요 - S3 upload 과정에서 문제가 생겼을 때 custom exception을 정의하자. 수정 사항 - S3 File 이름의 validation을 위한 S3FileNameInvalidException 정의 - 찾는 S3 파일이 DB에 없을 때를 위한 S3FileNotFoundException 정의 * refactor(file): File 모델의 URL 컬럼 삭제, Exception 리팩토링 개요 - 현재 DB에 pre-signed url을 저장하고 있는데, pre-signed url은 일시적으로만 사용하는 것이므로 DB에 저장을 하지않도록 한다. - 프론트엔드 코드에서는 다행히 File 모델의 url 값을 필요로 하는 부분은 없어서 리팩토링 진행 (presignedImgProfile로 이미지 렌더링을 하더라구요) - 반복되는 코드 genereatePresignedUrl 함수로 리팩토링 - exception의 경우에 global exception handler가 있으므로, try catch 걸지 않아도, 괜찮아서 삭제 * refactor/board-getall-1: 게시글 모든 타입도 가져올 수 있게 수정 (#215) - 파라미터 변경사항 -> type 존재 * fix/blockservice-mistake-1: 잘못 비교했던 id 비교 수정 & 메서드 재활용 UP (#216) * refactor/board-getall-1: 게시글 모든 타입도 가져올 수 있게 수정 - 파라미터 변경사항 -> type 존재 * fix/blockservice-mistake-1: 잘못 비교했던 id 비교 수정 & 메서드 재활용 UP * fix/blockservice-mistake-1: 본인이 방장인 채팅방 불러오기 추가 - 기존 채팅방을 불러오는 API인 GET: /chatrooms 에서 파라미터를 아무것도 넣지 않을 때 방장을 불러올 수 있음 - 파리미터 GROUP -> 속하거나 방장인 그룹 채팅방 - 파라미터 SINGLE -> 속한 싱글 채팅방 * release(v1.0.0)-alpha 배포 (#217) * Refactor/file include url chat byte : 채팅 String으로 이미지 입력을 받자 (#203) * refactor/file-includeUrl-chatByte-1: 파일 upload시 url에 presignURL 적히도록 수정 * refactor/file-includeUrl-chatByte-2: - 1. 파일 List형태의 imgCode (여러개 이미지 파일)로 전송 시 MultipartFile로 바꿈 - 2. File업로드 진행 - 3. Redis로 파일 List형태의 presign URL 전송 - 실패 : 파일 저장도 안되고 전송도 안됨 * refactor/file-includeUrl-chatByte-3: - imgCode에 따른 DTO의 수정사항 * refactor/file-includeUrl-chatByte-4: - else * fix(채팅): 채팅 파일 전송 수정 (#205) * fix(채팅): 채팅 파일 전송 수정 개요 - 수연님이 구현해주신 PR #203에서 에러나는 부분을 수정하고 동작을 확인한다. 수정 사항 - CustomMulipartFile을 Base64MultipartFile로 이름 변경 - 기존에 DiskFileItem으로 생성했다면, content, type, name을 직접 전달하여 명시적으로 생성하도록 변경 - 불필요한 DiskFileItem 등 삭제. 파일 생성 후 저장 방식을 수연님이 만든 Base64MultipartFile로 생성하여 fileService에 전달 - DisconnectHandler의 함수명 조금 더 명시적으로 변경 - 불필요한 모듈 삭제 * chore(ws): 웹소켓 디버깅 로깅 활성화 개요 - 앞으로 웹소켓 관련 디버깅을 조금 더 정확히 하기 위해 로컬에서 웹소켓 로깅을 활성화 한다. * fix(sql): 채팅방 setting dummy data 수정 개요 및 수정사항 - 현재 dummyData에 count = 0이 들어가지 않아서, 채팅방 입장시 getCount에서 null으로 인식되어 에러가 뜸. * Fix/members chatrooms display tmp (#210) * fix/members-chatrooms-display-1: 내가 쓴 글 / 내가 쓴 댓글 조회 시 좋아요/댓글 , isLiked, isPublic 표시 * fix/members-chatrooms-display-2: 불필요해진 maxCount 삭제 * fix/members-chatrooms-display-3: 게시글 글자수 제한 해제 -> LONGTEXT로 변경 --------- Co-authored-by: suyeon <[email protected]> * fix/notificationToken-byDeviceId-1: DeviceId마다 알림 리스트를 GET할 수 있도록 (#207) * fix/notificationToken-byDeviceId-1: - NotificationController, getNotifications: - 알림 리스트를 받아올 때 pathVariable에 deviceId 추가해 deviceId별 알림 리스트를 받아올 수 있도록 함 - 이때 deviceId를 가진 회원만이 알림들을 가져올 수 있음 - sendNotificationTokens: - deviceId 마다 하나의 토큰만이 생성되도록 로직 수정 - isTokenAlive 메서드를 추가해 이전에 해당 device 앞으로 된 토큰이 있는지 확인하고 없다면 새로 만들고 - 기존에 회원이 등록했던 deviceIdfh 된 토큰이라면 새로 만들지 않고 응답 DTO를 작성함 * fix/notificationToken-byDeviceId-2: 테스트 편의성을 위한 sql 수정 * refactor/enum-string-1: (#208) - 국가코드, 여가, 언어코드 : NOT ENUM - 게시글 타입, 북마크 타입, 채팅방 타입, 채팅 타입, 커넥트 상태, 파일 포맷, 채팅방 목적, MBTI, 좋아요 타입, 알림 타입, 신고 타입 : ENUM - 회원 생성, 채팅방 생성 테스트 완료 * chore(db): Liquibase 적용 및 수정 (#212) * feat/liquibase-implementation-1: Liquibase 적용을 위한 yml 설정 - application.yml: - Liquibase를 통한 DDL 생성으로 인한 ddl-auto 해제 - Liquibase와 import.sql 을 함께 사용하기 위해서 hibernate 초기화 이후 import.sql을 실행하는 옵션값인 defer-datasource-initialization값을 false 로 되돌림 - application-local.yml: - Liquibase 사용 가능하도록 local에 추가 - master인 application.yml과 설정값 통일 시키기 * feat/liquibase-implementation-2: Liquibase XML - migration 시키기 전 테이블 수 26개 작성 - 관계 연결 완료 * feat/liquibase-implementation-3: test의 application.yml - ./gradlew build 통과를 위한 liquibase 명시 * chore(db): Liquibase 적용 및 수정 개요 - 수연님이 작성해주신 Liquibase PR #204를 바탕으로 수정 진행 수정 사항 - Liquibase를 release 버전 별로 관리를 할 수 있도록 폴더 및 구조 추가 - changeset ID를 조금 더 랜덤화하고(중복 방지), type을 대문자로 하여 가독성을 높임 - FK constraint 이름은 자동 생성으로 하여 정하였음. - liquibase가 prod, local에 둘 다 적용이 필요하므로, application.yml에 추가 - ddl-auto 및 defer-datasourc-initialization등 기본값이 none, false이기 때문에 불필요한 코드 삭제 - 추가로, PR #208의 변경 사항으로 ENUM 관련 column들이 string으로 바뀌어서 column type도 함께 liquibase에서 변경해준다. (PR로 squash - 초기 스크립트 에러도 고쳤음 - application-prod가 빈파일이어서 불필요하므로 삭제 --------- Co-authored-by: suyeon <[email protected]> * feat/chatroom-random-1: 랜덤하게 10개 그룹 채팅방 뽑아오는 API 추가 및 탈퇴 시 댓글 삭제 처리 로직 수정 (#211) * feat/chatroom-random-1: 랜덤하게 10개 그룹 채팅방 뽑아오는 API 추가 - 랜덤한 채팅방 10개의 후보군으로는 그룹 채팅방, 인원수가 꽉 차지 않은 채팅방이 보여짐 * feat/chatroom-random-2: 댓글 삭제 로직 변경 - 솔로 댓글일 경우 -> 탈퇴 시 자동 삭제 - 자식 댓글일 경우 -> 탈퇴 시 자동 삭제 - 부모 댓글일 경우 -> 탈퇴 시 NULL 처리 * feat/chatroom-random-3: 방장인 그룹 채팅방은 랜덤 호출 시 안 보이게 수정 * fix(db): 잘못 수정된 group purpose TYPE을 liquibase에 추가 (#213) 개요 및 수정사항 - group_purpose의 type 컬럼을 삭제했었는데, 필요한 컬림이므로 다시 추가해준다. * refactor(file): File 모델의 URL 컬럼 삭제, Exception 리팩토링 (#214) * chore(file): S3 File에 관한 Exception 정의 개요 - S3 upload 과정에서 문제가 생겼을 때 custom exception을 정의하자. 수정 사항 - S3 File 이름의 validation을 위한 S3FileNameInvalidException 정의 - 찾는 S3 파일이 DB에 없을 때를 위한 S3FileNotFoundException 정의 * refactor(file): File 모델의 URL 컬럼 삭제, Exception 리팩토링 개요 - 현재 DB에 pre-signed url을 저장하고 있는데, pre-signed url은 일시적으로만 사용하는 것이므로 DB에 저장을 하지않도록 한다. - 프론트엔드 코드에서는 다행히 File 모델의 url 값을 필요로 하는 부분은 없어서 리팩토링 진행 (presignedImgProfile로 이미지 렌더링을 하더라구요) - 반복되는 코드 genereatePresignedUrl 함수로 리팩토링 - exception의 경우에 global exception handler가 있으므로, try catch 걸지 않아도, 괜찮아서 삭제 * refactor/board-getall-1: 게시글 모든 타입도 가져올 수 있게 수정 (#215) - 파라미터 변경사항 -> type 존재 * fix/blockservice-mistake-1: 잘못 비교했던 id 비교 수정 & 메서드 재활용 UP (#216) * refactor/board-getall-1: 게시글 모든 타입도 가져올 수 있게 수정 - 파라미터 변경사항 -> type 존재 * fix/blockservice-mistake-1: 잘못 비교했던 id 비교 수정 & 메서드 재활용 UP * fix/blockservice-mistake-1: 본인이 방장인 채팅방 불러오기 추가 - 기존 채팅방을 불러오는 API인 GET: /chatrooms 에서 파라미터를 아무것도 넣지 않을 때 방장을 불러올 수 있음 - 파리미터 GROUP -> 속하거나 방장인 그룹 채팅방 - 파라미터 SINGLE -> 속한 싱글 채팅방 * Revert "Refactor/file include url chat byte : 채팅 String으로 이미지 입력을 받자 (#203) (#209)" This reverts commit 3b0404467888810c8bce4fcec4b131c46475cd94. --------- Co-authored-by: Koo Su Yeon <[email protected]> Co-authored-by: suyeon <[email protected]> * refactor/swagger-add-1: 배제해두었던 ChatroomSwagger 되살리기 & 모든 Controller 스… (#218) * refactor/swagger-add-1: 배제해두었던 ChatroomSwagger 되살리기 & 모든 Controller 스웨거 작성완료 - ENUM 타입 중에 DTO를 통해서만 전달되는 값들은 스웨거에 명시가 안되어서 멘트로 추가해두었음 * refactor/swagger-add-2: 파일 Presign URL 접근 방법 변경 -> id로 접근 - 제한 사항 : 본인의 학생증 인증 파일에 관해 URL 접근 권한자를 지정함 - File 엔티티에 isSecret 칼럼 추가해 추후 유연하게 조절할 예정 - MemberService: - 기존에는 회원은 최초의 온보딩 과정에서만 학생증 인증사진을 올릴 수 있었으나 verfied된 회원도 사진을 올릴 수 있도록 수정 - Liquibase 칼럼 추가 (v1.0.1) 및 master -> include 명령으로 수정 * refactor/swagger-add-3: 누락된 update Null 방지 코드 추가 * refactor/swagger-add-4: 과도기 단계 - 구버전의 파일 name으로 PresignUrl 가져오기 남겨두기 * refactor/report-add-chatroom-1: 그룹 채팅방 신고 추가 (#219) * refactor/report-add-chatroom-1: 그룹 채팅방 신고 추가 - Report에 외래키 chatroom 추가 - 로직은 기존 신고와 댓글/게시글과의 연관관계와 동일 - swagger, liquibase 작성완료 * refactor/report-add-chatroom-2: 그룹 채팅방 조회 시 참여 여부 표시 -> isEntered - 그룹 채팅방 생성 시에도 조회와 같은 DTO 사용한다. - 때문에 isEntered가 불러와지는데 생성 후에는 본인만 보일 응답 DTO이기 때문에 DTO를 적을 필요가 없다 판단 -> 조회 시에만 isEntered값이 들어감 * hotfix(translate): production에서 부재한 deepl key 추가 (#222) 개요 - production에서 에러가 나서 확인해보니, production에서 deepL key가 부재한다. 따라서, 이를 추가해준다. 수정 사항 - 추가로, 한시적으로 웹소켓 디버깅을하기 위해, logging을 활성화한다. * Perf/fix response dto : DTO에 민감한 정보 포함되지 않도록 (#220) * perf/fix-response-dto-1: 그룹 채팅방 응답 DTO 수정 - Member -> MemberResponseDto 변경: - 커스텀한 MemberModelMapper 사용 - 제외한 민감한 정보: - 비밀번호, 전공, 실명 - Chatroom -> ChatroomResponseDto 변경 - 커스텀 Mapper ChatroomModelMapper 사용 - 제외한 민감한 정보: - 그룹 채팅방의 비밀번호 * perf/fix-response-dto-2: 게시글/댓글 응답 DTO에 민감한 정보를 제외한 Member가 아닌 MemberResponseDto가 적히도록 수정 +신고 서비스 응답 로직 변경 -> ResponseDto보이지 않고 Created Status만 표시하도록 * perf/fix-response-dto-3: Chore * perf/fix-response-dto-4: isBookmarked 값 Post GET요청 시 보이게 추가 및 나머지 DTO 보안화 진행 * perf/fix-response-dto-5: Build 파일 작성 * perf/fix-response-dto-6: 좋아요 응답 DTO 생성 - 기존에는 PostResponse를 재활용했으나 like Id를 가져올 수 있는 LikeResponseDto 로 수정 * perf/fix-response-dto-7: Comment 조회 시 부모 게시글의 좋아요/댓글 갯수 표시되도록 * fix(db): DB Migration 꼬인 부분을 정상화 (#224) 개요 - 현재 Migration 관련해서 히스토리가 꼬여서 이를 정상화하자. 수정 사항 - includeAll로 v1.0 하위 폴더의 모든 changeSet 감지하도록 - chatroom_id가 report에 컬럼이 없어서 FK를 못거는 상황이어서 추가해줌 * fix(chat): 채팅 이미지 사이즈 관련 조정 및 멤버 채팅 DTO에 포함 (#225) * fix(db): DB Migration 꼬인 부분을 정상화 개요 - 현재 Migration 관련해서 히스토리가 꼬여서 이를 정상화하자. 수정 사항 - includeAll로 v1.0 하위 폴더의 모든 changeSet 감지하도록 - chatroom_id가 report에 컬럼이 없어서 FK를 못거는 상황이어서 추가해줌 * fix(chat): 채팅 이미지 사이즈 관련 조정 및 멤버 채팅 DTO에 포함 개요 - 채팅 이미지를 10MB 이상으로 받으려면 스프링 자체에도 설정이 필요해서 추가 - Member를 Response 타입에 포함시켜 프론트에 전달 (정보가 필요) * Feat/translate community-1 : 사용자에게 기기 언어 추가 및 커뮤니티 서비스 번역 추가 (#223) * feat/translate-community-1: 사용자에게 기기언어 추가 - PUT 요청에서 추가 가능 - EN, KO, ZH, JA, ES (ENUM 타입) - null일 경우 자동 EN 처리 * feat/translate-community-2: 댓글 작성 시에 번역된 알림 추가 및 DOCS 작업 추가 * feat/translate-community-3: 커넥트 생성, 성공 / 게시글 좋아요 / 댓글 좋아요 / 채팅방 입장 시에 번역된 알림 전송 * feat/translate-community-4: 번역 언어는 String으로 받기 (DEEPL 번역 언어 String) * feat/translate-community-5: 제한이 존재하는 번역진행 - 게시글, 채팅 번역 추가 - 게시글은 title, content가 그 범위임 - 회원당 번역 제한 15개 * feat/translate-community-6: DOCS & chore * feat/translate-community-6-add:./spotlessapply * feat/translate-community-6-chore:Liquibase 지정 및 ENUM LanguageType 삭제 * feat/translate-community-7-rebase-liquibase * feat/translate-community-8: 댓글 번역 추가 * feat/translate-community-9: ResourceBundle을 이용한 알림 번역본 properties화 * feat/translate-community-10: 피드백 반영 중복되는 Transalte 엔티티 인터페이스 & Override 이용 - 게시글의 경우 title과 content의 분리는 \n로 하였음 * Perf/member module : MemberService 모듈화 및 비밀번호 변경 후 로직 추가 (#226) * perf/member-module-1: 불필요한 DTO 정보 제외 & 비밀번호 변경 후 로직 추가 - 비밀번호 변경 시: - 1. 변경된 비밀번호 발급과 동시에 member.setIsPassword를 true로 업데이트 - 2. 변경된 비밀번호로 로그인 후 IsPassword가 true에 한해 비밀번호를 update 가능하게 해줌 PUT :/api/members - 변경과 함께 다시 IsPasswordChanged False로 변환 - 즉, change-password API를 실행한 후에야 비밀번호 편집 자격 부여 * perf/member-module-2: memberService 모듈화 진행 및 chore * perf/member-module-3: 비밀번호 재설정 로직 변경 - 1. 비밀번호 변경 시 -> 메일 발송 (인증번호 용도) GET :/members/change-password (NO AUTH) - 2. 해당 인증번호로 비밀번호 재설정 API PATCH 요청 (NO AUTH) - 파라미터로 인증번호와 새로 설정할 비밀번호와 계정 이메일을 넣고 요청을 보냄 - 인증번호 불일치 시 403에러 내뱉음 * perf/member-module-4: 비밀번호 인증번호 일치 여부를 새로운 비밀번호 설정 전에 확인할 수 있도록 함 * fix(chat): 그룹 채팅 전용 조회 API를 1:1 겸용으로 개조 (#227) * fix(chat): 그룹 채팅 전용 조회 API를 1:1 겸용으로 개조 개요 - 현재 그룹채팅 전용으로 사용 중인 /chatrooms/getGroupChatrooms와 /chatrooms/getGroupChatroom을 1:1도 사용할 수 있도록 겸용으로 바꾼다. 수정 사항 - 함수명 변경 - 1:1 채팅의 경우에는 방장이 없으므로, null 값이 들어가서 에러가 남. 따라서, GROUP이 있는 경우에만 값처리를 해주자 * fix(chat): 1:1 채팅방에서 상대방이 멤버 목록에서 빠져있음 개요 - 상대방이 1:1 채팅방 정보 요청을 하면 거기에 정보가 빠져 있다. 원인은 member에 본인만 등록해주는 부분이 있었음. * fix/translate-get-1: 게시글 가져올 때 \n 이 아닌 각각으로 가져오기 (#228) * release(v1.0.2): v1.0.2 merge (#229) * Refactor/file include url chat byte : 채팅 String으로 이미지 입력을 받자 (#203) * refactor/file-includeUrl-chatByte-1: 파일 upload시 url에 presignURL 적히도록 수정 * refactor/file-includeUrl-chatByte-2: - 1. 파일 List형태의 imgCode (여러개 이미지 파일)로 전송 시 MultipartFile로 바꿈 - 2. File업로드 진행 - 3. Redis로 파일 List형태의 presign URL 전송 - 실패 : 파일 저장도 안되고 전송도 안됨 * refactor/file-includeUrl-chatByte-3: - imgCode에 따른 DTO의 수정사항 * refactor/file-includeUrl-chatByte-4: - else * fix(채팅): 채팅 파일 전송 수정 (#205) * fix(채팅): 채팅 파일 전송 수정 개요 - 수연님이 구현해주신 PR #203에서 에러나는 부분을 수정하고 동작을 확인한다. 수정 사항 - CustomMulipartFile을 Base64MultipartFile로 이름 변경 - 기존에 DiskFileItem으로 생성했다면, content, type, name을 직접 전달하여 명시적으로 생성하도록 변경 - 불필요한 DiskFileItem 등 삭제. 파일 생성 후 저장 방식을 수연님이 만든 Base64MultipartFile로 생성하여 fileService에 전달 - DisconnectHandler의 함수명 조금 더 명시적으로 변경 - 불필요한 모듈 삭제 * chore(ws): 웹소켓 디버깅 로깅 활성화 개요 - 앞으로 웹소켓 관련 디버깅을 조금 더 정확히 하기 위해 로컬에서 웹소켓 로깅을 활성화 한다. * fix(sql): 채팅방 setting dummy data 수정 개요 및 수정사항 - 현재 dummyData에 count = 0이 들어가지 않아서, 채팅방 입장시 getCount에서 null으로 인식되어 에러가 뜸. * Fix/members chatrooms display tmp (#210) * fix/members-chatrooms-display-1: 내가 쓴 글 / 내가 쓴 댓글 조회 시 좋아요/댓글 , isLiked, isPublic 표시 * fix/members-chatrooms-display-2: 불필요해진 maxCount 삭제 * fix/members-chatrooms-display-3: 게시글 글자수 제한 해제 -> LONGTEXT로 변경 --------- Co-authored-by: suyeon <[email protected]> * fix/notificationToken-byDeviceId-1: DeviceId마다 알림 리스트를 GET할 수 있도록 (#207) * fix/notificationToken-byDeviceId-1: - NotificationController, getNotifications: - 알림 리스트를 받아올 때 pathVariable에 deviceId 추가해 deviceId별 알림 리스트를 받아올 수 있도록 함 - 이때 deviceId를 가진 회원만이 알림들을 가져올 수 있음 - sendNotificationTokens: - deviceId 마다 하나의 토큰만이 생성되도록 로직 수정 - isTokenAlive 메서드를 추가해 이전에 해당 device 앞으로 된 토큰이 있는지 확인하고 없다면 새로 만들고 - 기존에 회원이 등록했던 deviceIdfh 된 토큰이라면 새로 만들지 않고 응답 DTO를 작성함 * fix/notificationToken-byDeviceId-2: 테스트 편의성을 위한 sql 수정 * refactor/enum-string-1: (#208) - 국가코드, 여가, 언어코드 : NOT ENUM - 게시글 타입, 북마크 타입, 채팅방 타입, 채팅 타입, 커넥트 상태, 파일 포맷, 채팅방 목적, MBTI, 좋아요 타입, 알림 타입, 신고 타입 : ENUM - 회원 생성, 채팅방 생성 테스트 완료 * chore(db): Liquibase 적용 및 수정 (#212) * feat/liquibase-implementation-1: Liquibase 적용을 위한 yml 설정 - application.yml: - Liquibase를 통한 DDL 생성으로 인한 ddl-auto 해제 - Liquibase와 import.sql 을 함께 사용하기 위해서 hibernate 초기화 이후 import.sql을 실행하는 옵션값인 defer-datasource-initialization값을 false 로 되돌림 - application-local.yml: - Liquibase 사용 가능하도록 local에 추가 - master인 application.yml과 설정값 통일 시키기 * feat/liquibase-implementation-2: Liquibase XML - migration 시키기 전 테이블 수 26개 작성 - 관계 연결 완료 * feat/liquibase-implementation-3: test의 application.yml - ./gradlew build 통과를 위한 liquibase 명시 * chore(db): Liquibase 적용 및 수정 개요 - 수연님이 작성해주신 Liquibase PR #204를 바탕으로 수정 진행 수정 사항 - Liquibase를 release 버전 별로 관리를 할 수 있도록 폴더 및 구조 추가 - changeset ID를 조금 더 랜덤화하고(중복 방지), type을 대문자로 하여 가독성을 높임 - FK constraint 이름은 자동 생성으로 하여 정하였음. - liquibase가 prod, local에 둘 다 적용이 필요하므로, application.yml에 추가 - ddl-auto 및 defer-datasourc-initialization등 기본값이 none, false이기 때문에 불필요한 코드 삭제 - 추가로, PR #208의 변경 사항으로 ENUM 관련 column들이 string으로 바뀌어서 column type도 함께 liquibase에서 변경해준다. (PR로 squash - 초기 스크립트 에러도 고쳤음 - application-prod가 빈파일이어서 불필요하므로 삭제 --------- Co-authored-by: suyeon <[email protected]> * feat/chatroom-random-1: 랜덤하게 10개 그룹 채팅방 뽑아오는 API 추가 및 탈퇴 시 댓글 삭제 처리 로직 수정 (#211) * feat/chatroom-random-1: 랜덤하게 10개 그룹 채팅방 뽑아오는 API 추가 - 랜덤한 채팅방 10개의 후보군으로는 그룹 채팅방, 인원수가 꽉 차지 않은 채팅방이 보여짐 * feat/chatroom-random-2: 댓글 삭제 로직 변경 - 솔로 댓글일 경우 -> 탈퇴 시 자동 삭제 - 자식 댓글일 경우 -> 탈퇴 시 자동 삭제 - 부모 댓글일 경우 -> 탈퇴 시 NULL 처리 * feat/chatroom-random-3: 방장인 그룹 채팅방은 랜덤 호출 시 안 보이게 수정 * fix(db): 잘못 수정된 group purpose TYPE을 liquibase에 추가 (#213) 개요 및 수정사항 - group_purpose의 type 컬럼을 삭제했었는데, 필요한 컬림이므로 다시 추가해준다. * refactor(file): File 모델의 URL 컬럼 삭제, Exception 리팩토링 (#214) * chore(file): S3 File에 관한 Exception 정의 개요 - S3 upload 과정에서 문제가 생겼을 때 custom exception을 정의하자. 수정 사항 - S3 File 이름의 validation을 위한 S3FileNameInvalidException 정의 - 찾는 S3 파일이 DB에 없을 때를 위한 S3FileNotFoundException 정의 * refactor(file): File 모델의 URL 컬럼 삭제, Exception 리팩토링 개요 - 현재 DB에 pre-signed url을 저장하고 있는데, pre-signed url은 일시적으로만 사용하는 것이므로 DB에 저장을 하지않도록 한다. - 프론트엔드 코드에서는 다행히 File 모델의 url 값을 필요로 하는 부분은 없어서 리팩토링 진행 (presignedImgProfile로 이미지 렌더링을 하더라구요) - 반복되는 코드 genereatePresignedUrl 함수로 리팩토링 - exception의 경우에 global exception handler가 있으므로, try catch 걸지 않아도, 괜찮아서 삭제 * refactor/board-getall-1: 게시글 모든 타입도 가져올 수 있게 수정 (#215) - 파라미터 변경사항 -> type 존재 * fix/blockservice-mistake-1: 잘못 비교했던 id 비교 수정 & 메서드 재활용 UP (#216) * refactor/board-getall-1: 게시글 모든 타입도 가져올 수 있게 수정 - 파라미터 변경사항 -> type 존재 * fix/blockservice-mistake-1: 잘못 비교했던 id 비교 수정 & 메서드 재활용 UP * fix/blockservice-mistake-1: 본인이 방장인 채팅방 불러오기 추가 - 기존 채팅방을 불러오는 API인 GET: /chatrooms 에서 파라미터를 아무것도 넣지 않을 때 방장을 불러올 수 있음 - 파리미터 GROUP -> 속하거나 방장인 그룹 채팅방 - 파라미터 SINGLE -> 속한 싱글 채팅방 * refactor/swagger-add-1: 배제해두었던 ChatroomSwagger 되살리기 & 모든 Controller 스… (#218) * refactor/swagger-add-1: 배제해두었던 ChatroomSwagger 되살리기 & 모든 Controller 스웨거 작성완료 - ENUM 타입 중에 DTO를 통해서만 전달되는 값들은 스웨거에 명시가 안되어서 멘트로 추가해두었음 * refactor/swagger-add-2: 파일 Presign URL 접근 방법 변경 -> id로 접근 - 제한 사항 : 본인의 학생증 인증 파일에 관해 URL 접근 권한자를 지정함 - File 엔티티에 isSecret 칼럼 추가해 추후 유연하게 조절할 예정 - MemberService: - 기존에는 회원은 최초의 온보딩 과정에서만 학생증 인증사진을 올릴 수 있었으나 verfied된 회원도 사진을 올릴 수 있도록 수정 - Liquibase 칼럼 추가 (v1.0.1) 및 master -> include 명령으로 수정 * refactor/swagger-add-3: 누락된 update Null 방지 코드 추가 * refactor/swagger-add-4: 과도기 단계 - 구버전의 파일 name으로 PresignUrl 가져오기 남겨두기 * refactor/report-add-chatroom-1: 그룹 채팅방 신고 추가 (#219) * refactor/report-add-chatroom-1: 그룹 채팅방 신고 추가 - Report에 외래키 chatroom 추가 - 로직은 기존 신고와 댓글/게시글과의 연관관계와 동일 - swagger, liquibase 작성완료 * refactor/report-add-chatroom-2: 그룹 채팅방 조회 시 참여 여부 표시 -> isEntered - 그룹 채팅방 생성 시에도 조회와 같은 DTO 사용한다. - 때문에 isEntered가 불러와지는데 생성 후에는 본인만 보일 응답 DTO이기 때문에 DTO를 적을 필요가 없다 판단 -> 조회 시에만 isEntered값이 들어감 * Perf/fix response dto : DTO에 민감한 정보 포함되지 않도록 (#220) * perf/fix-response-dto-1: 그룹 채팅방 응답 DTO 수정 - Member -> MemberResponseDto 변경: - 커스텀한 MemberModelMapper 사용 - 제외한 민감한 정보: - 비밀번호, 전공, 실명 - Chatroom -> ChatroomResponseDto 변경 - 커스텀 Mapper ChatroomModelMapper 사용 - 제외한 민감한 정보: - 그룹 채팅방의 비밀번호 * perf/fix-response-dto-2: 게시글/댓글 응답 DTO에 민감한 정보를 제외한 Member가 아닌 MemberResponseDto가 적히도록 수정 +신고 서비스 응답 로직 변경 -> ResponseDto보이지 않고 Created Status만 표시하도록 * perf/fix-response-dto-3: Chore * perf/fix-response-dto-4: isBookmarked 값 Post GET요청 시 보이게 추가 및 나머지 DTO 보안화 진행 * perf/fix-response-dto-5: Build 파일 작성 * perf/fix-response-dto-6: 좋아요 응답 DTO 생성 - 기존에는 PostResponse를 재활용했으나 like Id를 가져올 수 있는 LikeResponseDto 로 수정 * perf/fix-response-dto-7: Comment 조회 시 부모 게시글의 좋아요/댓글 갯수 표시되도록 * fix(db): DB Migration 꼬인 부분을 정상화 (#224) 개요 - 현재 Migration 관련해서 히스토리가 꼬여서 이를 정상화하자. 수정 사항 - includeAll로 v1.0 하위 폴더의 모든 changeSet 감지하도록 - chatroom_id가 report에 컬럼이 없어서 FK를 못거는 상황이어서 추가해줌 * fix(chat): 채팅 이미지 사이즈 관련 조정 및 멤버 채팅 DTO에 포함 (#225) * fix(db): DB Migration 꼬인 부분을 정상화 개요 - 현재 Migration 관련해서 히스토리가 꼬여서 이를 정상화하자. 수정 사항 - includeAll로 v1.0 하위 폴더의 모든 changeSet 감지하도록 - chatroom_id가 report에 컬럼이 없어서 FK를 못거는 상황이어서 추가해줌 * fix(chat): 채팅 이미지 사이즈 관련 조정 및 멤버 채팅 DTO에 포함 개요 - 채팅 이미지를 10MB 이상으로 받으려면 스프링 자체에도 설정이 필요해서 추가 - Member를 Response 타입에 포함시켜 프론트에 전달 (정보가 필요) --------- Co-authored-by: Koo Su Yeon <[email protected]> Co-authored-by: suyeon <[email protected]> * Revert "release(v1.0.2): v1.0.2 merge (#229)" (#230) This reverts commit 010f0f7b84a0a102b1c61e304e5276ed761c4b69. * release(v1.0.2): v1.0.2 (#231) * Refactor/file include url chat byte : 채팅 String으로 이미지 입력을 받자 (#203) * refactor/file-includeUrl-chatByte-1: 파일 upload시 url에 presignURL 적히도록 수정 * refactor/file-includeUrl-chatByte-2: - 1. 파일 List형태의 imgCode (여러개 이미지 파일)로 전송 시 MultipartFile로 바꿈 - 2. File업로드 진행 - 3. Redis로 파일 List형태의 presign URL 전송 - 실패 : 파일 저장도 안되고 전송도 안됨 * refactor/file-includeUrl-chatByte-3: - imgCode에 따른 DTO의 수정사항 * refactor/file-includeUrl-chatByte-4: - else * fix(채팅): 채팅 파일 전송 수정 (#205) * fix(채팅): 채팅 파일 전송 수정 개요 - 수연님이 구현해주신 PR #203에서 에러나는 부분을 수정하고 동작을 확인한다. 수정 사항 - CustomMulipartFile을 Base64MultipartFile로 이름 변경 - 기존에 DiskFileItem으로 생성했다면, content, type, name을 직접 전달하여 명시적으로 생성하도록 변경 - 불필요한 DiskFileItem 등 삭제. 파일 생성 후 저장 방식을 수연님이 만든 Base64MultipartFile로 생성하여 fileService에 전달 - DisconnectHandler의 함수명 조금 더 명시적으로 변경 - 불필요한 모듈 삭제 * chore(ws): 웹소켓 디버깅 로깅 활성화 개요 - 앞으로 웹소켓 관련 디버깅을 조금 더 정확히 하기 위해 로컬에서 웹소켓 로깅을 활성화 한다. * fix(sql): 채팅방 setting dummy data 수정 개요 및 수정사항 - 현재 dummyData에 count = 0이 들어가지 않아서, 채팅방 입장시 getCount에서 null으로 인식되어 에러가 뜸. * Fix/members chatrooms display tmp (#210) * fix/members-chatrooms-display-1: 내가 쓴 글 / 내가 쓴 댓글 조회 시 좋아요/댓글 , isLiked, isPublic 표시 * fix/members-chatrooms-display-2: 불필요해진 maxCount 삭제 * fix/members-chatrooms-display-3: 게시글 글자수 제한 해제 -> LONGTEXT로 변경 --------- Co-authored-by: suyeon <[email protected]> * fix/notificationToken-byDeviceId-1: DeviceId마다 알림 리스트를 GET할 수 있도록 (#207) * fix/notificationToken-byDeviceId-1: - NotificationController, getNotifications: - 알림 리스트를 받아올 때 pathVariable에 deviceId 추가해 deviceId별 알림 리스트를 받아올 수 있도록 함 - 이때 deviceId를 가진 회원만이 알림들을 가져올 수 있음 - sendNotificationTokens: - deviceId 마다 하나의 토큰만이 생성되도록 로직 수정 - isTokenAlive 메서드를 추가해 이전에 해당 device 앞으로 된 토큰이 있는지 확인하고 없다면 새로 만들고 - 기존에 회원이 등록했던 deviceIdfh 된 토큰이라면 새로 만들지 않고 응답 DTO를 작성함 * fix/notificationToken-byDeviceId-2: 테스트 편의성을 위한 sql 수정 * refactor/enum-string-1: (#208) - 국가코드, 여가, 언어코드 : NOT ENUM - 게시글 타입, 북마크 타입, 채팅방 타입, 채팅 타입, 커넥트 상태, 파일 포맷, 채팅방 목적, MBTI, 좋아요 타입, 알림 타입, 신고 타입 : ENUM - 회원 생성, 채팅방 생성 테스트 완료 * chore(db): Liquibase 적용 및 수정 (#212) * feat/liquibase-implementation-1: Liquibase 적용을 위한 yml 설정 - application.yml: - Liquibase를 통한 DDL 생성으로 인한 ddl-auto 해제 - Liquibase와 import.sql 을 함께 사용하기 위해서 hibernate 초기화 이후 import.sql을 실행하는 옵션값인 defer-datasource-initialization값을 false 로 되돌림 - application-local.yml: - Liquibase 사용 가능하도록 local에 추가 - master인 application.yml과 설정값 통일 시키기 * feat/liquibase-implementation-2: Liquibase XML - migration 시키기 전 테이블 수 26개 작성 - 관계 연결 완료 * feat/liquibase-implementation-3: test의 application.yml - ./gradlew build 통과를 위한 liquibase 명시 * chore(db): Liquibase 적용 및 수정 개요 - 수연님이 작성해주신 Liquibase PR #204를 바탕으로 수정 진행 수정 사항 - Liquibase를 release 버전 별로 관리를 할 수 있도록 폴더 및 구조 추가 - changeset ID를 조금 더 랜덤화하고(중복 방지), type을 대문자로 하여 가독성을 높임 - FK constraint 이름은 자동 생성으로 하여 정하였음. - liquibase가 prod, local에 둘 다 적용이 필요하므로, application.yml에 추가 - ddl-auto 및 defer-datasourc-initialization등 기본값이 none, false이기 때문에 불필요한 코드 삭제 - 추가로, PR #208의 변경 사항으로 ENUM 관련 column들이 string으로 바뀌어서 column type도 함께 liquibase에서 변경해준다. (PR로 squash - 초기 스크립트 에러도 고쳤음 - application-prod가 빈파일이어서 불필요하므로 삭제 --------- Co-authored-by: suyeon <[email protected]> * feat/chatroom-random-1: 랜덤하게 10개 그룹 채팅방 뽑아오는 API 추가 및 탈퇴 시 댓글 삭제 처리 로직 수정 (#211) * feat/chatroom-random-1: 랜덤하게 10개 그룹 채팅방 뽑아오는 API 추가 - 랜덤한 채팅방 10개의 후보군으로는 그룹 채팅방, 인원수가 꽉 차지 않은 채팅방이 보여짐 * feat/chatroom-random-2: 댓글 삭제 로직 변경 - 솔로 댓글일 경우 -> 탈퇴 시 자동 삭제 - 자식 댓글일 경우 -> 탈퇴 시 자동 삭제 - 부모 댓글일 경우 -> 탈퇴 시 NULL 처리 * feat/chatroom-random-3: 방장인 그룹 채팅방은 랜덤 호출 시 안 보이게 수정 * fix(db): 잘못 수정된 group purpose TYPE을 liquibase에 추가 (#213) 개요 및 수정사항 - group_purpose의 type 컬럼을 삭제했었는데, 필요한 컬림이므로 다시 추가해준다. * refactor(file): File 모델의 URL 컬럼 삭제, Exception 리팩토링 (#214) * chore(file): S3 File에 관한 Exception 정의 개요 - S3 upload 과정에서 문제가 생겼을 때 custom exception을 정의하자. 수정 사항 - S3 File 이름의 validation을 위한 S3FileNameInvalidException 정의 - 찾는 S3 파일이 DB에 없을 때를 위한 S3FileNotFoundException 정의 * refactor(file): File 모델의 URL 컬럼 삭제, Exception 리팩토링 개요 - 현재 DB에 pre-signed url을 저장하고 있는데, pre-signed url은 일시적으로만 사용하는 것이므로 DB에 저장을 하지않도록 한다. - 프론트엔드 코드에서는 다행히 File 모델의 url 값을 필요로 하는 부분은 없어서 리팩토링 진행 (presignedImgProfile로 이미지 렌더링을 하더라구요) - 반복되는 코드 genereatePresignedUrl 함수로 리팩토링 - exception의 경우에 global exception handler가 있으므로, try catch 걸지 않아도, 괜찮아서 삭제 * refactor/board-getall-1: 게시글 모든 타입도 가져올 수 있게 수정 (#215) - 파라미터 변경사항 -> type 존재 * fix/blockservice-mistake-1: 잘못 비교했던 id 비교 수정 & 메서드 재활용 UP (#216) * refactor/board-getall-1: 게시글 모든 타입도 가져올 수 있게 수정 - 파라미터 변경사항 -> type 존재 * fix/blockservice-mistake-1: 잘못 비교했던 id 비교 수정 & 메서드 재활용 UP * fix/blockservice-mistake-1: 본인이 방장인 채팅방 불러오기 추가 - 기존 채팅방을 불러오는 API인 GET: /chatrooms 에서 파라미터를 아무것도 넣지 않을 때 방장을 불러올 수 있음 - 파리미터 GROUP -> 속하거나 방장인 그룹 채팅방 - 파라미터 SINGLE -> 속한 싱글 채팅방 * refactor/swagger-add-1: 배제해두었던 ChatroomSwagger 되살리기 & 모든 Controller 스… (#218) * refactor/swagger-add-1: 배제해두었던 ChatroomSwagger 되살리기 & 모든 Controller 스웨거 작성완료 - ENUM 타입 중에 DTO를 통해서만 전달되는 값들은 스웨거에 명시가 안되어서 멘트로 추가해두었음 * refactor/swagger-add-2: 파일 Presign URL 접근 방법 변경 -> id로 접근 - 제한 사항 : 본인의 학생증 인증 파일에 관해 URL 접근 권한자를 지정함 - File 엔티티에 isSecret 칼럼 추가해 추후 유연하게 조절할 예정 - MemberService: - 기존에는 회원은 최초의 온보딩 과정에서만 학생증 인증사진을 올릴 수 있었으나 verfied된 회원도 사진을 올릴 수 있도록 수정 - Liquibase 칼럼 추가 (v1.0.1) 및 master -> include 명령으로 수정 * refactor/swagger-add-3: 누락된 update Null 방지 코드 추가 * refactor/swagger-add-4: 과도기 단계 - 구버전의 파일 name으로 PresignUrl 가져오기 남겨두기 * refactor/report-add-chatroom-1: 그룹 채팅방 신고 추가 (#219) * refactor/report-add-chatroom-1: 그룹 채팅방 신고 추가 - Report에 외래키 chatroom 추가 - 로직은 기존 신고와 댓글/게시글과의 연관관계와 동일 - swagger, liquibase 작성완료 * refactor/report-add-chatroom-2: 그룹 채팅방 조회 시 참여 여부 표시 -> isEntered - 그룹 채팅방 생성 시에도 조회와 같은 DTO 사용한다. - 때문에 isEntered가 불러와지는데 생성 후에는 본인만 보일 응답 DTO이기 때문에 DTO를 적을 필요가 없다 판단 -> 조회 시에만 isEntered값이 들어감 * Perf/fix response dto : DTO에 민감한 정보 포함되지 않도록 (#220) * perf/fix-response-dto-1: 그룹 채팅방 응답 DTO 수정 - Member -> MemberResponseDto 변경: - 커스텀한 MemberModelMapper 사용 - 제외한 민감한 정보: - 비밀번호, 전공, 실명 - Chatroom -> ChatroomResponseDto 변경 - 커스텀 Mapper ChatroomModelMapper 사용 - 제외한 민감한 정보: - 그룹 채팅방의 비밀번호 * perf/fix-response-dto-2: 게시글/댓글 응답 DTO에 민감한 정보를 제외한 Member가 아닌 MemberResponseDto가 적히도록 수정 +신고 서비스 응답 로직 변경 -> ResponseDto보이지 않고 Created Status만 표시하도록 * perf/fix-response-dto-3: Chore * perf/fix-response-dto-4: isBookmarked 값 Post GET요청 시 보이게 추가 및 나머지 DTO 보안화 진행 * perf/fix-response-dto-5: Build 파일 작성 * perf/fix-response-dto-6: 좋아요 응답 DTO 생성 - 기존에는 PostResponse를 재활용했으나 like Id를 가져올 수 있는 LikeResponseDto 로 수정 * perf/fix-response-dto-7: Comment 조회 시 부모 게시글의 좋아요/댓글 갯수 표시되도록 * fix(db): DB Migration 꼬인 부분을 정상화 (#224) 개요 - 현재 Migration 관련해서 히스토리가 꼬여서 이를 정상화하자. 수정 사항 - includeAll로 v1.0 하위 폴더의 모든 changeSet 감지하도록 - chatroom_id가 report에 컬럼이 없어서 FK를 못거는 상황이어서 추가해줌 * fix(chat): 채팅 이미지 사이즈 관련 조정 및 멤버 채팅 DTO에 포함 (#225) * fix(db): DB Migration 꼬인 부분을 정상화 개요 - 현재 Migration 관련해서 히스토리가 꼬여서 이를 정상화하자. 수정 사항 - includeAll로 v1.0 하위 폴더의 모든 changeSet 감지하도록 - chatroom_id가 report에 컬럼이 없어서 FK를 못거는 상황이어서 추가해줌 * fix(chat): 채팅 이미지 사이즈 관련 조정 및 멤버 채팅 DTO에 포함 개요 - 채팅 이미지를 10MB 이상으로 받으려면 스프링 자체에도 설정이 필요해서 추가 - Member를 Response 타입에 포함시켜 프론트에 전달 (정보가 필요) * Feat/translate community-1 : 사용자에게 기기 언어 추가 및 커뮤니티 서비스 번역 추가 (#223) * feat/translate-community-1: 사용자에게 기기언어 추가 - PUT 요청에서 추가 가능 - EN, KO, ZH, JA, ES (ENUM 타입) - null일 경우 자동 EN 처리 * feat/translate-community-2: 댓글 작성 시에 번역된 알림 추가 및 DOCS 작업 추가 * feat/translate-community-3: 커넥트 생성, 성공 / 게시글 좋아요 / 댓글 좋아요 / 채팅방 입장 시에 번역된 알림 전송 * feat/translate-community-4: 번역 언어는 String으로 받기 (DEEPL 번역 언어 String) * feat/translate-community-5: 제한이 존재하는 번역진행 - 게시글, 채팅 번역 추가 - 게시글은 title, content가 그 범위임 - 회원당 번역 제한 15개 * feat/translate-community-6: DOCS & chore * feat/translate-community-6-add:./spotlessapply * feat/translate-community-6-chore:Liquibase 지정 및 ENUM LanguageType 삭제 * feat/translate-community-7-rebase-liquibase * feat/translate-community-8: 댓글 번역 추가 * feat/translate-community-9: ResourceBundle을 이용한 알림 번역본 properties화 * feat/translate-community-10: 피드백 반영 중복되는 Transalte 엔티티 인터페이스 & Override 이용 - 게시글의 경우 title과 content의 분리는 \n로 하였음 * Perf/member module : MemberService 모듈화 및 비밀번호 변경 후 로직 추가 (#226) * perf/member-module-1: 불필요한 DTO 정보 제외 & 비밀번호 변경 후 로직 추가 - 비밀번호 변경 시: - 1. 변경된 비밀번호 발급과 동시에 member.setIsPassword를 true로 업데이트 - 2. 변경된 비밀번호로 로그인 후 IsPassword가 true에 한해 비밀번호를 update 가능하게 해줌 PUT :/api/members - 변경과 함께 다시 IsPasswordChanged False로 변환 - 즉, change-password API를 실행한 후에야 비밀번호 편집 자격 부여 * perf/member-module-2: memberService 모듈화 진행 및 chore * perf/member-module-3: 비밀번호 재설정 로직 변경 - 1. 비밀번호 변경 시 -> 메일 발송 (인증번호 용도) GET :/members/change-password (NO AUTH) - 2. 해당 인증번호로 비밀번호 재설정 API PATCH 요청 (NO AUTH) - 파라미터로 인증번호와 새로 설정할 비밀번호와 계정 이메일을 넣고 요청을 보냄 - 인증번호 불일치 시 403에러 내뱉음 * perf/member-module-4: 비밀번호 인증번호 일치 여부를 새로운 비밀번호 설정 전에 확인할 수 있도록 함 * fix(chat): 그룹 채팅 전용 조회 API를 1:1 겸용으로 개조 (#227) * fix(chat): 그룹 채팅 전용 조회 API를 1:1 겸용으로 개조 개요 - 현재 그룹채팅 전용으로 사용 중인 /chatrooms/getGroupChatrooms와 /chatrooms/getGroupChatroom을 1:1도 사용할 수 있도록 겸용으로 바꾼다. 수정 사항 - 함수명 변경 - 1:1 채팅의 경우에는 방장이 없으므로, null 값이 들어가서 에러가 남. 따라서, GROUP이 있는 경우에만 값처리를 해주자 * fix(chat): 1:1 채팅방에서 상대방이 멤버 목록에서 빠져있음 개요 - 상대방이 1:1 채팅방 정보 요청을 하면 거기에 정보가 빠져 있다. 원인은 member에 본인만 등록해주는 부분이 있었음. * fix/translate-get-1: 게시글 가져올 때 \n 이 아닌 각각으로 가져오기 (#228) --------- Co-authored-by: Koo Su Yeon <[email protected]> Co-authored-by: suyeon <[email protected]> * hotfix(db): Migration 관련 이전에 삭제를 안했던 파일을 삭제한다 (#232) 개요 - 잘못해서 삭제를 이전에 안하고 PR올림 * chore(init): init mode 기본을 never로 변경 (로컬) (#234) 개요 - Liquibase 작업을 거친 이후로 init mode가 매번 필요 없어서 never로 변경 제안 * test/isVerified-1: 베타테스트를 위한 인증 열어두기 (#233) * fix(chat): 채팅방의 chatroom_type 정보가 없어서 추가 개요 - 채팅방의 chatroom_type 정보가 없어서 추가를 한다. * fix(chat): 채팅방의 chatroom_type 정보가 없어서 추가 (#236) 개요 - 채팅방의 chatroom_type 정보가 없어서 추가를 한다. * hotfix(db): Migration 관련 이전에 삭제를 안했던 파일을 삭제한다 (#232) (#235) 개요 - 잘못해서 삭제를 이전에 안하고 PR올림 * fix(db): DB Migration에서 파일을 삭제로 누락된 컬럼 부위 (#238) * fix(db): DB Migration에서 파일을 삭제로 누락된 컬럼 부위 개요 - Migration 부분에서 파일 삭제로 인해 사라진 부분 복구 * fix(member): is_verified true위치 업데이트 함수로 변경 개요 - 현재 register에서 is_verified true로 설정을 하는데, 프로필 설정이라던지 과정이 모두 생략되므로, update 요청시 is_verified를 true로 바꿔줌 - 추가로, verification 파일이 없어도 진행이 되게끔 Comment * fix(translate): Translatable 관련 property ignore 적용 현재, chat에서 getTextToTranslate로 인해, textToTranslate 필드값이 있는 것으로 나옴 따라서, 이 에러를 방지하고자 JsonIgnoreProperties 적용 * chore: spotlessApply * 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) * Dev (#242) * 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: 채팅방 조회시 작성자와 다름 문제 해결 * Chore/merge spotlessapply (#247) * 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: 채팅방 조회시 작성자와 다름 문제 해결 * fix/member-1: 회원정보 각각의 필드값에 따른 수정을 가능하게 하자 - Set형태였던 hobbies, languages들을 null 값이 아닐 때에만 수정이 들어가며 null일 때에는 기존 값들이 들어가도록 함 - 기존의 /id API로 들어갔던 수정 메서드를 토큰 인증을 이용한 API로 수정함 * hotfix/file-getById-1: 파일 id로 조회 오류 해결 & id로 파일 가져오기 대대적 적용 * hotfix/file-presignurl-1: 누락된 presignurl 수정 코드 추가 (#251) * Dev (#252) * 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: 싱글 채팅방 퇴장 시 알림 구현 사항 되돌리기 - 이유 : 불필요 * QA를 위한 dev -> prod (#257) * 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/prod dev pr : 채팅방 재입장 적용한 prod merge PR (#268) * 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. * Refactor/chatroom re enter (#269) * 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]> * chore(posts): Posts 에러 관련하여 더 정확한 디버깅을 위해 로깅 추가 (#271) 개요 및 수정사항 - 게시글 에러 관련하여, 정확한 디버깅을 위해 로깅을 추가하자. - 추가로, SQL 출력문을 없앤다. * 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 엔드포인트 생성 : - 해당 엔드포인트는 채팅방 안읽은 채팅 갯수를 업데이트 하기 위한 용도로 사용됨 * 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에 퇴장한 회원 정보 표시 …
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.
개요 및 수정 사항