인프런 커뮤니티 질문&답변
TCC PointService tryReserve 구현 관련 질문입니다.
작성
·
9
·
수정됨
0
안녕하십니까 상용님. 수업 잘 듣고 있습니다.
다름이 아니라 TCC에서 PointService의 tryReserve 구현 시 Point 클래스에 reserve 메서드를 정의 하셨는데 이때
public void reserve(Long reserveAmount) {
long reservableAmount = this.amount - reserveAmount;
if (reservableAmount < reserveAmount) {
throw new RuntimeException("금액이 부족합니다.");
}
reservedAmount+=reserveAmount;
}이렇게 reservableAmount가 reserveAmount를 빼는 것이 아니라
public void reserve(Long reserveAmount) {
long reservableAmount = this.amount - this.reservedAmount;
if (reservableAmount < reserveAmount) {
throw new RuntimeException("금액이 부족합니다.");
}
reservedAmount+=reserveAmount;
}이렇게 reservedAmount를 빼주어야 하지 않나요?
감사합니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 도등어님.
TCC(Try-Confirm/Cancel) 패턴에서의 PointService 구현 시 reserve 메서드에 대해 질문을 주셨군요.
TCC 패턴은 분산 환경에서 트랜잭션을 관리하는 방법 중 하나로, 자원을 임시로 예약한 후 최종적으로 커밋하거나 취소할 수 있게 해주는 방법입니다. 여기서 reserve 메서드의 역할은 특정 금액을 예약 가능한지 확인한 후, 예약 가능한 경우 예약 처리하는 것입니다.
교재에 나와 있는 reserve 메서드의 초기 구현 예시를 보면, reservableAmount 변수를 통해 예약 가능한 금액을 계산하는 데 문제가 있을 수 있음을 지적해 주셨습니다. 말씀하신 대로, 현재 작동 방식은 새로 예약하려는 reserveAmount 만큼의 포인트가 가용한지 확인하기 위함이며, 가용 금액을 this.amount 에서 이미 예약된 this.reservedAmount를 뺀 후 확인하는 것이 일반적인 구현 방법일 것입니다:
public void reserve(Long reserveAmount) {
long reservableAmount = this.amount - this.reservedAmount;
if (reservableAmount < reserveAmount) {
throw new RuntimeException("금액이 부족합니다.");
}
reservedAmount += reserveAmount;
}
위 방법을 적용하면, 사용자 계정의 전체 포인트에서 이미 예약된 포인트를 제외한 실제 가용 포인트를 기준으로 추가 예약이 가능한지를 판별할 수 있습니다.
관련하여 더 자세한 토론이나 다른 예제를 확인하고 싶으시면, 유사한 질문에 대한 답변 링크를 통해 확인하시면 좋습니다:
- TCC 패턴에서의 예약 로직 구현 - TCC 패턴에 대한 구체적인 코드 예제와 설명을 제공합니다.
- 분산 트랜잭션과 포인트 시스템 - 분산 트랜잭션에서 포인트 유저별 문제 해결 방법을 다루고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.




