1. 프로젝트 개요
- MongoDB 및 PostgreSQL 백업 및 복구 시스템
- 다양한 뉴스 출처를 통합하여 관심사 기반으로 뉴스 저장
- 관심 있는 주제의 기사가 등록을 실시간 알림으로 확인
- 댓글과 좋아요를 통해 다른 사용자와 의견을 나눌 수 있는 소셜 기능 제공
2. 담당한 작업
- 뉴스기사 Entity의 CRD 구현
- 뉴스기사 백업/복구 구현
- 코드래빗 기능 추가
3. 기술적 성과
- CodeRabbit
- 보안 취약점이나 잠재적 런타임 오류를 조기에 발견해 버그 생성을 방지했고 팀 내에서 정한 코드 언벤션 내용을 프롬프트에 입력해 코드 베이스 일관성을 확보했음
- LomBok & Mapstruct
- 객체를 생성하고, 필드를 반환, 수정하는 기능을 annotaion으로 간단하게 끝낼 수 있게 해줌
- 데이터를 반환할 때, 필요한 정보, 불필요한 정보를 취사 선택해서 입맛에 맞게 골라 반환을 해야하는데 Service계층에서 그 기능을 추가하면 코드가 난잡해짐. 요 기능을 추가해서 코드의 가독성을 높이고, 비즈니스의 로직만 집중하게 만들어 줬음
- QueryDSL
- 기사를 조회할 때 여러 속성의 검색 조건이 있었는데 그걸 반영하기 위해 QueryDSL을 도입했음
- 원래라면 서비스에서 변수의 값에 따라 여러 분기 처리를 하고 거기에 알맞는 최적의 repository 함수문을 작성 후 넣어야 했고 지저분해졌는데 요번 기술의 도입으로 repository에 해당 부분을 넘겨 서비스의 응집도를 높였음
- 지난 프로젝트 때는 구현하지 못했던 기술을 요번에 사용했다는 것에 아주 좋았음
- Postman
- 요번 뉴스기사 삭제 구현건은 프론트에 구현되지 않아 postman으로 직접 쿼리를 보내 테스트를 진행하였음
- PostgreSQL
- 데이터를 영속화 하기위해 라이센스 비가 없는 세계 최대의 DB 오픈소스를 사용했음
4. 문제점 및 해결 과정
- 조회 스크롤이 동작하지 않던 문제
- 프론트엔드 파일이 주어졌고 이걸 바탕으로 백엔드를 구현하는 프로젝트 였음. 뉴스기사 조회를 하고 스크롤을 내리면 추가적으로 필요한 내용을 반환하는 커서 페이지네이션을 구현하였는데 스크롤이 멈추고 추가 조회에서 에러를 반환하는 상황을 발견을 하였음. 개발자 도구로
response를 확인하였고 커서와 보조커서까지 반환하는 것을 확인하였음. 문제를 살펴보니 프론트에서 커서만 사용하고 보조커서는 활용하지 않은 문제를 발견하였고, 커서에 보조커서를 집어넣어 커서, 보조커서 형식으로 반환하였고 성공적으로 그 값이 쿼리 파라미터에 오는 것을 확인하였음. 해당 커서를 파싱을 통해 잘라내어 커서, 보조커서로 활용하였고 성공적으로 다음 페이지를 반환하는 것으로 문제를 해결하였음
- 테스트 코드의 쉐어락 문제
- 요번 프로젝트에서 구현했었던 복구에서 있었던 문제였음. 통합테스트를 진행하는 과정에서 복구를 하려면 사전적으로 삭제를 진행했어야 했기에
기사Entity 를 생성 및 삭제하였고 복구를 테스트 하는 과정 중에서 DB가 멈추는 현상을 발견함. 로그 레벨을 Trace로 낮춰서 확인해봐도 오류를 반환하는 것은 없었음. 도커에서 실행중인 Postgresql에 직접 들어가 Gemini가 알려준 특정 쿼리를 통해 마지막에 실행한 쿼리가 메타데이터와의 쉐어락에 걸려 진행하지 못하던 현상이었음. 테스트 코드는 @Transactional 을 추가하여 진행했던 터라 생긴 문제였는데, 코드를 생성하고 삭제하면 커밋을 해야하는데 하지않고 바로 복구를 진행하였기에 DB에서 이를 인식하지 못했던 거라 생긴 문제였음. 그래서 @Before 로 테스트 데이터를 DB에 먼저 추가하였고 이후에 삭제 및 복구를 통해 통합테스트를 통과하는 것을 확인할 수 있었음
5. 협업 및 피드백