본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.




패스트캠퍼스의 '9개 도메인 프로젝트로 끝내는 백엔드 웹 개발 (Java/Spring) 초격차 패키지 Online' 강의 수강 39일차!
오늘은 커뮤니티 피드 서비스의 알림 기능 구현 작업을 진행하였다.
@Repository
@RequiredArgsConstructor
public class FcmMessageRepositoryImpl implements MessageRepository {
private final JpaFcmTokenRepository jpaFcmTokenRepository;
private static final String LIKE_MESSAGE_TEMPLATE = "%s님이 %s님의 글에 좋아요를 눌렀습니다.";
private static final String MESSAGE_KEY = "message";
@Override
public void sendLikeMessage(User sender, User targerUser) {
Optional<FcmTokenEntity> tokenEntity = jpaFcmTokenRepository.findById(targerUser.getId());
if (tokenEntity.isEmpty()) {
return;
}
FcmTokenEntity token = tokenEntity.get();
Message message = Message.builder()
.putData(MESSAGE_KEY, LIKE_MESSAGE_TEMPLATE.formatted(sender.getName(), targerUser.getName()))
.setToken(token.getFcmToken())
.build();
FirebaseMessaging.getInstance().sendAsync(message);
}
}
저장되어 있는 토큰 정보를 타켓 유저에 맞게 불러와주고, 그 값이 없다면 그냥 발송하지 않게 된다.
유저가 푸시 토큰을 받을 토큰이 저장되어있다면 파이어베이스에서 제공하는 메세지를 만들어서 비동기로 전달해준다.
@Override
@Transactional
public UserAuth loginUser(String email, String password, String fcmToken) {
UserAuthEntity userAuthEntity = jpaUserAuthRepository.findById(email).orElseThrow();
UserAuth userAuth = userAuthEntity.toUserAuth();
if (!userAuth.matchPassword(password)) {
throw new IllegalArgumentException("옳지 않은 비밀번호입니다.");
}
userAuthEntity.updateLastLoginAt();
jpaFcmTokenRepository.save(new FcmTokenEntity(userAuth.getUserId(), fcmToken));
return userAuth;
}
이전에 구현했던 로그인 로직에 fcmToken을 파라미터로 추가하고, jpaFcmTokenRepository를 통해 저장하여 로그인할 때 토큰값도 같이 저장되게 하였다.
@Override
@Transactional
public void like(Post post, User user) {
LikeEntity likeEntity = new LikeEntity(post, user);
entityManager.persist(likeEntity);
jpaLikeRepository.save(likeEntity);
jpaPostRepository.updateLikeCount(post.getId(), 1);
messageRepository.sendLikeMessage(user, post.getAuthor());
}
기존의 like 로직에 messageRepository를 추가하여, 좋아요를 누를 때 저장되어 있는 토큰 기반으로 메세지가 전달되게 하였다.
어플리케이션을 실행시켜 user1과 user2 계정으로 로그인하여 fcmToken값을 저장시킨 후, postman에서 like 요청을 보내면 크롬에서 알림이 뜨는 것과 개발자 도구에서도 메세지 정보가 뜨는 것을 확인할 수 있다.
이렇게 커뮤니티 피드 서비스 강의가 모두 마무리되었다.
40일에 가까운 시간 동안 매일 해오던 것이 끝나서인지 뭔가 아쉽다ㅠㅠ
이번 part1, part2 강의를 들으며 객체지향적인 설계부터 jwt, 쿼리 튜닝, firebase 활용 등 많은 것을 배울 수 있었다.
특히, 내가 어려워했던 테스트 코드 기반의 클린 아키텍처의 중요성과 본질 및 활용법 등에 대해 정말 많이 배운 것 같아 기쁘고 뿌듯하다.
백엔드 개발자로서 갖추어야 할 기본적이지만 그만큼 중요한 것들에 대한 내용이 알차게 담겨있어서 매우 만족스럽게 수강할 수 있었다!
좋은 강의 만들어주신 강사님께도 감사한 마음을 전합니다..🙇♀️👍