[Packy] 선물박스 열기 동시성 문제 해결 2 - Redisson으로 분산락 구현
·
Spring
1. 들어가며 [Packy] 선물박스 열기 동시성 문제 해결 1 - 분산 락을 선택한 이유1. 들어가며 패키에서는 선물박스를 받게 되면 Receiver 테이블에 받은 유저 ID와 선물박스 ID를 저장한다.지금은 하나의 선물박스를 1명만 받을 수 있지만(PRIVATE), 나중에 하나의 선물박스를 여러leeeeeyeon-dev.tistory.com 저번 포스트에서 선물박스 열기 로직에 발생할 수 있는 동시성 문제에 대해 알아보고, 이를 해결할 수 있는 방법에 대해 찾아본 뒤 최종적으로 Redis의 Message Broker 방식을 활용한 분산 락으로 해결하기로 결정하였다. 이번 포스트에서는 Redisson으로 분산 락을 구현하는 과정을 코드와 함께 살펴보자. 2. 의존성 추가Redisson 라이브러리를 bu..
[Packy] 선물박스 열기 동시성 문제 해결 1 - 분산 락을 선택한 이유
·
Spring
1. 들어가며 패키에서는 선물박스를 받게 되면 Receiver 테이블에 받은 유저 ID와 선물박스 ID를 저장한다.지금은 하나의 선물박스를 1명만 받을 수 있지만(PRIVATE), 나중에 하나의 선물박스를 여러 유저가 받을 수 있는 상황(SEMI_PUBLIC, PUBLIC)을 고려하여 다대일로 관계를 설정하였다. 만약 여러 유저가 동시에 선물박스 열기(=선물박스 받기)를 시도할 경우 어떻게 될까? 테스트 코드로 상황을 시뮬레이션 해보자. 2. 선물박스 열기 테스트 코드 작성여러 유저가 동시에 선물박스 열기를 시도하는 상황을 어떻게 구현할 수 있을까? Spring Boot에서는 내장된 서블릿 컨테이너(TomCat)에서 다중 요청을 처리한다.톰캣은 부팅할 때 스레드의 컬렉션인 Thread Pool을 생성유저..
[Packy] 전략 패턴으로 복잡한 if문 리팩토링하기
·
Spring
1. 들어가며패키는 온라인 상으로 선물박스를 만들고 '주고받는' 서비스이다. 패키에서는 선물박스를 접하는 입장에서 유저를 보내는 유저(Sender), 받는 유저(Receiver), 둘 다 아닌 유저(Stranger) 3가지로 구분할 수 있다. 그렇기 때문에 대부분의 기능에 대해 3가지 입장을 모두 고려하여 로직을 설계해야 한다. 그러다보니 하나의 메서드에서 if문이 늘어나고, 이는 한 메서드의 책임이 너무 커지는 문제를 초래하며 가독성도 같이 떨어진다. 이번 포스트에서는 '선물박스 삭제하기' 로직을 대표로 예시를 들어 설명하겠다. 아래는 리팩토링을 진행하기 전 코드이다.if문이 너무 많이 중첩되어 있어 주석 없이 코드를 이해하는데 오랜 시간이 소요된다..public String deleteGiftBox(..
[Packy] 멀티모듈에서 다른 모듈의 Test Fixture 사용하기
·
Spring
1. 문제 상황진행 중인 프로젝트의 테스트 코드의 가독성이 (작성자인 나에게조차...) 가독성이 좋지 않은 것 같아 테스트 코드를 전반적으로 리팩토링하고 있다. 그 중 진행중인 작업 중 하나가 Test Fixture를 클래스로 관리하는 것이다.현재 프로젝트는 각 계층의 의존성을 분리하기 위해 멀티 모듈을 사용하고 있다. Controller와 Service는 api 모듈, Entity와 DAO는 domain 모듈에서 관리하고 있다. 그렇기 때문에 DTO를 반환하는 Fixture 클래스는 api 모듈, 엔티티를 반환하는 Fixture 클래스는 domain 모듈에서 관리하기로 결정하였다. 하지만 아래 사진처럼 api 모듈에서 domain 모듈에 있는 Fixture을 불러올 수 없는 문제가 발생하였다. 2. 문..
[Packy] 멀티 모듈 프로젝트에서 jacoco test report 통합하여 연동하기
·
Spring
1. 들어가며 진행하고 있는 프로젝트는 멀티 모듈로 운영하고 있는데, jacoco 테스트 리포트를 만들면 모듈마다 build 패키지에 리포트가 생성되어 하나로 확인하기 어렵다. Gradle 7.4부터 지원하는 jacoco-report-aggregation 플러그인을 사용하면 여러 모듈에 걸친 테스트 리포트를 하나로 통합하여 관리할 수 있다. 2. rootProject - build.gradle 루트 프로젝트의 build.gradle에 아래와 같이 코드를 추가해준다. 주석으로 위에 jacoco라고 적은 부분이 jacoco 연동을 위해 추가된 코드이다. 이제 모든 하위 모듈에 jacoco 플러그인이 추가되었고, ./gradlew testCodeCoverageReport 명령어로 테스트 리포트를 만들 수 있다..
[Packy] Swagger @ApiResponses를 커스텀 어노테이션으로 대체하기
·
Spring
1. @ApiResponses의 한계 Swagger에서 정상 응답값과 함께 에러 응답값도 명시해주어야 클라이언트 단에서도 에러 응답값에 대한 예외 처리를 할 수 있다. Swagger에서는 기본적으로 아래와 같이 @ApiResponses와 @ApiResponse 어노테이션을 사용할 수 있다. @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "로그인 성공"), @ApiResponse(responseCode = "400", description = "로그인 실패") }) 하지만 @ApiResponses를 사용하며 여러모로 불편함을 느꼈다. 1. responseCode, description을 수작업으로 적어주어야 한다. [Pac..
짱정연
'Spring' 카테고리의 글 목록