쿠폰 중복 사용 버그, 비관적 락 한 줄로 해결하기
·
Loopers 2기
쿠폰 중복 사용 버그, 비관적 락 한 줄로 해결하기문제 상황주문 API를 만들고 테스트하던 중 이상한 현상을 발견했다.동시에 여러 요청이 들어오면 같은 쿠폰이 2번 사용되는 버그가 발생했다.분명히 쿠폰 사용 여부를 체크하는 로직이 있는데, 왜 이런 일이?원인 분석문제는 이랬다.시간 →스레드 A: 쿠폰 조회 (사용 가능!) → 사용 처리스레드 B: 쿠폰 조회 (사용 가능!) → 사용 처리두 스레드가 거의 동시에 조회하면 둘 다 "사용 가능"으로 판단한다. 그리고 둘 다 사용 처리를 해버린다.이게 바로 Lost Update 문제다.해결: 비관적 락해결은 간단했다. 조회할 때 락을 걸면 된다.@Lock(LockModeType.PESSIMISTIC_WRITE)@Query(""" SELECT mc ..
재고 차감, 검증은 몇 번 해야 할까?
·
Loopers 2기
재고 차감, 검증은 몇 번 해야 할까?TL;DR: 주문 생성 시 재고 검증과 차감이 중복·분산돼 혼란스러웠다. 검증을 한 곳에 명확히 두고, 메서드 호출 방식을 통일하는 게 핵심임을 배웠다.문제 발견주문 생성 로직을 구현하다 보니 재고 처리 방식이 어색했다.// Order.create()product.validateStock(quantity) // 검증OrderItem.of(product, quantity)// OrderService.createOrder()order.items.forEach { it.product.decreaseStock(it.quantity) // 차감만}Order 생성 시 검증OrderService에서 차감 → 검증을 두 번? 한 번? 헷갈렸다.Product에 메서드가 3..
Round 2 회고
·
Loopers 2기
회고 요구사항 정리는 한적 있지만상세하게 작성한적도 없고, 다이어그램은 그려본 적이 한번도 없어서 코드 구현보다 어려운 과제였습니다. 1. 좋아요 기능의 멱등성 보장멱등성이 뭐죠? 멱등성이란 동일한 연산을 여러 번 수행해도 결과가 달라지지 않는 성질을 말합니다 그래서 좋아요 기능의 멱등성 보장은 어떻게 하죠? 멱등성이 보장된다는건 뭐지? - 같은 사용자가 같은 게시물에 좋아요를 100번 눌러도, 좋아요는 딱 1개만 저장되어야 한다는 거라고 합니다. 결론: 몇 번을 눌러도 좋아요는 1개만 저장되는 게 멱등성 보장잘못된 경우 (멱등성 X)사용자 A가 게시물 1번에 좋아요 3번 클릭→ DB에 좋아요 3개 저장됨→ 좋아요 개수 3 증가→ ❌ 문제! 올바른 경우 (멱등성 O)사용자 A가 게시물 1번에 ..
Round 1 회고
·
Loopers 2기
Loopers 2기 참여하여 첫주 과제진행 후 배운 점 및 느낌을 정리하고자 합니다. 종합적으로 전반적으로 새로운 아키텍처 구조에서 과제를 구현하며 새로운 테스트 스타일, 예외 처리 등을 배울 수 있는 과제였습니다. 1. 통합테스트, E2E 테스트 (Ent-to-End Test)인프런 강의를 통해 도메인, 서비스, 레포지토리, 컨트롤러 레이어로 레이어 테스트를 학습해봤고, 도메인 레이어의 단위테스트는 타 교육에서 많이 진행해왔기에 익숙했습니다하지만 통합테스트, E2E 테스트라는 이름으로 테스트를 진행한 것은 처음이라 통합테스트, E2E 테스트 작성에 대해서 학습할 수 있었습니다.통합테스트는 Facade 에서 진행하였고, 기존에 하던 Service 테스트와 유사하였습니다.E2E 테스트는 기존의 컨트롤러 ..
colima 에서 testcontainer 사용테스트 시 에러 처리
·
카테고리 없음
⚠️ 문제colima 로 docker 사용 중 testcontainer 설정으로 테스트 시 아래와 같이 에러 🔸 원인Docker 환경을 찾을 수 없다는 에러입니다. Colima와 테스트컨테이너를 함께 사용할 때 자주 발생하는 문제 📌 해결build.gradle 에 아래 4줄을 입력하고 Sync gradle changes 눌러주면 정상적으로 동작한다. environment "DOCKER_HOST", "unix://${System.getProperty("user.home")}/.colima/default/docker.sock" environment "TESTCONTAINERS_RYUK_DISABLED", "true" environment "TESTCONTAINERS_REUSE_ENABLE",..
fork/exec /Users/jihochoi/.docker/cli-plugins/docker-buildx: no such file or directory
·
카테고리 없음
✅ 문제 docker-desktop을 사용하지 못하는 상황에서 colima 로 docker를 사용하면, docker-compose 설치 하고 docker-compose 실행 중에 아래와 같은 명령어로 실행이 안되는 경우 강 있다. fork/exec /Users/jihochoi/.docker/cli-plugins/docker-buildx: no such file or directory ✅ 원인 docker buildx 가 설치되어 있지 않거나, 해당 경로에 실행 파일이 없어서 발생하는 오류이다. ✅ 해결 M3 맥기준 해결책이다.아래 코드를 한 줄 씩 입력하자 # 1. 아키텍처 설정 (Intel Mac: amd64 / Apple Silicon M1, M2: arm64)ARCH=arm64 # 2. bui..
25년 1월 ~ 2월 헤이밥 알고리즘 과외 후기
·
알고리즘
요약: 헤이밥 과외로 브론즈 문제만 많이 풀다가 16주 강의 듣고 골드 3 까지는 도전할만하게 됨- 시작할 때스터디를 하며 브론즈~실버 문제를 많이 풀었지만 스스로 풀지 못하고 있었다그래서 실력이 늘지 못하고 골드 문제에 도전을 하지 못하고 있었다또 주변에 코딩테스트 준비하는 사람도 없다보니물어볼 사람도 없고, 어떻게 체계적으로 공부해야할 지를 몰랐었다개발 회사에 다녀서 개발은 하지만, 알고리즘에 대한 공부는 체계적으로 한 적이 없는 상황이었다- 선택한 이유헤이밥 인프런 강의를 들어봤는데 문제 접근법이나 수학 내용 등을 세밀하게 알려주고 있었다특히 Big-O를 어떻게 계산하는지 내용을 보고 좋다고 생각했다로그 계산 내용을 알려주고 각 문제마다 계산 복잡도를 강의하는 것을 보고 과외를 받아도 좋겠다고 생각..
Dto to Entity, Entity to Dto 변환
·
스프링
# 1. Dto to Entity or Entity to Dto서비스에서 변환처리 ## 서비스에서 변환한 이유우선 Spring Data JPA를 사용하게 되면 Entity를 받아 오므로 싸비스에서 변환해주는게 좋다.비즈니스 처리, 로직 처리 등은 서비스에서 하는게 좋지 않을까 해서 서비스에서 함. # 2. 사용한 변환 방법 포켓 몬스터 너로 정했다 !!! : Builder 패턴 생성자나 대신에 Builder 패턴을 사용한 이유는 유연성, 가독성, 불변성 1. 생성자는 파라미터가 많을 경우 가독성이 좋지 않고, 순서를 정해줘야한다. 2. 값 설정 순서가 상관이 없다. 생성자는 순서가 중요하다3. 생성자는 그때 그때 파라미터 수에 맞게 생성자를 만들어줘야 함 Setter를 사용하지 않은 이유여기..