[SpringBoot] WebSocket, STOMP - 실시간 채팅③, DTO

SihoonCho·2023년 3월 26일
3
post-thumbnail

※ 읽기에 앞서


본 시리즈는 작성자의 이해와 경험을 바탕으로 실습 위주의 설명을 기반으로 작성되었습니다.
실습 위주의 이해를 목표로 하기 때문에 다소 과장이 많고 생략된 부분이 많을 수 있습니다.
따라서, 이론적으로 미흡한 부분이 있을 수 있는 점에 대해 유의하시기 바랍니다.

또한, SpringBoot 기반의 Backend 위주의 설명을 포함하고 있으니
Frontend 에 대해서는 별도로 참고자료를 찾아보시기를 권장드립니다.


📌 ChatRoomDTO


채팅방(ChatRoom)과 관련된 DTO를 구현합니다.
ChatRoomRequestDtoChatRoomResponseDto로 구분합니다.

  • ChatRoomRequestDto: ChatRoom과 관련된 요청에 사용될 RequestDto
  • ChatRoomResponseDto: ChatRoom과 관련된 응답에 사용될 ResponseDto

📖 ChatRoomRequestDto.java


@Getter
@NoArgsConstructor
public class ChatRoomRequestDto {
    private String roomName;

    @Builder
    public ChatRoomRequestDto(String roomName) {
        this.roomName = roomName;
    }

    public ChatRoom toEntity() {
        return ChatRoom.builder()
                .roomName(this.roomName)
                .build();
    }
}

ChatRoomRequestDto.java 특징

  • 채팅방(ChatRoom) 생성/수정 등의 요청으로 사용하기 위한 DTO 입니다.
  • 사용자가 채팅방 이름(roomName)을 결정하여 요청하게 됩니다.

ChatRoomRequestDto.java 필드

  • roomName: 채팅방 이름

📖 ChatRoomResponseDto.java


@Getter
public class ChatRoomResponseDto {
    private Long id;
    private String roomName;
    private String createdDate;
    private String updatedDate;

    public ChatRoomResponseDto(ChatRoom entity) {
        this.id = entity.getId();
        this.roomName = entity.getRoomName();
        this.createdDate = entity.getCreatedDate().format(DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss"));
        this.updatedDate = entity.getUpdatedDate().format(DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss"));
    }
}

ChatRoomResponseDto.java 특징

  • 채팅방(ChatRoom) 입장 등의 요청으로 사용하기 위한 DTO 입니다.
  • id, roomName, createdDate, updatedDate 등의 정보를 담아 응답하게 됩니다.
  • 날짜와 관련된 createdDate, updatedDateForamt 을 지정하여 String 타입으로 전달합니다.

ChatRoomResponseDto.java 필드

  • id: 채팅방 고유값
  • roomName: 채팅방 이름
  • createdDate: 채팅방 생성일
  • updatedDate: 채팅방 수정일

📌 ChatMessageDTO


채팅 메세지(ChatMessage)와 관련된 DTO를 구현합니다.
ChatMessageRequestDtoChatMessageResponseDto로 구분합니다.

  • ChatMessageRequestDto: ChatMeesage와 관련된 요청에 사용될 RequestDto
  • ChatMessageResponseDto: ChatMessage와 관련된 응답에 사용될 ResponseDto

📖 ChatMessageRequestDto.java


@Getter
@NoArgsConstructor
public class ChatMessageRequestDto {
    private String sender;
    private String message;
    private ChatRoom chatRoom;

    @Builder
    public ChatMessageRequestDto(String sender, String message, ChatRoom chatRoom) {
        this.sender = sender;
        this.message = message;
        this.chatRoom = chatRoom;
    }

    public ChatMessage toEntity() {
        return ChatMessage.builder()
                .sender(this.sender)
                .message(this.message)
                .chatRoom(this.chatRoom)
                .build();
    }
}

ChatMessageRequestDto.java 특징

  • 채팅 메세지(ChatMessage) 생성/수정 등의 요청으로 사용하기 위한 DTO 입니다.
  • 각각의 메세지마다 발송자(sender)와 메세지(message), 연결된 채팅방(chatRoom)
    정보가 담겨 요청하게 됩니다.

ChatMessageRequestDto.java 필드

  • sender: 채팅 메세지 발신자
  • message: 채팅 메세지 내용
  • chatRoom: 채팅 메세지가 연결된 채팅방

📖 ChatMessageResponseDto.java


@Getter
public class ChatMessageResponseDto {
    private Long id;
    private String sender;
    private String message;
    private String createdDate;
    private String updatedDate;

    public ChatMessageResponseDto(ChatMessage entity) {
        this.id = entity.getId();
        this.sender = entity.getSender();
        this.message = entity.getMessage();
        this.createdDate = entity.getCreatedDate().format(DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss"));
        this.updatedDate = entity.getUpdatedDate().format(DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss"));
    }
}

ChatMessageResponseDto.java 특징

  • 채팅 메세지(ChatMessage) 불러오기 등의 요청으로 사용하기 위한 DTO 입니다.
  • id, sender, message, createdDate, updatedDate 등의 정보를 담아 응답하게 됩니다.
  • 날짜와 관련된 createdDate, updatedDateForamt 을 지정하여 String 타입으로 전달합니다.

ChatMessageResponseDto.java 필드

  • id: 채팅 메세지 고유값
  • sender: 채팅 메세지 발신자
  • message: 채팅 메세지 내용
  • createdDate: 채팅 메세지 생성일
  • updatedDate: 채팅 메세지 수정일

📌 결론


실시간 채팅과 관련하여 요청과 응답에 대한 DTO 정의 작업이 끝났습니다.
RequestDto의 경우 굳이 SaveRequestUpdateRequest로 구분하지 않았는데,

다음의 이유와 함께 깔끔한 파일명 관리를 위해 RequestDto를 세분화하지 않았습니다.

  • 채팅방(ChatRoom)의 경우, 채팅방 이름(roomName)만 수정이 되는 등
    채팅방 데이터에 대해 변경(update)되는 속성(컬럼)이 많지 않다.
  • 채팅 메세지(ChatMessage)의 경우, 보편적으로 삭제 기능만 있지
    별도의 채팅 메세지 수정 기능을 제공하지 않는 경우가 많다.

다음 시간에는 JPA Repository를 활용하여 DB로 부터 데이터를 불러오는 등의
작업을 수행하기 위한 Repository를 구현해보도록 하겠습니다.


본 시리즈는 SpringBoot 기반의 WebSocket, STOMP 실시간 채팅기능 구현을 목표로
최근 트렌드와 함께 WebSocket, STOMP의 정형화된 기초개념을 정립하기 위해 작성되었습니다.

WebSocket을 찾아 헤매는 모든 이들에게 이 글을 바칩니다.

본 시리즈는 작성자의 이해와 경험을 바탕으로 실습 위주의 설명을 기반으로 작성되었습니다.
실습 위주의 이해를 목표로 하기 때문에 다소 과장이 많고 생략된 부분이 많을 수 있습니다.
따라서, 이론적으로 미흡한 부분이 있을 수 있는 점에 대해 유의하시기 바랍니다.

또한, SpringBoot 기반의 Backend 위주의 설명을 포함하고 있으니
Frontend 에 대해서는 별도로 참고자료를 찾아보시기를 권장드립니다.
profile
꾸준히 노력하는 개발자

0개의 댓글