프로젝트 (5) 썸네일형 리스트형 Redis를 통한 좋아요 수 동시성 문제 해결 앞서 프로젝트에서 게시글 조회 성능을 위해 반정규화를 적용했다. (반정규화를 통한 조회 성능 개선) 그런데 좋아요 수를 의미하는 likeCount 필드를 추가함으로써 동시성 문제가 발생한다. 예를 들어, 멀티 스레드 환경에서 두 명의 사용자가 동시에 게시글 좋아요 요청 시, 좋아요 수가 0에서 1 그리고 1에서 2로 증가하는 것이 아니라, lost update가 발생하며 0에서 1로 업데이트 될 수 있다. 이에 대한 해결 과정은 다음과 같다.1. 자바 락가장 기본적으로 자바에서 제공하는 synchornized, ReentrantLock과 같은 락이 있다. 그러나 이는 애플리케이션 단의 락이기 때문에 멀티 인스턴스 환경에서는 동시성 제어가 불가하다.2. JPA 낙관적 락JPA가 제공하는 낙관적 락은 엔티티.. 반정규화를 통한 조회 성능 개선 프로젝트에서 게시글 페이징 조회 시 게시글 데이터 뿐만 아니라 게시글의 좋아요, 댓글, 북마크 수를 함께 반환해야 했다. 따라서 게시글과 연관된 좋아요/댓글/북마크 엔티티를 함께 조회하면서 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의.. 이전 1 다음