프로젝트 5

CompletableFuture를 활용한 도서 베스트셀러 저장 성능 개선

개요  도서 인사이트 공유 프로젝트 `지성인`에는 베스트셀러 도서를 매일 최신화하는 로직이 존재한다.매일 오전 4시에 베스트셀러 상위 100권 정보를 크롤링하여 서버에 저장한다.처음에는 동기적인 방식으로 코드를 작성하여 작업을 수행했다.하지만 이 방법은 많은 시간이 소요되어 효율성에 문제가 있었다. 그래서 이 문제를 해결하기 위해 CompletableFuture를 활용한 비동기 처리와 병렬 프로그래밍으로 개선을 시도했다.이 글에서는 기존 동기적인 접근 방식에서 겪었던 지연 문제를 어떻게 해결했는지, 그리고 새로운 방법으로 얼마나 개선됐는지 공유해본다. 문제 상황@Component@RequiredArgsConstructorpublic class Yes24Crawler implements Crawler { ..

프로젝트 2024.10.24

RESTful한 path 설계하기

프로젝트를 리팩토링하며 처음에는 신경쓰지 않았던 API path들이 거슬리기 시작했다. 일단 REST API란 HTTP 프로토콜을 기반으로 서버와 클라이언트가 데이터를 주고받는 방식이다.주요 특징은 아래와 같다.리소스 기반HTTP 메서드 사용무상태성 (상태를 저장하지 않으며, 각 요청은 독립적)응답 방식 (JSON / XML) 그래서 도메인 엔티티들의 리소스를 어떻게 명시해야 RESTful하게 설계할 수 있을까 ?내가 고민했던 부분의 path는 다음과 같다. // 시작을 comments로 하는 경우POST /comments/talk-rooms/{talkRoomId} // 대화방에 댓글 작성GET /comments/talk-rooms/{talkRoomId} // 대화방의 모든 댓글 조회// 끝을 comme..

프로젝트 2024.10.05

AOP를 통한 유저 인증 정보 미리 주입하기

개요카카오 소셜 로그인을 구현하고 토큰을 발급하여, 인증 정보를 토큰으로 관리하는 프로세스를 구현했다.Authentication 객체를 통해 인증된 유저 정보를 활용할 수도 있었다.하지만 해당 방법은 사용할 수 있는 유저 정보가 제한적이고, 중복되는 코드가 많아지는 단점이 존재한다.그래서 AOP와 Authentication 객체를 활용해서 메서드 호출 전에 유저 정보를 주입해보자. 구현CurrentUserInfo 유저 정보 주입을 통해 생성되는 객체이며, 실질적으로 비즈니스 로직에서 사용되는 객체다.현재 필요한 정보인 유저 ID만 존재한다. AssignCurrentUserInfo 해당 어노테이션이 달린 메서드만 호출 전에 유저 정보 주입이 실행된다. AssignCurrentUserInfoAspect 로직..

프로젝트 2024.07.23

[지성인] JaCoCo 테스트 분석 도구 적용, 프로젝트 테스트 커버리지 확인

약 1개월 반 전에 테스트 개수가 200개였다..  추가적인 기능 개발과 리팩토링을 했더니 단위 테스트도 늘어나서 55개가 늘어난 258개가 되었다.우리 백엔드 파트는 '지성인' 프로젝트를 시작할 때부터 모든 분기 테스트를 작성하기로 마음 먹었다. 또한 레이어드 아키텍처를 적용해서 각 레이어별 역할을 명확히 했다.그에 따라 각 기능에 대해서 레이어별로 단위 테스트를 작성했다.힘들긴 했지만 .. 테스트 코드 덕분에 통해 코드의 품질이 올라갔다고 생각한다. 이쯤되니 우리 프로젝트의 테스트 커버리지는 얼마나 되는지 궁금해졌다.그래서 GitHub Actions을 통해 JaCoCo 테스트 분석 도구를 적용하기로 했다. 적용build.gradleplugins { id 'java' id 'org.sprin..

프로젝트 2024.07.09

[지성인] 한줄평 좋아요 중복 생성 동시성 문제

지성인 프로젝트를 개발하면서 한줄평 좋아요 기능에 동시성 문제를 발견했다.일단 한줄평 기능은 특정 도서에 대해 짧게 평가할 수 있는 기능이다.해당 한줄평은 다른 사용자가 좋아요를 누를 수 있다. 문제 상황 현재 사이트에서는 좋아요를 1번 누르면 하트가 표시되고 다시 누르면 좋아요가 해제된다.또한 본인의 한줄평에는 좋아요를 할 수 없다. 보기에는 문제가 없어보인다.하지만, 좋아요를 광클해서 같은 요청이 한번에 보내진다면 ?악의적인 사용자가 요청 로직을 알아내서 똑같은 좋아요 요청을 한번에 보낸다면 ?서버에 심각한 에러가 발생할 수 있다. 해당 로직은 발생할 수 있는 문제 상황이다.왜 문제가 발생하는가 ? 임계 영역(Critical Section)에 경쟁 상태(Race Condition)가 발생하기 때문이다..

프로젝트 2024.07.06