[프로젝트] 32. 뉴스피드 알림 기능 리팩토링
프로젝트의 알림 기능 리팩토링을 통해 알림 메시지 생성 로직을 개선하고 코드의 가독성과 확장성을 향상시킬 수 있습니다. 이러한 리팩토링 과정에서 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에서는 NotiType의 formatMessage 메소드를 활용하여 알림 메시지를 생성합니다. 본인에게 온 알림과 타인에게 온 알림을 구분하여 메시지를 포맷합니다.
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만 수정하면 되므로 유지 보수성이 향상됩니다.