테이블에는 없는 특정값 set 을 통한 설정 및 반환

박영준·2023년 8월 28일
0

Spring

목록 보기
56/58

messageRoom 테이블

responseDto

messageRoom 테이블에는 없으나, emoticon 필드값을 프론트 쪽에서 받길 원한다.

@Getter
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MessageResponseDto {
    private Long id;
    private String roomName;
    private String sender;
    private String roomId;
    private String receiver;
    private Long postId;
    private LocalDateTime createdAt;
    
    private String emoticon;	// messageRoom 에 저장된 컬럼은 아니지만, 프론트 쪽으로 반환하고 싶은 필드값

    // 쪽지방 생성
    public MessageResponseDto(MessageRoom messageRoom) {
        this.id = messageRoom.getId();
        this.roomName = messageRoom.getRoomName();
        this.sender = messageRoom.getSender();
        this.roomId = messageRoom.getRoomId();
        this.receiver = messageRoom.getReceiver();
        this.postId = messageRoom.getPost().getId();
    }

    // 사용자 관련 쪽지방 전체 조회
    public MessageResponseDto(Long id, String roomName, String roomId, String sender, String receiver, LocalDateTime createdAt) {
        this.id = id;
        this.roomName = roomName;
        this.roomId = roomId;
        this.sender = sender;
        this.receiver = receiver;
        ZoneId utcZone = ZoneId.of("UTC");
        ZoneId koreaZone = ZoneId.of("Asia/Seoul");
        ZonedDateTime utcTime = createdAt.atZone(utcZone);
        ZonedDateTime koreaTime = utcTime.withZoneSameInstant(koreaZone);

        this.createdAt = koreaTime.toLocalDateTime();
    }

    public MessageResponseDto(String roomId) {
        this.roomId = roomId;
    }

    public void setLatestMessageContent(String message) {
        this.message = message;
    }

    public void setLatestMessageCreatedAt(LocalDateTime createdAt) {
        ZoneId utcZone = ZoneId.of("UTC");
        ZoneId koreaZone = ZoneId.of("Asia/Seoul");
        ZonedDateTime utcTime = createdAt.atZone(utcZone);
        ZonedDateTime koreaTime = utcTime.withZoneSameInstant(koreaZone);

        this.createdAt = koreaTime.toLocalDateTime();
    }

	// messageRoom 에 저장된 컬럼은 아니지만, 프론트 쪽으로 반환하고 싶은 필드값
    public void setEmoticon(String emoticon) {
        this.emoticon = emoticon;
    }
}

MessageRoomService

emoticon 을 어떻게 설정(set)해줄지 정할 수 있다.

@Slf4j
@Service
@RequiredArgsConstructor
public class MessageRoomService {

    ...


    // 사용자 관련 쪽지방 전체 조회
    public List<MessageResponseDto> findAllRoomByUser(User user) {
        List<MessageRoom> messageRooms = messageRoomRepository.findByUserIdOrReceiverUserId(user.getId(), user.getId());

        List<MessageResponseDto> messageRoomDtos = new ArrayList<>();

        for (MessageRoom messageRoom : messageRooms) {
            //  user 가 sender 인 경우
            if (user.getNickname().equals(messageRoom.getSender())) {
                MessageResponseDto messageRoomDto = new MessageResponseDto(
                        messageRoom.getId(),
                        messageRoom.getReceiver(),        // roomName
                        messageRoom.getRoomId(),
                        messageRoom.getSender(),
                        messageRoom.getReceiver(),
                        messageRoom.getCreatedAt());
                        
						// messageRoom 에 저장된 컬럼은 아니지만, 프론트 쪽으로 반환하고 싶은 필드값
                        User receiverUser = userRepository.findByNickname(messageRoom.getReceiver());
                        messageRoomDto.setEmoticon(receiverUser.getEmoticon());

                // 가장 최신 메시지 & 생성 시간 조회
                Message latestMessage = messageRepository.findTopByRoomIdOrderByCreatedAtDesc(messageRoom.getRoomId());
                if (latestMessage != null) {
                    messageRoomDto.setLatestMessageCreatedAt(latestMessage.getCreatedAt());
                    messageRoomDto.setLatestMessageContent(latestMessage.getMessage());
                }

                messageRoomDtos.add(messageRoomDto);
            // user 가 receiver 인 경우
            } else {
                MessageResponseDto messageRoomDto = new MessageResponseDto(
                        messageRoom.getId(),
                        messageRoom.getSender(),        // roomName
                        messageRoom.getRoomId(),
                        messageRoom.getSender(),
                        messageRoom.getReceiver(),
                        messageRoom.getCreatedAt());

						// messageRoom 에 저장된 컬럼은 아니지만, 프론트 쪽으로 반환하고 싶은 필드값
                        User senderUser = userRepository.findByNickname(messageRoom.getSender());
                        messageRoomDto.setEmoticon(senderUser.getEmoticon());

                // 가장 최신 메시지 & 생성 시간 조회
                Message latestMessage = messageRepository.findTopByRoomIdOrderByCreatedAtDesc(messageRoom.getRoomId());
                if (latestMessage != null) {
                    messageRoomDto.setLatestMessageCreatedAt(latestMessage.getCreatedAt());
                    messageRoomDto.setLatestMessageContent(latestMessage.getMessage());
                }

                messageRoomDtos.add(messageRoomDto);
            }
        }

        return messageRoomDtos;
    }
    
    ...

}
profile
개발자로 거듭나기!

0개의 댓글