본문 바로가기

프로젝트

(5)
게시글 목록 조회 시 좋아요 수를 보여주는 구현 전략 0. 개요이 글은 프로젝트를 진행하며 게시글 목록 조회 시 좋아요 수를 함께 반환해야 하는 상황에서 어떤식으로 구현했는지 기록한 글이다.1. 문제 상황프로젝트에서 게시글 목록 조회 시 좋아요 수를 함께 반환해야 했다. 따라서 게시글과 연관된 좋아요 테이블을 함께 조회하면서 n+1 문제가 발생했다. 즉, 게시글 n개를 조회할 때 실행되는 쿼리는 다음과 같다.post 테이블에 쿼리 1개(post n개 조회)likes 테이블에 쿼리 n개 또한 좋아요 수를 기준으로 정렬 조회할 경우 다음과 같이 JPQL을 작성해줘야 하는데, 게시글 테이블과 좋아요 테이블의 모든 데이터 간 조인, 그룹화, 정렬이 발생한다. 즉, 게시글과 좋아요가 많아질수록 성능이 매우 저하될 것으로 예상된다.2. 해결 방안2-1. 반정규화와 동..
반정규화를 통한 조회 성능 개선 프로젝트에서 게시글 페이징 조회 시 게시글 데이터 뿐만 아니라 게시글의 좋아요, 댓글, 북마크 수를 함께 반환해야 했다. 따라서 게시글과 연관된 좋아요/댓글/북마크 엔티티를 함께 조회하면서 N+1 문제가 발생했다. N+1 문제를 해결한 과정은 다음과 같다.1. 페치 조인가장 대표적인 N+1 문제 해결 방안으로 패치 조인이 있다. 그러나 일대다, 다대다 관계인 컬렉션 페치 조인은 주의할 점이 있다. 바로 offset, limit 등의 키워드를 통한 페이징 처리가 DB에서 이뤄지지 않고, 조인 결과 전체가 메모리로 로드되고 애플리케이션 단에서 페이징 처리가 이뤄진다는 점이다. 그 이유는, 컬렉션 페치 조인 시 데이터 수가 의도치 않게 증가하게 되기 때문이다. 예를 들어, 게시글 1에 좋아요가 2개, 게시글 ..
예약 동시성 제어 과정 0. 개요이 글은 프로젝트에서 진행했던 예약 동시성 제어 과정에 대한 글이다. 문제 상황은 다음과 같다. 한 트레이너는 특정 시간에 하나의 예약만 받을 수 있다. 그러나 여러 회원이 동시에 요청을 보낼 때 2개 이상의 예약이 완료되는 문제가 발생했다. 즉, 동시성 제어가 필요한 상황이다. 예약 로직은 다음과 같다.트레이너 이메일과 예약 시간을 기준으로 예약 내역을 조회한다. (SELECT)조회된 예약이 없으면 새로운 예약을 생성하여 저장한다. (INSERT)동시성 문제 해결 과정은 다음과 같다.1. 자바의 synchronized 키워드예약 로직 메서드에 synchronized 키워드를 붙이는 방법이다.@Service@Transactional@RequiredArgsConstructorpublic class..
반정규화를 통한 성능 향상 개요이 글은 프로젝트에서 진행했던 게시글 페이징 조회시 성능 향상 과정에 대한 글이다.문제 상황게시글 페이징 조회 시 게시글 데이터 뿐만 아니라 게시글의 좋아요, 댓글, 북마크 수까지 함께 반환해야 한다. 따라서 게시글과 연관된 좋아요, 댓글, 북마크 엔티티까지 함께 조회하면서 N+1 문제가 발생했다.  10만 건의 데이터 중 좋아요 수가 많은 100 건을 페이징 조회하는 테스트를 진행했다. 테스트 결과는 다음과 같다.6.7 TPSN+1 문제 발생좋아요 순 조회 시 게시글 테이블을 풀스캔해결 과정1. 페치 조인가장 대표적인 N+1 문제 해결 방안으로 페치 조인이 있다. 그러나 컬렉션 페치 조인은 주의할 점이 있다. 바로 페이징 처리가 offset, limit 등의 키워드를 통해 DB에서 이뤄지지 않고, ..
프로젝트 중 SpringSecurity 필터 체인에서 발생한 예외를 처리한 방법 JwtException 예외 처리 방법SpringSecurity 필터 체인에 JWT를 검증하는 JwtAuthenticationFilter를 두었다. 그리고 JWT가 유효하지 않을 경우, JwtException이 발생한다.방법 1. JwtExceptionFilterJwtAuthenticationFilter 앞단에 JwtException을 처리하는 JwtExceptionFilter를 두었다. 따라서 JwtAuthenticationFilter에서 JwtException가 발생하면 예외가 JwtExceptionFilter로 넘어와서 이 곳에서 예외 응답을 한다.문제점그런데 이 방법에서 의도치 않은 문제가 발생했다. 인증이 필요하지 않은, 즉 JWT가 필요하지 않은 URL 요청의 경우 SpringSecurity의..