[Redis] Redis의 다양한 자료구조와 활용 예시 알아보기
·
DB/Redis
0. 들어가기 전이전에 Redis에 대해서 간단하게 정리해봤었습니다.https://ksh-coding.tistory.com/127 [DB] Redis란?여러 프로젝트를 살펴보니, 인메모리 저장소로 Redis를 사용하는 것을 많이 볼 수 있었습니다.Redis가 무엇이고, 어떤 장점이 있길래 많이 사용하는 걸까요?프로젝트에 적용하기 전에 간략하게 Rediksh-coding.tistory.com 해당 글 이후에 여러 기능에서 Redis를 사용했고, 잘 동작하는 것을 확인할 수 있었습니다.그러나, Redis를 사용할 때 추상화된 Spring Data Redis를 사용하면서 어떤 자료구조로 저장되는지,어떤 자료구조가 해당 기능, 데이터에 적합한지, Redis에 어떤 자료 구조들이 존재하는지에 대해 모르고 사용했었..
[JPA] JPA, Spring Data JPA의 내부 동작 원리 알아보기
·
Spring/JPA
0. 들어가기 전이전에 대부분의 프로젝트에서 JPA를 사용해서 SQL을 작성하지 않고추상화된 메소드를 사용하여 영속화 계층에 접근하고, DB에 SQL을 반영했습니다. 이번에 개인적으로 JPA를 사용할 때 내부 동작 원리를 이해하지 않고 추상화된 메소드를 사용하기만 한다는 것을 깨닫게 되었습니다. 따라서, JPA에서 추상화된 메소드들이 어떻게 내부적으로 동작해서 쿼리가 생성되는지 알아보도록 하겠습니다.더 나아가서, Spring Data JPA은 어떻게 JPA를 추상화했는지도 살펴보도록 하겠습니다. 이번 포스팅은 JPA의 기본 개념, 동작들을 이미 안 상태에서 원리를 알아보는 것이므로기본적인 JPA의 개념이나 동작 설명들은 생략하고 가도록 하겠습니다!1. JPA의 기본 동작 원리먼저, JPA가 어떻게 객체와..
[이슈] JPA N+1 문제 해결 및 성능 비교 (feat. Batch Size)
·
이슈 & 트러블 슈팅
0. 들어가기 전현재 진행중인 프로젝트에서 쿼리를 카운트해본 결과, JPA의 N+1 문제가 발생하고 있었습니다. N+1 문제에 대한 소개, 고찰은 이전에 포스팅했었기 때문에 링크만 남기고 넘어가도록 하겠습니다!https://ksh-coding.tistory.com/146 [JPA] JPA N+1 문제 및 근본적인 원인에 대한 개인적인 고찰0. 들어가기 전 JPA를 사용하면서 발생하는 N+1 문제는 널리 알려져 있고, JPA를 사용하다보면 제법 자주 만나게 됩니다. 그래서 N+1 문제를 다룬 블로그나 다른 레퍼런스들이 상당히 많습니다. 저ksh-coding.tistory.com 그래서 이번에는 N+1 문제를 해결한 과정과 전후 성능 비교를 포스팅해보도록 하겠습니다!1. N+1 발생 배경먼저 어떤 엔티티에서..
[이슈] Redis 캐싱을 통해 조회 성능 개선하기
·
이슈 & 트러블 슈팅
0. 들어가기 전현재 프로젝트에서 자주 호출하는 '동선 기간 조회' API의 조회 성능을 높이기 위해 캐싱을 도입하기로 했습니다. 위의 페이지에서 다음과 같이 '동선 기간 조회' API 호출이 발생합니다.달력 페이지에서 동선 기간 조회 1달 간격으로 조회동선 보관함에서 월별 필터로 조회 해당 페이지들은 서비스에서 핵심적인 페이지들로 사용자들이 자주 사용할 것이라고 판단됐기 때문에,해당 페이지에서 호출되는 '동선 기간 조회' API의 조회 성능을 높이기 위해 '캐싱'을 도입했습니다. 이번 포스팅에서는 프로젝트에 캐싱을 적용한 과정을 담아보겠습니다!1. 캐싱이란?일반적인 CS 관점에서의 캐싱은 다음과 같이 말할 수 있습니다.캐시는 CPU와 RAM과 같이 느린 장치와 빠른 장치의 속도 차이로 인한 병목 현상을..
[이슈 & 트러블 슈팅] 동시성 보장하기 (feat. 비관적 락, Redis 분산 락)
·
이슈 & 트러블 슈팅
0. 들어가기 전현재 진행하고 있는 동선을 만드는 프로젝트에서 다음과 같은 요구사항이 존재했습니다.(동선 생성 시 선택한 태그의 태그 선택 횟수가 1씩 증가하는 로직 존재하는 상황)여러 사용자의 동선 생성 동시 요청 시에 태그 선택 횟수가 순차적으로 증가해야 한다. 위의 사진처럼 태그별로 선택 횟수가 표시되었습니다.해당 태그는 사용자들이 동선을 생성할 때 태그를 지정하면 선택 횟수가 1씩 증가하는 로직을 가지고 있습니다. 이러한 상황에서, 여러 사용자가 동시에 요청을 보내게 되면 현재 상황에서는 데이터 정합성이 보장되지 않은 상황이었습니다.멀티 스레드 테스트를 통해 테스트해봤을 때, 다음과 같이 테스트가 실패하는 것을 확인할 수 있었습니다.  그래서 이러한 동시성을 보장하기 위해서 여러 방법들을 생각해보..
[이슈] 사용자의 중복 요청 방지하기(feat. 멱등키, Redis)
·
이슈 & 트러블 슈팅
0. 들어가기 전현재 진행하고 있는 동선을 만드는 프로젝트에서 다음과 같은 요구사항이 존재했습니다.'사용자는 하루에 1개의 동선만 생성할 수 있다.' 처음에 이를 구현하기 위해서는 단순히 DB에서 회원 식별자와 날짜로 데이터가 존재하는지 확인하는 검증 로직을 수행했었습니다.그래서 요청 시에 이미 DB에 멤버가 가진 해당 날짜의 동선이 존재한다면 예외를 발생시키게 구현했습니다. 그러나 구현 이후에 다음과 같은 상황을 떠올려봤습니다.'사용자가 동선을 만들 때 완료 버튼을 여러번 누르면 어떻게 되지?' 동선을 만들 때 위의 완료 버튼을 누르면 동선 추가 API 요청이 보내지도록 설계가 되어있었습니다.이때 일반적인 상황에서 사용자는 완료 버튼을 1번 누르고 기다리겠지만, 다음과 같은 특수한 상황을 예상해봤습니다..
[트러블 슈팅] 멀티 스레드 테스트 시 초기 데이터 오류(feat. 트랜잭션 격리 수준)
·
이슈 & 트러블 슈팅
0. 들어가기 전프로젝트를 진행하다가 멀티 스레드를 통해 동시 요청을 테스트하는 도중에, 초기 데이터를 설정하는 부분에서 문제가 발생했습니다.문제 상황과 원인, 해결 방법을 알아보도록 하겠습니다.1. 문제 상황프로젝트에서 사용자의 중복 요청을 방지하는 로직을 구현해야 했습니다.그래서 중복 요청을 테스트하기 위해 멀티 스레드 테스트를 다음과 같이 작성했습니다.@Test@DisplayName("1명의 사용자가 동선 생성 요청을 여러번 보내는 경우 1번만 성공하고 예외가 발생한다.")@Transactionalvoid throws_multiple_request() throws InterruptedException { ... final ExecutorService executorService ..
테스트 시 @ElementCollection 테이블 동적으로 가져오기(테스트 데이터 초기화)
·
Spring/JPA
0. 들어가기 전프로젝트 개발을 진행하다가, 테스트에서 테스트 초기화가 제대로 수행되지 않아서 테스트가 실패하는 상황이 있었습니다.결과적으로는 @ElementCollection으로 생성되는 테이블이 동적으로 초기화되지 않아서 발생하는 문제였습니다.그래서 이번 포스팅에서 문제 상황과 @ElementCollection 테이블을 동적으로 가져와서 해결한 방법에 대해서 간단히 다뤄보겠습니다!1. 문제 상황프로젝트에서 하나의 기능을 개발하고, 전체 테스트를 실행했을 때테스트에서 테스트 초기화가 제대로 수행되지 않아서 테스트가 실패하는 상황이 있었습니다. 프로젝트의 테스트에서는 E2E 테스트를 진행할 때 RestAssured를 사용하고 있습니다.이때 RestAssured가 통합 테스트를 수행하는 스레드와 @Tran..
[JPA] JPA N+1 문제 및 근본적인 원인에 대한 개인적인 고찰
·
Spring/JPA
0. 들어가기 전JPA를 사용하면서 발생하는 N+1 문제는 널리 알려져 있고, JPA를 사용하다보면 제법 자주 만나게 됩니다.그래서 N+1 문제를 다룬 블로그나 다른 레퍼런스들이 상당히 많습니다.저 또한 N+1 문제를 공부하기 위해 많은 글들을 살펴봤었습니다.하지만, 다른 글들을 읽어보고 더 깊은 N+1 문제에 대한 개인적인 궁금증들이 생겨나고 쉽게 풀리지 않아서이번 포스팅을 작성하면서 테스트를 진행해보고 기록해보고자 합니다. N+1 문제 및 근본적인 원인에 대해 추론하고 해결방법을 알아보면서, N+1 문제에 대해서 고찰해보도록 하겠습니다! 😃(뇌피셜 파티가 될 예정입니다.. 🤣) 예시 엔티티는 가장 간단한 Team-Member 엔티티로 구성하여도메인 이해가 N+1 문제의 이해에 방해되지 않도록 다음..
[MSA] 개인 프로젝트 Monolithic to MSA 전환기 - (10) MSA 전환 후 비교 및 회고 + 마무리
·
아키텍쳐
앞선 챕터까지해서 Monolithic 구조였던 개인 프로젝트를 MSA 구조로 전환해보는 전환기의 기술적인 부분은 마치고, 이번 챕터에서 MSA 전환 후 비교 및 느낀점을 통해 전환기 기록을 마무리하려고 합니다! 🙃🙃 최종적으로 마무리한 제 개인 프로젝트의 MSA Flow는 다음과 같습니다! 😁 Eureka Server에 API Gateway, Config Server를 포함한 모든 마이크로 서비스 등록 후 관리 Config Server에 각 마이크로 서비스의 프로필별 설정 파일 등록 (Github Private Repository에 등록 후 Load) API 요청 시 API Gateway가 라우팅할 마이크로 서비스 판단 후 Eureka Server에 등록된 마이크로 서비스로 요청 마이크로 서비스 간의 통..
BE_성하