Spring 29

반려견 돌봄 서비스 (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

반려견 돌봄 서비스 (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

Spring Boot 기존 프로젝트 import시 Lombok 버전 오류 해결

과거 스프링 부트 2.4.4 버전의 프로젝트를 import 하는 과정에서 오류가 발생하게 되었습니다.  이런 오류를 받게 됐는데 이 오류는 맨위 plugins {}에서 id 'java'를 맨 마지막 3번째 줄이 아니라 맨 첫 번째 줄로 올려서 바꿔주면 해결이 됩니다.   하지만 이번엔 다른 오류가 발생했습니다. 이번의 오류는 롬복 추가 시 라이브러리를 import하는 과정에서 나타난 오류인데 Lombok Processor(이름 없는 모듈 @0xc0c3844)는 cannot access class com.sun.tools.javac.processing에 액세스 할 수 없다는 뜻입니다. 이런 이유는 현재 프로젝트 내의 JDK 버전과 Lombok이 호환되지 않는다는 것으로 알아본 결과 해결 방법을 찾게 되었다..

Spring 2024.05.20

웹 스코프와 HTTP 요청에 따른 로그 남기기

공부를 하다가 HTTP 요청마다 로그를 남기는 것을 공부했는데 언젠간 쓸 일이 있을 것 같은 중요한 느낌이 들어 작성하게 되었다. 웹 스코프의 특징웹 환경에서만 동작하는 스코프이다.웹 스코프는 프로토타입과 다르게 스프링이 해당 스코프의 종료시점까지 관리한다. 따라서 종료 메서드가 호출된다. 웹 스코프의 종류request : HTTP 요청 하나가 들어오고 나갈 때까지 유지되는 스코프, 각각의 HTTP 요청마다 별도의 빈 인스턴스가 생성되고, 관리된다.session : HTTP Session과 동일한 생명주기를 가지는 스코프application : 서블릿 컨텍스트(ServletContext)와 동일한 생명주기를 가지는 스코프websocket : 웹 소켓과 동일한 생명주기를 가지는 스코프 바로 request ..

Spring 2024.05.07