요구 사항
- PATCH
/point/{id}/charge
: 포인트를 충전한다. - PATCH
/point/{id}/use
: 포인트를 사용한다. - GET
/point/{id}
: 포인트를 조회한다. - GET
/point/{id}/histories
: 포인트 내역을 조회한다. - 잔고가 부족할 경우, 포인트 사용은 실패하여야 합니다.
- 동시에 여러 건의 포인트 충전, 이용 요청이 들어올 경우 순차적으로 처리되어야 합니다.
/point
패키지 (디렉토리) 내에PointService
기본 기능 작성/database
패키지의 구현체는 수정하지 않고, 이를 활용해 기능을 구현- 각 기능에 대한 단위 테스트 작성
총 4가지 기본 기능 (포인트 조회, 포인트 충전/사용 내역 조회, 충전, 사용) 을 구현합니다.
- 포인트 충전, 사용에 대한 정책 추가 (잔고 부족, 최대 잔고 등)
- 동시에 여러 요청이 들어오더라도 순서대로 (혹은 한번에 하나의 요청씩만) 제어될 수 있도록 리팩토링
- 동시성 제어에 대한 통합 테스트 작성
- 동시성 제어 방식에 대한 분석 및 보고서 작성 ( README.md )
- Syncronized : 특정 메서드나 블록에 대해 동시 접근을 제한하는 가장 기본적인 방법.
- ReentrantLock: 더 복잡한 잠금 방식을 제공하며, 명시적으로 잠금을 제어할 수 있음. 특히 타임아웃과 인터럽트 기능을 제공.
- ConcurrentHashMap: 동시성 문제를 해결하기 위해 특별히 설계된 데이터 구조로, 병렬성을 지원하며 여러 스레드가 안전하게 사용할 수 있음.
- CompletableFuture : 비동기 작업을 처리하면서, 특정 시점에 모든 작업이 완료되면 결과를 병합하는 방식.