반려견 돌봄 서비스 4

반려견 돌봄 서비스 (6) - 멀티스레드 환경 공유 자원 예약 동시성 처리 및 데드락 방지

이번에는 예약과 관련된 행위에 대해 동시성 요청이 일어나는 상황에서 데이터 정합성을 지키는 방법을 다뤄보려고 한다. 동시성 문제란?동시성 문제는 여러 트랜잭션이 동시에 하나의 데이터에 접근하거나 수정할 때 발생하는 충돌이다.사용자 A와 B가 동시에 좌석 A1을 예약 시도하는 상황일 때사용자 A와 B가 동시에 재고 1개 남은 상품을 구매 시도할 때이 경우 특별한 처리가 없으면 두 트랜잭션 모두 성공할 수 있고, 그 결과 좌석이 중복 예약되거나 재고가 마이너스가 될 수 있다.(보통 스레드는 1초에 몇 억 ~ 몇십 억 개의 요청을 처리하기 때문에 하나의 요청 결과는 씹힐 가능성이 높음. 그럼 데이터 정합성이 일치하지 않게 됨) 낙관적 락 (Optimistic Lock)충돌이 자주 발생하지 않을 것이라고 낙..

Spring 2025.05.10

반려건 돌봄 서비스 (5) - 중복 제거한 페이징 시 카운트 쿼리에 fetchOne()을 사용해야 하는 이유

돌봄 예약 가능 날짜를 등록한 회원(돌봄사) 중, 현재 예약이 가능한 회원(돌봄사)만 조회하는 로직을 QueryDSL을 사용하여 구현했었다. 이때, DTO로 직접 조회하고 페이징을 적용하면서 중복 제거된 결과를 반환하는 방법에 대해 새로운 사실을 알게 되었다. 보통 JPA에서 카운트 쿼리는 fetchCount()를 사용하여 개수를 조회했었어서, QueryDSL에서도 똑같이 fetchCount()를 사용해서 content 개수를 조회하려고 했다. 그런데 문제가 카운트 쿼리가 중복된 데이터들을 제외한 content 개수를 카운트 쿼리로 날려야 하는데 자꾸 중복 데이터를 포함한 content 개수를 카운트 쿼리로 날리고 있는 상황이 발생했다. 왜 인지하고 찾아보니 중복 제거를 고려할 때는 fetchOne()을..

Spring 2025.03.15

반려견 돌봄 서비스 (2) - DDD(도메인 주도 개발)

회원의 정보(마이페이지)를 조회하는 로직을 구현을 아래처럼 해놓은 상태였었다.(모든 회원의 정보, 반려견을 보유한 회원의 정보(Role이 CUSTOMER인)) 순서대로 컨트롤러, 서비스, 리포지토리이다.        내가 그전에 구현해 놨던 방식이다. 컨트롤러에서 비즈니스 로직이 섞인 모습이다. 결론부터 말하자면 이 방식은 FM 방식이 아니고, 간단한 소규모 프로젝트에서나 사용할만한 가라(야매) 방식이었다. 이것을 어쩌다가 깨우치게 됐는지는 이 책을 읽고 내가 구현한 방식이 잘못됐었음을 알게 되었다.   이 책 안에서 방금 전 나와 같이 컨트롤러 레벨에서나 서비스 레벨에서 비즈니스 로직을 구현을 해도 무방은 하지만, 응용 서비스에 중요한 비즈니스 로직이 노출이 될 수도 있고, 복잡도가 증가해서 나중에 유..

Spring 2024.12.07

반려견 돌봄 서비스 (1) - ERD 작성

스프링 기반 반려견 돌봄 서비스 프로젝트 소개 🐾1. 프로젝트 개요실제로 집에서 현재 반려견을 키우고 있기도 하고, 프로젝트 주제를 선정을 하는 과정에서 나의 실제 일상생활 상황에 대입해서 개발을 하면 재미와 흥미를 갖고 할 수 있을 것 같아 반려견 돌봄 서비스로 주제를 선정하게 되었다.반려견 인구 1,500만 시대에 접어들며, 반려견 돌봄 서비스에 대한 수요가 증가하고 있다.이러한 니즈를 충족시키기 위해 **스프링(Spring)**과 **자바(Java)**를 활용하여 사용자 친화적인 반려견 돌봄 서비스를 개발하기로 했다.이 서비스는 반려견의 케어 기록 관리, 돌봄 일정 예약 등의 기능을 제공하여 사용자와 돌봄사와 상호작용할 수 있는 플랫폼을 목표로 하고 있다. 2. 주요 기능이 서비스는 아래와 같은 ..

Spring 2024.11.26