Spring 8

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

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

Spring 2025.05.10

JWT를 어디에 저장해야 좋을까?

개발자 커뮤니티를 둘러보던 와중에 흥미로운 게시글을 발견했다.토큰을 쿠키에 저장하는지 어디에 저장하는 지에 관한 글이었다. 로컬 스토리지와 쿠키에 저장하는 두 방식 중 각각의 특성과 장단점이 있다는 것을 아래의 해당 블로그의 게시글을 보고 쉽게 이해할 수 있었다. 출처: https://velog.io/@0307kwon/JWT는-어디에-저장해야할까-localStorage-vs-cookie JWT는 어디에 저장해야할까? - localStorage vs cookie이번에 지하철 미션을 만들면서 JWT를 클래스 property에 저장했었는데 리뷰어 분께 해당 부분을 피드백 받으면서 어디에 JWT를 저장하는 것이 좋을까 에 대해 고민해보게 되었다. 0. 기본 지식 JWT Jsvelog.io

Spring 2025.03.19

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

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

Spring 2025.03.15

반려견 돌봄 서비스 (4) - 엔티티 간의 연관관계 설계 차이점

반려견의 돌봄 예약이 발생하면 고객 전용 돌봄 예약 엔티티와 돌봄사 전용 돌봄 예약 엔티티에 동일한 데이터가 삽입하게 된다.      현재 나는 고객 시점 돌봄 예약 엔티티(CustomerReservation)과 돌봄사 시점 돌봄 예약 엔티티(SitterSchedule)를 나누어 쓰고 있는 상태이고, 각각 엔티티가 서로 모두 공통적인 필드를 갖고 있는 상태이다. (사진 상에서는 예약한 고객(customer), 돌봄을 하게 될 돌봄사(sitter)를 공통적으로 갖고 있음.)돌봄사 시점 돌봄 예약 엔티티인 SitterSchedule이 고객 시점 돌봄 예약 엔티티(CustomerReservation)에 의존하지 않고, 따로 고객과 돌봄사의 정보를 갖고 있다. 이 상황에서 다르게 할 수 있는 방법이 또 하나 있..

카테고리 없음 2025.02.09

반려견 돌봄 서비스 (3) - DTO 조회 시 쿼리 최적화

개발을 하다가 회원에게 정보를 보여주기 위해서 나는 엔티티를 직접 조회한 후, 해당 조회한 엔티티를 Response 할 DTO로 변환하는 과정을 거쳤었다. 긴 설명보단 사진으로 보여주자면     첫 번째 서비스단 로직이 기존에 사용했던 코드이다. 리포지토리에서 엔티티를 직접 조회한 후 두 번째 사진인 Response DTO로 변환하는 과정을 거쳤었다. 근데 여기서 문제가 있단 걸 발견했다. DTO 클래스의 생성자를 보면 CareAvailableDate를 매개변수로 받아서 사용하고 있는데, 각각 프로퍼티의 값을 CareAvailableDate 객체와 관계 매핑되어 있는 연관관계를 타고 타고 들어가서 값을 가져오는 방식이었다. 이렇게 되면 생기는 문제는   이런 식으로 지연로딩이 걸린 엔티티들의 값을 조회하..

Spring 2025.02.09

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

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

Spring 2024.12.07

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

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

Spring 2024.11.26