Step02. 심화과제 - #4
Conversation
- 리뷰를 위한 PR 탬플릿 마크다운파일 추가
- 포인트 충전 API 내부 비즈니스 로직 작성 - 포인트 사용 API 내부 비즈니스 로직 작성 - 포인트 조회 API 내부 비즈니스 로직 작성 - 포인트 내역조회 API 내부 비즈니스 로직 작성
- 포인트 충전/사용/조회/내역조회 서비스 로직 UnitTest 케이스작성
- 동일한 사용자가 동시에 포인트충전을 요청할때 정상적으로 처리하도록 테스트케이스 작성.
보고서작성
- 포인트서비스 - 포인트 충전 - 단위테스트 실패케이스 - 포인트서비스 - 포인트 사용 - 단위테스트 실패케이스
- UserPoint에게 충전 객체책임부여 - UserPoint에게 사용 객체책임부여
- 포인트충전량/사용량 으로 값이 잘못저장되는 오해 소지가 있음. - 변경될 포인트잔액 을 저장해야함.
- UserPoint에게 충전/사용 책임을 부여후 코드 개선
- 단순히 '충전성공' 과 같이 애매하게 하지 않고 목적을 구체화시켜서 테스트네이밍 변경 - 객체의 책임을 활용하여 테스트코드 수정
- 락의존성 없어서 단위테스트 실행에 실패하는 문제 해결
# Conflicts: # src/main/java/io/hhplus/tdd/point/service/PointServiceImpl.java # src/test/java/io/hhplus/tdd/point/charge/ChargePointUnitTest.java
|
[1-2주차 과제 코멘트]
|
커밋 링크
리뷰 포인트(질문)
하나의 테스트파일에서 통합테스트를 했을때는 발견하지 못했지만, 여러개의 통합테스트들을 한꺼번에 테스트를 했을 경우에는 아래와 같이 포인트내역 조회테스트에서 실패가 됐습니다.
로그를 확인해보니, 응답바디에 id =1 인 유저포인트에 대한 포인트내역이 앞에서 진행한 통합테스트의 데이터가 쌓여있기 때문입니다.
현재에는 DB가없이 다시 로딩을해서라도 데이터를 지워나갔습니다. DB의 경우에는 디스크에 저장되어있을텐데요. 더나아가서 만일 DB까지 붙이게된다면, 테스트가 완료되면 테스트데이터를 지우게될텐데요. 보통 afterEach를 사용해서 truncate를 쓰는편인가요? 아니면 다른 방법도 있을까요?
저의 경우에는 API 엔드포인트를 호출해서 (코드1)처럼 동시성제어 테스트코드를 작성했습니다.
(코드1)
준규님과 학습메이트 예진님과 같이 제 코드를 화면공유하게 됐는데요. "락을 이용한 동시성 제어는 서비스 통합테스트 라고 생각한다" 라는 의견을 들었습니다.
제가 생각한 컨트롤러에서 테스트는
다시 생각해보니까 충전서비스에서도 래포지토리와 락관리자라는 서비스외의 대상이 있기 때문에
포인트충전을 담당하는 charge 서비스 메서드를 호출목적으로한다면 통합테스트라는 것을 확인하여 코드를 하나더 만들었습니다.
(코드2)
동시성제어를 할때는 서비스에 대한 통합테스트를 작성하는게 정답인가요?
반면에 동시성제어할때 컨트롤러로 호출하는 통합테스트는 오답인가요?
코치님을 비롯한 리뷰어들은 락을 활용한 통합테스트는 어떻게 생각하시나요? 이 PR을 보고 있는 독자님들의 솔직한 생각이 궁금하며 날카로운 지적을 해주셨으면 좋겠습니다.
synchronized 예약어가 붙어있는 경우는 동시요청 처리를 할때 1개의 처리가 다할때까지 다른 스레드는 대기를 해야되고
반면에 ReentrantLock의 경우에는 synchronized의 단점인 다른 스레드들은 무한대기를 하지 않도록, 공정성부여 등을 synchronized보다 더 많은 옵션을 갖는걸로 학습하면서 알게됐습니다.
멘토링시간때 말씀하신 synchronized와 reentrantLock의 처리방식 차이에 대한 테스트를 작성을 시도해봤으나
실행했을때 두개의 방법 모두 테스트에 통과가 되었고, 실행시간도 약 1초~2초 정도 ReentrantLock이 상대적으로 실행속도가 빠르다는 결과를 도출했는데요. 그러나 synchronized 방식이 공유데이터에 1개의 스레드만 접근이 가능하다는 걸 입증하는 테스트로 나타냈다고 확답을 드리기가 어려울거같습니다. 그래도 여러고민끝에 케이스를 공유드립니다.
다만 특정스레드에게 Thread.sleep(1000) 으로 1초를 sleep시켜준다면 syncrhonized가 reentrantlock보다 14초 가량 더 느렸습니다.
이번주 KPT 회고
Keep
Problem
Try