Skip to content

Commit

Permalink
Fix/dev rebase from prod (#296)
Browse files Browse the repository at this point in the history
* 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]>
  • Loading branch information
KooSuYeon and seungholee-dev authored Nov 21, 2024
1 parent 5413284 commit a444d5d
Showing 0 changed files with 0 additions and 0 deletions.

0 comments on commit a444d5d

Please sign in to comment.