Redis SortedSet을 사용한 인기글 구현
·
Data/Redis
많은 커뮤니티가 인기글 서비스를 제공한다.내가 진행하는 프로젝트에서도 당연히 인기글 서비스를 제공하는데, 인기글 서비스를 구현한 방법을 공유한다. 인기글을 구현하는 방법은 되게 다양하게 구현할 수 있다.이때 우리 서비스에서는 하루 단위로 인기글을 인기글을 초기화 한다는 요구 명세가 존재했다. 또한 프로젝트에서 인기글을 계산하는 방식은 조회수, 좋아요, 스터디 지원이 발생했을 때 해당 이벤트에 따라 가중치를 주는 방식으로 인기글 점수를 업데이트 하도록 하였다. 인기글 점수 업데이트 시점1. 조회 발생(어뷰징 제외 실제 조회)2. 좋아요 발생(+)3. 좋아요 취소(-)4. 스터디 지원(+)5. 스터디 지원 취소(-)6. 글 삭제(인기글 목록에 존재하면 삭제) 이외에도 인기글 갱신 방식은 변경될 수 있기에 추..
Redis + Ip 기반 조회 수 어뷰징 방지
·
Data/Redis
프로젝트를 진행하며 조회 수 어뷰징 방지 기능을 개발한 경험을 공유하고자 한다. 배경현재 내 프로젝트에서는 특정 게시글을 조회할 때 발생하는 조회 수를 사용하여 인기글을 구현하고 있다. 따라서 조회 수 어뷰징은 큰 문제가 될 수 있다. 때문에 조회 수 어뷰징을 막기 위한 방법을 고민했고 그 결과 IP를 Redis에 특정 시간 동안 저장해두고, 해당 시간 내에 조회 요청이 발생했을 경우 조회수를 업데이트 하지 않는 방식으로 구현했다. 이외에도 많은 조회수 어뷰징 방지 방법이 존재했는데 다음과 같은 이유로 기각하게 되었다.1. 쿠키 : 조회 수 어뷰징 방지 쿠키를 만들고, 이를 통해 검증하는 방식이다. 하지만 이는 어뷰징 방지 하나를 위해 네트워크 전송 시 데이터 크기가 더 커질 수  있으며, 무엇보다 사용..
Jpa 테스트 시 TransactionRequiredException 발생과 해결
·
Data/JPA
배경조회 수 증가 로직을 개발하고 동시성 문제와 성능을 측정하기 위해 멀티 쓰레드 기반으로 테스트를 진행했다.이때 내가 작성한 쿼리를 실행하니 TransactionRequiredException 문제가 발생했고, 이를 해결한 과정을 공유하려고 한다. 먼저 조회 수 증가에서 동시성 문제를 해결하기 위해 다양한 방법이 있지만, 나는 원자성 쿼리를 통한 비관적 락을 사용했다.원자성 쿼리를 사용한 비관적 락 적용 시 낙관적 락과 비교하여 성능 테스트 결과 차이가 없다라는 결론을 얻었기 때문이다. 따라서 이와 같은 원자성 쿼리를 작성했다. 문제 int numberOfThreads = 100; ExecutorService executorService = Executors.newFixedT..
목록 조회 시 페이징 쿼리 최적화를 통한 최소 10배 성능 개선
·
Data/DB
여러 데이터를 목록 조회 시 페이징 쿼리를 작성하여 데이터를 쿼리하는 작업을 진행했다.나의 경우 게시글 목록을 불러오는데, 이때 커버링 인덱스를 활용하여 페이징 쿼리 최적화를 통해 성능을 개선했던 방법에 대해 작성해보려 한다. 배경위와 같이 메인페이지에서 스터디 목록을 조회할 수 있어야 한다.이때 스터디 목록 조회 시 다양한 필터링(카테고리, 진행 방식, 모집 방식, 모집 여부, 좋아요 등)이 있을 수 있으면 가장 최신 순으로 데이터가 보여져야 하는 흔한 페이징 쿼리가 필요했다. 초기 구현 - 단순 페이징 쿼리페이징 쿼리를 작성할 때, 여러 필터 옵션들에 대해 동적으로 쿼리를 생성해야 했다. 이때 여러가지 방법이 있겠지만, 타입 안정성을 보장 받을 수 있는데 QueryDsl을 선택하여 구현했다.방식은 ..
QueryDSL 동적 조회 조건 생성 시 조인 문제
·
Data/JPA
QueryDsl을 활용해서 조회를 구현하던 도중 잘 해결되지 않았던 문제가 있어서 공유를 한다.개요해당 문제가 발생했던 지점은 주문, 결제 서비스에서 전체 주문 또는 전체 결제 조회를 구현하려던 도중 발생하였다.권한Customer(고객) Owner(점주)Admin(관리자)이때 내가 고민한 부분은 주문 전체 조회를 할 때 삭제된 주문에 대한 처리이다.고객은 본인 또는 관리자가 삭제한 주문 내역은 조회할 수 없지만 점주가 삭제한 주문 내역은 고객에게는 동일하게 보여져야 한다.점주는 본인 또는 관리자가 삭제한 주문 내역은 조회할 수 없지만 고객이 삭제한 주문 내역은 점주에게는 동일하게 보여져야 한다.관리자가 삭제한 주문 내역은 아무도 볼 수 없게 된다.위 방식대로 구현하기 위해 내가 만든 QueryDsl 코드..