ToyProject (7) 썸네일형 리스트형 [ToyProject] 외부 서비스를 테스트 하는 방법 외부 서비스를 테스트하는 방법에 대해서는 아주 고민이 많았다. 사실 우리가 테스트 코드를 짜는 이유는, 우리가 생성해낸 비즈니스 로직이 본인이 설계한 의도대로 정상적으로 작동하는지, 혹은 예외사항이 발생했을 때 정상적으로 예외가 발생하는지에 대해서 알기 위해서 테스트코드를 짠다. 그렇다면, 외부 서비스는 어떤식으로 테스트 할 것인가? 실제로 교보문고 주문검색 서비스 팀에서 면접을 볼 때, 해당 질문을 받았다. 제가 사용한 라이브러리에서 테스트를 위한 테스트용 토큰을 지원해주기 때문에 테스트를 하기가 수월하며, 테스트용 토큰과 실제 결제에서 발생하는 토큰에는 로직 차이가 없기때문에 문제가 없을 것이다. 라고 대답을 했었다. 결제모듈 서버에 요청해서 받아온 정보와 대조해서 검증하는 실제 비즈니스 로직에서 정.. [ToyProject] 상품 구매 서비스 개선 - 2 - [ToyProject] 상품 구매 서비스 개선 - 1 - (tistory.com) [ToyProject] 상품 구매 서비스 개선 - 1 - [ToyProject] 동시성 문제 해결에 대한 고민 (tistory.com) [ToyProject] 동시성 문제 해결에 대한 고민 현재 프로젝트에서는 동시성 문제를 해결하기 위해 해당 트랜잭션에 비관적 락을 걸어버린다. 비관 2tsumo-hitori.tistory.com 한 가지 문제점이 남아있다. 재고 감소에 대한 동시성 테스트의 속도는 낮추는 것에 성공했지만, 실제 api 요청이 왔을 때 상당히 오랜 시간이 걸리는 것이 문제였다. 사실 이만큼 걸릴만도한게, 하나의 구매 요청에 대한 로그를 추적해보면 12개의 메서드를 거쳐서 하나의 트랜잭션이 수행된다. 구매 요청.. [ToyProject] 상품 구매 서비스 개선 - 1 - [ToyProject] 동시성 문제 해결에 대한 고민 (tistory.com) [ToyProject] 동시성 문제 해결에 대한 고민 현재 프로젝트에서는 동시성 문제를 해결하기 위해 해당 트랜잭션에 비관적 락을 걸어버린다. 비관적 락을 거는 것 까지는 좋다. 복잡한 어플리케이션이 아니고 시간이 오래걸리는 요청, 혹은 t 2tsumo-hitori.tistory.com 동시성 문제 해결, 서비스의 속도를 개선하는 것이 목적이었는데, Redis를 사용하고나서부터 1000개의 동시 결제 테스트 속도가 65% 이상 빨라졌다. 우선, 기존의 동시성 문제에 대한 해결 방법을 비관적 락에서 Redis의 분산 락으로 바꾼 이유에는 두 가지 이유가 있는데, 1. Redis는 디스크 엑세스 없이 캐싱된 메모리를 사용하여 데이.. [ToyProject] 동시성 문제 해결에 대한 고민 현재 프로젝트에서는 동시성 문제를 해결하기 위해 해당 트랜잭션에 비관적 락을 걸어버린다. 비관적 락을 거는 것 까지는 좋다. 복잡한 어플리케이션이 아니고 시간이 오래걸리는 요청, 혹은 tps가 높지 않은 서비스의 경우에는 비관적 락을 걸더라도 크게 성능상의 문제가 없을거라고 생각한다. 그러나 문제가 있다. 해당 프로젝트는 불특정 다수의 동시 접근에 대해 빠르고 문제 없는 서비스를 구현할 수 있도록 진행되고 있기에 비관적 락을 통해 트랜잭션 접근을 막아버리는건 큰 문제가 있다. 예를들어, 100명의 사용자가 상품 구매에 동시적으로 접근한다고 가정해보자. 먼저 한 쓰레드가 락을 획득하게 되면 나머지 99명의 사용자의 요청은 해당 사용자의 요청이 끝날때까지 기다려야하고, 그걸 99번이나 진행하게될것이다.. 위.. [ToyProject] 상품 구매 서비스 리팩토링 @Service @RequiredArgsConstructor public class PaymentAppService { private final IamportClient iamportClient; private final ItemRepository itemRepository; private final OrderService orderService; @Transactional public OrderResponse paymentValidate(PaymentRequest request) { Payment payment = null; try { payment = iamportClient.paymentByImpUid(request.getImpUid()).getResponse(); } catch (IamportRe.. [ToyProject] 상품 구매 시 발생하는 재고 동시성 문제 동시성 문제는 다양한 상황에서 발생할 수 있는데, 해당 문제를 인지하지 않고 개발하게되면 서비스의 규모가 커질수록 감당할 수 없는 문제가 생긴다. 가장 흔한 예시가 계좌이체에 관련된 이슈이다. 현재 10,000원을 가지고있는 A의 계좌에 B와 C가 동시에 10,000원, 20,000원을 입금한다고 가정해보자. 비즈니스 로직 상, 기존 A의 계좌에 있는 데이터를 확인 후에 입금 된 돈을 더하는 방식일 확률이 굉장히 높다. 웹은 대개 멀티 쓰레드 환경이다. 각 요청은 독립적으로 작용하기때문에 각 요청별로 쓰레드가 할당되어서, 로직을 수행한다. 예를 들어보자. B와 C가 동시에 접근하여, A의 계좌를 조회했다. 이 때, A의 계좌에는 B나 C가 입금한 금액이 추가되지 않았다고 가정한다. A의 계좌에 금액이 추.. [ToyProject] PortOne 결제모듈 연동 PortOne이라는 결제모듈을 사용해서 주문/결제 서비스 토이프로젝트를 만들어봤다. 결제 모듈의 흐름은 다음과 같다. 구매자가 구매 요청 -> 결제창 호출 -> 구매자의 카드정보가 카드사 서버로 전송 -> 인증 결과를 1회성 토큰으로 회신받음 -> 백앤드 서버 쪽으로 결제 요청 -> 승인 이런 방식으로 구성이되어있다. 웹에서 호출한 결제모듈에서 결제완료시, 백앤드 API가 호출되면서 서버쪽에 토큰이 생성된다. @ResponseBody @PostMapping("/payment-validate") public PaymentResponse paymentByImpUid( @RequestBody PaymentRequest request ) throws IamportResponseException, IOExcept.. 이전 1 다음