MONEW는 흩어진 뉴스를 한 곳에서 관심사 기반으로 제공하는 뉴스 통합 플랫폼입니다.
핵심 기능은 다음과 같습니다. 다양한 뉴스 API를 통합하여 하나의 플랫폼에서 뉴스를 탐색할 수 있으며, 사용자가 등록한 관심사를 기반으로 원하는 주제의 기사만 선별하여 제공합니다. 또한 관심사 관련 새로운 기사가 등록되거나 내 댓글에 좋아요가 달리면 알림으로 확인할 수 있고, 댓글과 좋아요를 통해 사용자 간 의견을 공유하고 소통할 수 있습니다.
저는 이번 프로젝트에서 크게 세 가지 영역을 담당했습니다.
첫째, 공통 예외 구조 정의입니다. 프로젝트 전반에서 일관된 예외 처리가 이루어질 수 있도록 공통 예외 클래스와 에러 응답 구조를 설계했습니다. 이를 통해 팀원들이 각자 담당한 도메인에서 동일한 방식으로 예외를 처리할 수 있었습니다.
둘째, 사용자 관리 기능 구현입니다. 회원가입, 로그인, 닉네임 수정, 소프트 삭제(논리 삭제) 및 하드 삭제(물리 삭제)를 포함한 사용자 CRUD 기능 전반을 담당했습니다. 또한 Spring Batch를 활용하여 탈퇴 후 일정 기간이 지난 사용자 데이터를 자동으로 정리하는 배치 삭제 기능도 구현했습니다.
셋째, 사용자 활동 내역 조회 기능입니다. 사용자가 조회한 기사, 좋아요한 댓글, 작성한 댓글 등 활동 이력을 MongoDB에서 조회하는 기능을 구현했습니다.
Spring Batch를 활용해 사용자 배치 삭제 스케줄링을 구현하며 대용량 데이터를 안정적으로 처리하는 방법을 익혔습니다. MongoDB는 사용자 활동 내역과 같이 스키마가 유연한 비정형 데이터를 저장하는 데 활용했으며, RDB와 NoSQL을 함께 사용하는 하이브리드 DB 설계를 경험했습니다. Event Handling은 Spring의 이벤트 기반 비동기 처리를 활용해 서비스 간 결합도를 낮추는 구조를 이해하고 적용했습니다. Locust를 통해 실제 부하 테스트를 진행하며 성능 측정 지표인 RPS, P50/P95 응답 시간, 실패율 등을 분석하는 경험을 쌓았습니다.
문제 1. 기사 첫 조회 시 조회수 중복 증가 문제
기사를 처음 조회할 때 조회수가 2번 증가했다가, 재조회 시 정상으로 돌아오는 현상이 발생했습니다.
원인을 분석한 결과, save로 본인 summary를 저장할 때 최신 카운트가 반영되는데, incrementArticleViewCount의 $inc 연산이 추가로 실행되면서 조회수가 중복으로 증가하는 것이었습니다. 재조회 시에는 addToRecentList가 기존 항목을 제거하고 새 항목으로 덮어쓰면서 우연히 정상값으로 교정되고 있었습니다.
이를 해결하기 위해 $inc 방식을 $set 방식으로 변경하고, 본인 문서는 save로만 처리하도록 수정하여 중복 증가 문제를 해결했습니다.
문제 2. 최근 작성 댓글 이외의 댓글 삭제 시 활동 내역 정리 누락
UserActivityDocument에는 사용자의 최근 댓글 10건만 저장되는 구조인데, 댓글 삭제 처리 로직이 이 10건 안에서만 탐색하도록 되어 있었습니다. 때문에 사용자가 댓글을 100개 작성한 경우, 50번째 댓글처럼 최근 10건에 포함되지 않는 댓글을 삭제하면 ifPresent() 조건에 걸리지 않아 articleCommentCount 감소와 다른 사용자의 commentLikes 정리가 누락되는 문제가 발생했습니다.