목록TIL (105)
이지은님의 블로그
▷ 오늘 배운 것파이널 프로젝트에서 내가 맡은 역할은 장바구니 주문에 이어 결제까지 맡게 되었다. 결제를 어떻게 구현했는지 그 과정을 포스팅해보도록 하겠다. >1. 결제를 하기 위한 플랫폼으로 portone 사용2. 결제 기능 구현하기 1) 결제 연동 준비 - portone 페이지 2) 결제 연동 준비 - 코드 의존성 3) Payment 엔티티 작성 4) 결제 흐름과 API 명세 설계 5) 생성한 주문으로부터 결제 정보를 저장 6) 결제 정보를 토대로 결제 요청 7) 결제 검증 8) 결제 취소3. 보완할 점 1. 결제를 하기 위한 플랫폼으로 portone 사용결제를 구현하기 위한 방법 중에 제대로된 결제 시스템을 구현하려면, 사업자 등록이 필요하다. 하지만 지..
▷ 오늘 배운 것11조 프로젝트에서 저는 주문 시 재고 감소 로직에 대해 동시성 문제를 해결하기 위한 다양한 락(비관적 락, 낙관적 락, 분산락) 전략을 설계 및 구현하였다.실제 JMeter 테스트로 데이터 정합성과 성능을 검증하는 방법으로, 어떤 락이 더 좋은지 의사결정하는 과정을 포스팅 해보았다.https://flaxen-swan-41e.notion.site/5-1e4b649ebbbd80ae8f0fdcf16983bcbc 💬 [5분 브리핑] - 데이터 정합성을 위한 재고 감소의 락 구현 | Notion11조 프로젝트에서 저는 주문 시 재고 감소 로직에 대해 동시성 문제를 해결하기 위한 다양한 락(비관적 락, 낙관적 락, 분산락) 전략을 설계 및 구현하고, 실제 JMeter 부하 테스트로 데이터 정합f..
▷ 오늘 배운 것분산락 구현하면서 발생한 트러블 슈팅에 관해 포스팅해보겠다. >1. 문제상황2. 원인분석3. 해결방법4. 정리 1. 문제상황주문시 재고를 감소하는 기능을 구현하고 분산락으로 재고감소의 동시성 문제를 해결하려고 했다. 이때 Redisson 분산락을 활용하여 동시성 문제를 방지하고 있었고, 다음과 같은 코드를 작성하였다@Transactionalpublic void decreaseStockWithDistributedLock(Long bookId, int quantity) { String lockKey = "bookStockLock:" + bookId; redissonLockClient.runWithLockOrElse(lockKey, () -> { Book book ..
▷ 오늘 배운 것낙관락과 비관락에 이어 분산락 또한 구현하며 낙관락 비관락끼리의 차이점을 비교해보고자 한다. >1. 분산락이란?2. 분산락 구현 방법 1) Redis 2) Redis에서 사용할 수 있는 분산락 클라이언트 3) AOP 기반 vs 함수형 기반 분산락 구현 방식 비교3. 분산락 적용 방법 1) build.gradle 설정 2) RedissonConfig 3) RedisLockClient 4) 분산락 적용 메서드4. 테스트코드로 검증5. 결론 1. 분산락이란?분산된 여러 시스템이 하나의 공유 자원을 안전하게 접근할 수 있도록 보장하는 동기화 기술이다. 예를 들어, 여러 서버가 동시에 한 상품의 재고를 감소시킬 경우, 재고가 0인데도 -1, -2가 되어버리는..
▷ 오늘 배운 것비관락 구현하면서 발생한 트러블 슈팅에 관해 포스팅해보겠다. >1. 문제상황2. 원인 분석3. 해결 방법 1. 문제상황비관락을 구현하고 비관락에 대한 테스트코드를 작성해보았다. 테스트 케이스는 2개의 테스트 멀티스레드를 실행시키는데 둘중 하나는 락 획득을 하고 5초 대기한다. 그리고 다른 스레드는 락이 있는 데이터에 접근하면서 예외를 던지도록 했다. 그런데 이런 에러가 발생한다.org.h2.jdbc.JdbcSQLTimeoutException: Timeout trying to lock table "BOOKS"; SQL statement:could not prepare statement [Table "USERS" not found (this database is empty)] 기존 코드는 ..
▷ 오늘 배운 것이번 프로젝트에서 주문을 하게되면 재고가 감소하도록 구현했다. 여기서 재고 감소는 사용자들이 동시에 재고감소 및 롤백을 하게될 가능성이 있고, 이에 따라 동시성 문제가 발생할 수 있다고 판단했다. 재고 감소와 관해 어떤 의사결정을 하게되었고 어떻게 구현했으며 테스트코드를 작성했는지 포스팅 해보도록 하겠다. >1. 재고 감소 구현과 비관락2. 비관적 락 모드3. 비관적 락 적용 방법 1) 조회시 Repository에 락 모드 설정 2) 서비스 레이어 코드 작성4. 테스트코드로 검증 1) 비관적락 적용 테스트5. 결론 1. 재고 감소 구현과 비관락 구분낙관적 락 (Optimistic Lock)비관적 락 (Pessimistic Lock)충돌 가정충돌이 드물다고 가정충돌이 빈번..
▷ 오늘 배운 것낙관락을 구현하면서 발생한 트러블 슈팅에 관해 포스팅해보겠다. >1. 문제상황2. 원인 분석3. 해결 방법4. 정리 1. 문제상황낙관락 코드를 작성하고 이 낙관락 코드에 대해 테스트코드를 작성해보았다. 테스트 케이스는 2개의 테스트 멀티스레드를 실행시키는데, 둘중 하나는 실패해야 정상이 되도록 하는 코드를 작성했다.락이 제대로 적용이 되면 하나의 락이 데이터베이스 관리 권한을 가지기 때문에 다른 하나는 실패되는게 정상이다. 그러나 2개의 스레드 전부 성공했다고 함은 락이 제대로 적용이되지 않고 동시에 데이터를 변경, 둘다 성공했다고 보기때문에 실패한 케이스가 없다고 출력되는 것이다.assertThat(conflictCount).isEqualTo(1); // 둘 중 하나는 실패해야 정상 ..
▷ 오늘 배운 것이번 프로젝트에서 주문을 하게되면 재고가 감소하도록 구현했다. 여기서 재고 감소는 사용자들이 동시에 재고감소 및 롤백을 하게될 가능성이 있고, 이에 따라 동시성 문제가 발생할 수 있다고 판단했다. 재고 감소와 관해 어떤 의사결정을 하게되었고 어떻게 구현했으며 테스트코드를 작성했는지 포스팅 해보도록 하겠다. >1. 문제 상황 확인2. 해결방법3. 낙관적 락 적용 방법 1) @Version 필드 추가 2) 조회시 Repository에 락 모드 설정 3) 낙관적 락 충돌의 재시도4. 테스트코드로 검증5. 결론 1. 문제 상황 확인주문 시스템에서는 주문 시 재고 감소가 발생하기 때문에, 다수 사용자가 동시에 같은 데이터를 수정하는 일이 발생할 수 있다. 동시 주문이 빈번하게 발..