From 4f9ef8b07cdcec6e25d84e981525f2e7ee1d0e02 Mon Sep 17 00:00:00 2001 From: jueunk617 Date: Fri, 26 Sep 2025 15:21:34 +0900 Subject: [PATCH 1/2] =?UTF-8?q?Feat:=20=EA=B0=9C=EC=9D=B8=20=EC=B1=84?= =?UTF-8?q?=ED=8C=85=20=EA=B4=80=EB=A0=A8=20DTO=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/dm/dto/ConversationListResponse.java | 25 +++++++++ .../dm/dto/PrivateMessageHistoryResponse.java | 29 ++++++++++ .../chat/dm/dto/PrivateMessageRequest.java | 27 ++++++++++ .../chat/dm/dto/PrivateMessageResponse.java | 53 +++++++++++++++++++ 4 files changed, 134 insertions(+) create mode 100644 src/main/java/com/back/domain/chat/dm/dto/ConversationListResponse.java create mode 100644 src/main/java/com/back/domain/chat/dm/dto/PrivateMessageHistoryResponse.java create mode 100644 src/main/java/com/back/domain/chat/dm/dto/PrivateMessageRequest.java create mode 100644 src/main/java/com/back/domain/chat/dm/dto/PrivateMessageResponse.java diff --git a/src/main/java/com/back/domain/chat/dm/dto/ConversationListResponse.java b/src/main/java/com/back/domain/chat/dm/dto/ConversationListResponse.java new file mode 100644 index 00000000..233fd836 --- /dev/null +++ b/src/main/java/com/back/domain/chat/dm/dto/ConversationListResponse.java @@ -0,0 +1,25 @@ +package com.back.domain.chat.dm.dto; + +import java.time.LocalDateTime; +import java.util.List; + +public record ConversationListResponse( + List conversations +) { + + // 개별 대화 정보 DTO + public record ConversationDto( + Long userId, + String nickname, + String profileImageUrl, + LastMessageDto lastMessage, + Integer unreadCount + ) {} + + // 마지막 메시지 정보 DTO + public record LastMessageDto( + String content, + LocalDateTime createdAt, + Boolean isRead + ) {} +} diff --git a/src/main/java/com/back/domain/chat/dm/dto/PrivateMessageHistoryResponse.java b/src/main/java/com/back/domain/chat/dm/dto/PrivateMessageHistoryResponse.java new file mode 100644 index 00000000..066039cc --- /dev/null +++ b/src/main/java/com/back/domain/chat/dm/dto/PrivateMessageHistoryResponse.java @@ -0,0 +1,29 @@ +package com.back.domain.chat.dm.dto; + +import java.time.LocalDateTime; +import java.util.List; + +public record PrivateMessageHistoryResponse( + List content, + PageableDto pageable +) { + + // 개인 메시지 정보 DTO + public record PrivateMessageDto( + Long messageId, + Long fromUserId, + Long toUserId, + String content, + String messageType, + PrivateMessageResponse.AttachmentDto attachment, + LocalDateTime createdAt, + Boolean isRead + ) {} + + // 페이징 정보 DTO + public record PageableDto( + Integer page, + Integer size, + Boolean hasNext + ) {} +} diff --git a/src/main/java/com/back/domain/chat/dm/dto/PrivateMessageRequest.java b/src/main/java/com/back/domain/chat/dm/dto/PrivateMessageRequest.java new file mode 100644 index 00000000..bc6976f6 --- /dev/null +++ b/src/main/java/com/back/domain/chat/dm/dto/PrivateMessageRequest.java @@ -0,0 +1,27 @@ +package com.back.domain.chat.dm.dto; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +public record PrivateMessageRequest( + @NotNull(message = "수신자 ID는 필수입니다") + Long toUserId, + + @NotBlank(message = "메시지 내용은 필수입니다") + String content, + + String messageType, // TEXT, IMAGE, FILE 등 (기본값: TEXT) + + Long attachmentId // 첨부파일 ID (선택사항) +) { + + // 기본값 처리를 위한 정적 팩토리 메서드 + public static PrivateMessageRequest of(Long toUserId, String content) { + return new PrivateMessageRequest(toUserId, content, "TEXT", null); + } + + // messageType 기본값 처리 + public String messageType() { + return messageType != null ? messageType : "TEXT"; + } +} diff --git a/src/main/java/com/back/domain/chat/dm/dto/PrivateMessageResponse.java b/src/main/java/com/back/domain/chat/dm/dto/PrivateMessageResponse.java new file mode 100644 index 00000000..ecf96c2c --- /dev/null +++ b/src/main/java/com/back/domain/chat/dm/dto/PrivateMessageResponse.java @@ -0,0 +1,53 @@ +package com.back.domain.chat.dm.dto; + +import java.time.LocalDateTime; + +public record PrivateMessageResponse( + Long messageId, + Long fromUserId, + Long toUserId, + String fromNickname, + String fromProfileImageUrl, + String content, + String messageType, + AttachmentDto attachment, + LocalDateTime createdAt +) { + + /** + * 첨부파일 정보 DTO + */ + public record AttachmentDto( + Long id, + String originalName, + String url, + Long size, + String mimeType + ) {} + + /** + * 텍스트 메시지 응답 생성 헬퍼 메서드 + */ + public static PrivateMessageResponse createTextMessage( + Long messageId, + Long fromUserId, + Long toUserId, + String fromNickname, + String fromProfileImageUrl, + String content, + LocalDateTime createdAt) { + + return new PrivateMessageResponse( + messageId, + fromUserId, + toUserId, + fromNickname, + fromProfileImageUrl, + content, + "TEXT", + null, // attachment + createdAt + ); + } +} + From f3af9e786c54d9a91914e083733f6209f0060061 Mon Sep 17 00:00:00 2001 From: jueunk617 Date: Fri, 26 Sep 2025 16:32:13 +0900 Subject: [PATCH 2/2] =?UTF-8?q?Revert:=20=EA=B0=9C=EC=9D=B8=20=EC=B1=84?= =?UTF-8?q?=ED=8C=85=20=EA=B8=B0=EB=8A=A5=20=EC=A0=9C=EA=B1=B0=20(MVP=20?= =?UTF-8?q?=EB=B2=94=EC=9C=84=20=EC=99=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PrivateChatWebSocketController.java | 4 -- .../chat/dm/dto/ConversationListResponse.java | 25 -------- .../dm/dto/PrivateMessageHistoryResponse.java | 29 ---------- .../chat/dm/dto/PrivateMessageRequest.java | 27 --------- .../chat/dm/dto/PrivateMessageResponse.java | 53 ----------------- .../user/entity/PrivateChatMessage.java | 26 --------- .../com/back/domain/user/entity/User.java | 8 --- .../PrivateChatMessageRepository.java | 58 ------------------- 8 files changed, 230 deletions(-) delete mode 100644 src/main/java/com/back/domain/chat/dm/controller/PrivateChatWebSocketController.java delete mode 100644 src/main/java/com/back/domain/chat/dm/dto/ConversationListResponse.java delete mode 100644 src/main/java/com/back/domain/chat/dm/dto/PrivateMessageHistoryResponse.java delete mode 100644 src/main/java/com/back/domain/chat/dm/dto/PrivateMessageRequest.java delete mode 100644 src/main/java/com/back/domain/chat/dm/dto/PrivateMessageResponse.java delete mode 100644 src/main/java/com/back/domain/user/entity/PrivateChatMessage.java delete mode 100644 src/main/java/com/back/domain/user/repository/PrivateChatMessageRepository.java diff --git a/src/main/java/com/back/domain/chat/dm/controller/PrivateChatWebSocketController.java b/src/main/java/com/back/domain/chat/dm/controller/PrivateChatWebSocketController.java deleted file mode 100644 index df61904a..00000000 --- a/src/main/java/com/back/domain/chat/dm/controller/PrivateChatWebSocketController.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.back.domain.chat.dm.controller; - -public class PrivateChatWebSocketController { -} diff --git a/src/main/java/com/back/domain/chat/dm/dto/ConversationListResponse.java b/src/main/java/com/back/domain/chat/dm/dto/ConversationListResponse.java deleted file mode 100644 index 233fd836..00000000 --- a/src/main/java/com/back/domain/chat/dm/dto/ConversationListResponse.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.back.domain.chat.dm.dto; - -import java.time.LocalDateTime; -import java.util.List; - -public record ConversationListResponse( - List conversations -) { - - // 개별 대화 정보 DTO - public record ConversationDto( - Long userId, - String nickname, - String profileImageUrl, - LastMessageDto lastMessage, - Integer unreadCount - ) {} - - // 마지막 메시지 정보 DTO - public record LastMessageDto( - String content, - LocalDateTime createdAt, - Boolean isRead - ) {} -} diff --git a/src/main/java/com/back/domain/chat/dm/dto/PrivateMessageHistoryResponse.java b/src/main/java/com/back/domain/chat/dm/dto/PrivateMessageHistoryResponse.java deleted file mode 100644 index 066039cc..00000000 --- a/src/main/java/com/back/domain/chat/dm/dto/PrivateMessageHistoryResponse.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.back.domain.chat.dm.dto; - -import java.time.LocalDateTime; -import java.util.List; - -public record PrivateMessageHistoryResponse( - List content, - PageableDto pageable -) { - - // 개인 메시지 정보 DTO - public record PrivateMessageDto( - Long messageId, - Long fromUserId, - Long toUserId, - String content, - String messageType, - PrivateMessageResponse.AttachmentDto attachment, - LocalDateTime createdAt, - Boolean isRead - ) {} - - // 페이징 정보 DTO - public record PageableDto( - Integer page, - Integer size, - Boolean hasNext - ) {} -} diff --git a/src/main/java/com/back/domain/chat/dm/dto/PrivateMessageRequest.java b/src/main/java/com/back/domain/chat/dm/dto/PrivateMessageRequest.java deleted file mode 100644 index bc6976f6..00000000 --- a/src/main/java/com/back/domain/chat/dm/dto/PrivateMessageRequest.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.back.domain.chat.dm.dto; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; - -public record PrivateMessageRequest( - @NotNull(message = "수신자 ID는 필수입니다") - Long toUserId, - - @NotBlank(message = "메시지 내용은 필수입니다") - String content, - - String messageType, // TEXT, IMAGE, FILE 등 (기본값: TEXT) - - Long attachmentId // 첨부파일 ID (선택사항) -) { - - // 기본값 처리를 위한 정적 팩토리 메서드 - public static PrivateMessageRequest of(Long toUserId, String content) { - return new PrivateMessageRequest(toUserId, content, "TEXT", null); - } - - // messageType 기본값 처리 - public String messageType() { - return messageType != null ? messageType : "TEXT"; - } -} diff --git a/src/main/java/com/back/domain/chat/dm/dto/PrivateMessageResponse.java b/src/main/java/com/back/domain/chat/dm/dto/PrivateMessageResponse.java deleted file mode 100644 index ecf96c2c..00000000 --- a/src/main/java/com/back/domain/chat/dm/dto/PrivateMessageResponse.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.back.domain.chat.dm.dto; - -import java.time.LocalDateTime; - -public record PrivateMessageResponse( - Long messageId, - Long fromUserId, - Long toUserId, - String fromNickname, - String fromProfileImageUrl, - String content, - String messageType, - AttachmentDto attachment, - LocalDateTime createdAt -) { - - /** - * 첨부파일 정보 DTO - */ - public record AttachmentDto( - Long id, - String originalName, - String url, - Long size, - String mimeType - ) {} - - /** - * 텍스트 메시지 응답 생성 헬퍼 메서드 - */ - public static PrivateMessageResponse createTextMessage( - Long messageId, - Long fromUserId, - Long toUserId, - String fromNickname, - String fromProfileImageUrl, - String content, - LocalDateTime createdAt) { - - return new PrivateMessageResponse( - messageId, - fromUserId, - toUserId, - fromNickname, - fromProfileImageUrl, - content, - "TEXT", - null, // attachment - createdAt - ); - } -} - diff --git a/src/main/java/com/back/domain/user/entity/PrivateChatMessage.java b/src/main/java/com/back/domain/user/entity/PrivateChatMessage.java deleted file mode 100644 index 12226f5d..00000000 --- a/src/main/java/com/back/domain/user/entity/PrivateChatMessage.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.back.domain.user.entity; - -import com.back.global.entity.BaseEntity; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Entity -@Getter -@NoArgsConstructor -public class PrivateChatMessage extends BaseEntity { - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "from_user_id") - private User fromUser; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "to_user_id") - private User toUser; - - private String content; - - private boolean isRead = false; -} diff --git a/src/main/java/com/back/domain/user/entity/User.java b/src/main/java/com/back/domain/user/entity/User.java index 6c2e5cf8..d57ebacd 100644 --- a/src/main/java/com/back/domain/user/entity/User.java +++ b/src/main/java/com/back/domain/user/entity/User.java @@ -51,14 +51,6 @@ public class User extends BaseEntity { @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private List userTokens = new ArrayList<>(); - @Builder.Default - @OneToMany(mappedBy = "fromUser", cascade = CascadeType.ALL, orphanRemoval = true) - private List sentMessages = new ArrayList<>(); - - @Builder.Default - @OneToMany(mappedBy = "toUser", cascade = CascadeType.ALL, orphanRemoval = true) - private List receivedMessages = new ArrayList<>(); - @Builder.Default @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private List roomMembers = new ArrayList<>(); diff --git a/src/main/java/com/back/domain/user/repository/PrivateChatMessageRepository.java b/src/main/java/com/back/domain/user/repository/PrivateChatMessageRepository.java deleted file mode 100644 index fa7c9700..00000000 --- a/src/main/java/com/back/domain/user/repository/PrivateChatMessageRepository.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.back.domain.user.repository; - -import com.back.domain.user.entity.PrivateChatMessage; -import com.back.domain.user.entity.User; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -import java.time.LocalDateTime; -import java.util.List; - -@Repository -public interface PrivateChatMessageRepository extends JpaRepository { - - // 두 사용자 간의 페이징된 대화 메시지 조회 (무한 스크롤용) - @Query("SELECT m FROM PrivateChatMessage m " + - "WHERE (m.fromUser.id = :userId1 AND m.toUser.id = :userId2) " + - "OR (m.fromUser.id = :userId2 AND m.toUser.id = :userId1) " + - "ORDER BY m.createdAt DESC") - Page findConversationBetweenUsers(@Param("userId1") Long userId1, - @Param("userId2") Long userId2, - Pageable pageable); - - // 두 사용자 간의 페이징된 대화 메시지 조회 (무한 스크롤용) - 최신 메시지부터 - @Query("SELECT m FROM PrivateChatMessage m " + - "WHERE ((m.fromUser.id = :userId1 AND m.toUser.id = :userId2) " + - "OR (m.fromUser.id = :userId2 AND m.toUser.id = :userId1)) " + - "AND m.createdAt > :timestamp " + - "ORDER BY m.createdAt ASC") - List findNewMessagesBetweenUsers(@Param("userId1") Long userId1, - @Param("userId2") Long userId2, - @Param("timestamp") LocalDateTime timestamp); - - // 두 사용자 간의 최근 20개 메시지 조회 (초기 로드용) - @Query("SELECT DISTINCT " + - "CASE WHEN m.fromUser.id = :userId THEN m.toUser ELSE m.fromUser END " + - "FROM PrivateChatMessage m " + - "WHERE m.fromUser.id = :userId OR m.toUser.id = :userId") - List findConversationPartners(@Param("userId") Long userId); - - // 두 사용자 간의 최신 메시지 조회 - @Query("SELECT m FROM PrivateChatMessage m " + - "WHERE (m.fromUser.id = :userId1 AND m.toUser.id = :userId2) " + - "OR (m.fromUser.id = :userId2 AND m.toUser.id = :userId1) " + - "ORDER BY m.createdAt DESC " + - "LIMIT 1") - PrivateChatMessage findLatestMessageBetweenUsers(@Param("userId1") Long userId1, - @Param("userId2") Long userId2); - - // 두 사용자 간의 전체 메시지 수 조회 - @Query("SELECT COUNT(m) FROM PrivateChatMessage m " + - "WHERE (m.fromUser.id = :userId1 AND m.toUser.id = :userId2) " + - "OR (m.fromUser.id = :userId2 AND m.toUser.id = :userId1)") - long countMessagesBetweenUsers(@Param("userId1") Long userId1, @Param("userId2") Long userId2); -} \ No newline at end of file