프로젝트 (Java)/예약마켓

[프로젝트] 32. 뉴스피드 알림 기능 리팩토링

hihyuk 2024. 1. 31. 09:54

프로젝트의 알림 기능 리팩토링을 통해 알림 메시지 생성 로직을 개선하고 코드의 가독성과 확장성을 향상시킬 수 있습니다. 이러한 리팩토링 과정에서 NotiType enum을 활용하여 각 알림 유형별로 다른 메시지 포맷을 정의하고, 이를 기반으로 NotificationDto에서 알림 메시지를 생성하는 방식을 구현했습니다.

 

NotiType Enum 확장

NotiType enum은 알림 유형별로 다양한 메시지 포맷을 정의하기 위해 추상 메소드 formatMessage를 포함합니다. 이 메소드는 발신자 이름, 수신자 이름, 그리고 수신자가 본인인지 여부(isMyNotification)를 매개변수로 받아, 해당 알림 유형에 맞는 포맷된 메시지를 생성합니다.

@Getter
public enum NotiType {
    LIKE("좋아") {
        @Override
        public String formatMessage(String fromUserName, String toUserName, boolean isMyNotification) {
            String targetUserName = isMyNotification ? "당신의" : toUserName + "님의";
            return String.format("%s님이 %s 포스트를 %s합니다", fromUserName, targetUserName, getKey());
        }
    },
    COMMENT("댓글") {
        @Override
        public String formatMessage(String fromUserName, String toUserName, boolean isMyNotification) {
            String targetUserName = isMyNotification ? "당신의" : toUserName + "님의";
            return String.format("%s님이 %s 포스트에 %s를 남겼습니다", fromUserName, targetUserName, getKey());
        }
    },
    FOLLOW("팔로우") {
        @Override
        public String formatMessage(String fromUserName, String toUserName, boolean isMyNotification) {
            String targetUserName = isMyNotification ? "당신을" : toUserName + "님을";
            return String.format("%s님이 %s %s합니다", fromUserName, targetUserName, getKey());
        }
    };
    public abstract String formatMessage(String fromUserName, String toUserName, boolean isMyNotification);
}

 

NotificationDto 수정

NotificationDto에서는 NotiTypeformatMessage 메소드를 활용하여 알림 메시지를 생성합니다. 본인에게 온 알림과 타인에게 온 알림을 구분하여 메시지를 포맷합니다.

    public static NotificationDto getFollowNotification(Notification notification) {
        String fromUserName = notification.getFromUser().getName();
        String toUserName = notification.getToUser().getName();
        String formattedMessage = notification.getType().formatMessage(fromUserName, toUserName, false);

        return new NotificationDto(formattedMessage, notification.getCreatedAt());
    }
    
    public static NotificationDto getMyNotification(Notification notification) {
        String fromUserName = notification.getFromUser().getName();
        String formattedMessage = notification.getType().formatMessage(fromUserName, "", true);

        return new NotificationDto(formattedMessage, notification.getCreatedAt());
    }

 

NewsFeedDto 수정

NewsFeedDto에서는 알림 리스트와 게시물 리스트를 관리합니다. 알림 리스트는 NotificationDto::getFollowNotification 또는 NotificationDto::getMyNotification을 사용하여 생성되며, 생성된 시간 또는 ID를 기준으로 정렬됩니다.

    public static NewsFeedDto getNewsfeedDto(List<Notification> notifications, List<Post> posts) {
        return new NewsFeedDto(
				notifications.stream()
                        .map(NotificationDto::getFollowNotification)
                        .sorted(Comparator.comparing(NotificationDto::getCreatedAt).reversed())
                        .collect(Collectors.toList()),
                posts.stream()
                        .map(PostDto::of)
                        .sorted(Comparator.comparing(PostDto::getId).reversed())
                        .collect(Collectors.toList())
        );

 

결론

이러한 리팩토링을 통해, 알림 메시지 생성 로직을 각 알림 유형별로 캡슐화하고, 메시지 포맷을 보다 유연하게 관리할 수 있게 되었습니다. 또한, 알림 유형이 추가되거나 메시지 포맷이 변경될 경우에도 NotiType enum만 수정하면 되므로 유지 보수성이 향상됩니다.