본문 바로가기

backend12

빈번한 북마크 update요청을 방지하기 위한 사용자별 스레드 관리 1. 문제상황 북마크라는 기능 자체가 누를 때마다 실시간성으로 변화되는 로직이다 보니, 일반적으로 사용자가 북마크를 클릭할 때마다 update 요청이 발생한다. 때문에, (북마크 -> 북마크 해제 -> 북마크 -> .... ) 누를 때마다 불필요한 update 요청이 발생할 것이라 판단하였다. (나도 언젠가 한번쯤은 이런 거 막 눌러봤던 거 같아서... 이런 생각을 가지게 된 것 같다..ㅎ) 그래서, 불필요한 update 요청을 줄이고자 몇 가지 방식을 생각해 봤다. [방식 1] 사용자의 북마크 상태를 캐시 데이터로써 관리하고, 빠른 응답으로 실시간 업데이트를 제공한다. (X) 어쨌든 cache에도 당연히 update가 발생하기 때문에, 근본적인 원인을 해결하는 처리방식은 아니라고 판단했다. [방식 2].. 2023. 9. 13.
무한 스크롤 구현 및 성능개선 (Pagination) 무한 스크롤 적용 계기 현재 한 달 동안의 2차 프로젝트를 진행 중이다. 우리 팀이 선정한 주제는 Bmart 이다. 실제 프로덕트를 분석/설계하고, 개발하는 과정에서 사용해보고 싶은 기술을 적용하며 최적화하는 재미가 있다. Bmart에서 카테고리별 상품을 조회하는 과정에서, 각 정렬기준별로 조회하는 기능이 있다. 무작정 Pagination부터 구현을 시작하여 점진적으로 성능을 개선해 보고자 이 글을 작성하게 되었다. 페이지네이션 사용 우선, 해당 글에서는 두 가지 방식으로 무한 스크롤을 적용해 볼 것이다. JPA Pagination을 사용하여 page number와 page size를 이용하기 JPA Pagination을 이용하되 약간의 성능개선을 위해 page number는 0으로 고정하기 두 방식 모.. 2023. 9. 13.
Fetch join과 Paging JPQL에서 fetch join을 사용한다는 것은 아래와 같이 번역되는 것이다. SELECT c FROM Comment c JOIN FETCH c.post p SELECT c, p FROM comment c JOIN post p on c.post_id = p.id; 위와 같이 fetch join을 사용한다는 것은 한 번에 두 객체를 동시에 조회한다는 뜻이다. 즉, EAGER/LAZY 다 상관없이 N+1 상황이 발생하지 않기에 fetch join을 주로 사용하는 것이기도 하다. 근데, 페이징을 구현하면서 fetch join을 함께 사용하면 꼭 문제가 발생하곤 한다. 그래서 이번에는 fetch join과 Pageable 인터페이스를 함께 사용할 때, 어떤 문제가 발생 가능한지 상황별로 알아볼 생각이다. On.. 2023. 8. 14.
[Spring] 스프링의 DI를 이용한 전략패턴 도입 프로젝트를 진행하다 보니, 여러 가지 상황을 겪게 된다. 이번에 경험한 것은 제목과 같이 프로젝트에 "전략패턴"을 구현함으로써 유연성을 향상시킬 수 있었던 이야기다. 상황은 아래와 같다. 문제 A: 그냥 읽기만 하면 되는 문제 문제 B: 객관식 위와 같이 두 문제가 있고, 각 문제의 유형은 다르다. 또한 각 문제마다 채점 방식이 다른데, 채점 방식은 아래와 같다. - 문제 A는 읽기만 하고 [제출]을 누르면 Solve 처리가 된다. - 문제 B는 읽고, 정확하게 번호를 고른 후 [제출]을 눌러야 Solve 처리가 된다. 이러한 상황에서 전략 패턴을 도입하기 전과 후 어떤 차이가 있고, 어떤 식으로 Spring에서 전략패턴을 구현할 수 있는지에 대해 정리해보고자 한다. 전략패턴이란? 알고리즘군을 정의하고 .. 2023. 6. 8.