코딩과 결혼합니다

230830 - 알림기능 구현하기(해시태그 구독하기/ 알림 구독하기) 본문

코딩과 매일매일♥/Seoulvival

230830 - 알림기능 구현하기(해시태그 구독하기/ 알림 구독하기)

코딩러버 2023. 8. 31. 16:34
728x90

해시태그 구독 기능


해시태그 알림을 등록받을 수 있게 만들어 보겠다! 해시태그 개수 제한은 프런트 쪽에서 걸어주고 나는 저 해시태그를 받아와서 DB에 저장을 해 놓으면 된다. + 삭제하는 것까지!


   AlarmController
   
   //해시태그 구독
    @PostMapping("/hashtag")
    public MessageResponseDto subscribeHashtag(@RequestParam String hashtag,
                                               @AuthenticationPrincipal UserDetailsImpl userDetails){
        Long userId = userDetails.getUser().getId();
        return alarmService.subscribeHashtag(hashtag, userId);
    }

입력값으로 사용자가 보낸 hashtag와 그리고 그 유저의 정보를 토큰으로 받아온다!

   AlarmService
   
   //해시 태그 구독
    public MessageResponseDto subscribeHashtag(String hashtag, Long userId) {
        User user = userRepository.findById(userId)
                .orElseThrow(() -> new IllegalArgumentException("사용자가 존재하지 않습니다."));

        SubscribeHashtag subscribeHashtag = new SubscribeHashtag(user, hashtag);
        subscribeHashtagRepository.save(subscribeHashtag);

        return new MessageResponseDto("해시태그 구독 완료");
    }

유저를 확인한 다음에 해시태그구독 repository에 저장. 매우 간단하죵

 

@Entity
@Getter
@Setter
@Table(name = "sub_hashtag")
@NoArgsConstructor
public class SubscribeHashtag {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "sub_hashtag_id")
    private Long Id;

    @Column(nullable = false)
    private String hashtag;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;

    public SubscribeHashtag(User user, String hashtag) {
        this.user = user;
        this.hashtag = hashtag;
    }
}

어떤 유저가 어떤 해시태그를 구독했는지 구분해야 하므로 User entity와 연관관계를 맺어줌! (단방향으로)


📌 결과

DB에 잘 저장되었습니다!


알림 구독 기능


이 부분은 SSE와 관련이 있겠다! 자신이 푸시 알림 받고 싶은 걸 모두/ 혹은 각각 골라서 받을 수 있도록 구현할 것이다.

boolean 타입을 이용해서 구독을 안 했을 때는 false, 구독했을 때는 true로 바꿔준다.


AlarmController   
   
   //알림 구독
    @PostMapping("/subscribe")
    public MessageResponseDto subscribeAlarm(@RequestParam AlarmType alarmType,
                                             @AuthenticationPrincipal UserDetailsImpl userDetails){
        Long userId = userDetails.getUser().getId();
        return alarmService.subscribeAlarm(alarmType,userId);
    }

프런트에서 alarmType을 받을 것이다. 댓글인지 좋아요인지 해시태그인지 아니면 전체인지.

 

   AlarmService
   
   //알림 구독
    @Transactional
    public MessageResponseDto subscribeAlarm(AlarmType alarmType, Long userId) {
        User user = userRepository.findById(userId)
                .orElseThrow(() -> new IllegalArgumentException("사용자가 존재하지 않습니다."));

        if (alarmType.equals(AlarmType.LIKE)) {
            user.changeLikeAlarm();
        } else if (alarmType.equals(AlarmType.COMMENT)) {
            user.changeCommentAlarm();
        } else if (alarmType.equals(AlarmType.HASHTAG)) {
            user.changeHashtagAlarm();
        }
        return new MessageResponseDto(alarmType + " 구독이 변경 완료되었습니다.");
    }
    
======================================================================================

     User(entity) ++추가
     
    private boolean likeAlarm;
    private boolean commentAlarm;
    private boolean hashtagAlarm;

    public void changeLikeAlarm() {this.likeAlarm = !this.likeAlarm;}

    public void changeCommentAlarm() {this.commentAlarm = !this.commentAlarm;}

    public void changeHashtagAlarm() {this.hashtagAlarm = !this.hashtagAlarm;}

그리고 토글로 AlarmType에 따라 true/ false로 바꿔준다.

 

public enum AlarmType {
    COMMENT,
    LIKE,
    HASHTAG
}

나는 알람 타입을 좀 더 세분화했다. 

@Getter
public enum AlarmEventType {
    NEW_COMMENT_ON_POST(AlarmType.COMMENT),
    NEW_RECOMMENT_ON_POST(AlarmType.COMMENT),

    NEW_LIKE_ON_POST(AlarmType.LIKE),
    NEW_LIKE_ON_COMMENT(AlarmType.LIKE),
    NEW_LIKE_ON_RECOMMENT(AlarmType.LIKE),

    NEW_POST_WITH_HASHTAG(AlarmType.HASHTAG)
    ;


    private final AlarmType alarmType;

    AlarmEventType (AlarmType alarmType){
        this.alarmType = alarmType;
    }
    public AlarmType getAlarmType(){
        return this.alarmType;
    }
}

[알람 이벤트 타입]으로 새로운 댓글과 대댓글에 대한 것, 

게시글, 댓글, 대댓글에서 각각 좋아요가 왔을 때도 [알람 이벤트 타입]으로 세세하게 나누어주었다.

그리고 공통된 특징을 가진 것들끼리 하나의 [알람타입]으로 묶어줌!

 

댓글 알림을 구독하면 자신의 포스트에 댓글이 달린건지, 아니면 자신의 댓글에 대댓글이 달린건지 구분할 수 있다!


📌 결과

 

각 유저마다 어떤걸 구독했는지 구분할 수 있다~