1. 프로젝트 개요
- 제목: 덕후감
- 부제: 도서 이미지 OCR 및 ISBN 매칭 서비스
- 소개: 책 읽는 즐거움을 공유하고, 지식과 감상을 나누는 책 덕후들의 커뮤니티 서비스
- 기술스택
2. 담당한 작업
- 댓글 관리
- 댓글 등록
- 댓글 수정
- 댓글 목록 조회
- Cursor 기반의 페이지네이션 처리로 자연스러운 스크롤 조회 가능하게 작성
- 댓글 삭제
- 본인이 작성한 댓글만 삭제할 수 있게 작성
- 기본적으로 댓글 삭제 시에 논리 삭제 채택
- Batch 및 Scheduler를 활용한 물리 삭제 자동화
3. 기술적 성과
- 서버 모니터링
- Prometheus
- 애플리케이션에 설정된
/actuator/prometheus 경로로 접속해 수치 데이터 수집
- Grafana
- 프로메테우스가 수집한 정보를 바탕으로 시각화 대시보드 구성
- 비동기 이벤트 기반 알림 시스템
- Kafka
- kafka를 도입하여 메인 로직과 알림 로직을 분리, 사용자 응답 속도 개선 및 시스템 결합도 해소
4. 문제점 및 해결 과정
- 문제점
- 사용자의 동시 댓글 작성 시 '부모 리뷰의 댓글 카운트' 누락 발생
- 기존의 엔티티 필드 수정 방식(
review.increaseCount())은 자바 메모리로 값을 읽어와 연산 후 UPDATE를 수행함. 이로 인해 찰나의 순간에 여러 사용자가 댓글을 달면, 서로 동일한 과거 카운트 값을 읽고 덮어쓰게 되어 실제 댓글 수보다 카운트가 낮게 측정되는 현상 발생
- JPA의 영속성 컨텍스트 관리 방식과 트랜잭션 격리 수준에 따른 동시성 이슈
- 해결 과정
- 메모리 연산을 제거하고, DB 레벨에서 즉각적으로 연산이 수행되는
@Modifying 벌크 쿼리를 도입하여 원자적 업데이트 수행
- 벌크 연산 전
saveAndFlush()를 사용하여 1차 캐시와 DB 간의 실행 순서를 강제 동기화하고, 데이터 정합성 유지
- 삭제 API 호출 시
DeletedAt 필드를 체크하는 방어 로직을 설계하여, 이미 논리 삭제된 댓글로 인해 카운트가 중복 감소하여 음수가 되는 예외 상황을 원천 차단
- 관련 문서
5. 협업 및 피드백
- 공백 없는 실시간 소통 시스템
- 제공된 스크럼 시간 이외에도 디스코드 채팅방에서 활발한 정보 공유나 PR 및 진행상황이 공유 되었다. 결국 개발이라는 것은 나 혼자 하는게 아니기에 소통과정이 여러번 강조 되는것이 중요하고 원활히 되어야하는 것을 느꼈다 프로젝트 내내 모두가 서로의 작업에 대해 진중히 고민해주고, 작성한 코드가 잘 돌아가면 기뻐해주고, 에러가 발생하면 모두가 같이 도움을 주는 이상적인 팀 프로젝트에 가까웠던거 같아 배운 점이 많았다.
- 코드 리뷰를 통한 성장
- 초급 프로젝트보다 성장한 깊이 있고 성숙해진 코드 리뷰 문화를 느낄수 있었다. 전에는 이해가 잘 안되도 넘어갔었는데 이번 프로젝트를 진행하면서 코드 리뷰를 통해 상호 검증 문화를 이해하고 이 과정을 통해 미처 발견하지 못했던 예외 케이스를 보완하고, 팀 전체적인 코드 컨벤션을 상향 평준화 할 수 있었다.
- 팀원들과 시너지
- 내가 작성하는 중이지만 민망하다.. 팀 이름만 봐도 느껴지겠지만 팀원들이 나를 많이 좋아해주는게 느껴졌다. 부끄럽기도 했지만 이런 소소한 즐거움이 협업의 선순환으로 이어지지 않았나 생각이 든다. 프로젝트 끝까지와서 느낀점과 배운점을 말해보라고 하면 결국 좋은 서비스는 좋은 인간관계에서 나오며, 기술적인 성취만큼보다 중요한것이 함께 일하고 싶은 동료라는 것을 느꼈다.
6. 코드 품질 및 최적화
- 높은 테스트 신뢰도 확보
- 기준치 보다 높은 커버리지 93%로 핵심 비즈니스 로직에 대한 단위 테스트를 철저히 작성. 단순히 성공 케이스뿐만 아니라 다양한 예외 상황을 검증하여, 기능 추가나 리팩토링 시에도 사이드 이펙트 없는 안정적인 코드를 유지