-
Notifications
You must be signed in to change notification settings - Fork 1
[TEST] 예약 생성 기능 테스트 #233
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[TEST] 예약 생성 기능 테스트 #233
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
테스트 대상 서비스 로직의 문제점을 찾아 수정까지 해주셨네요,
ExecutorService와 같이 동시성을 포함한 테스트라 상당히 까다로웠을텐데 잘 작성해주신 것 같습니다.
저 또한 동시성과 관련한 테스트를 어떻게 해야하나 싶었는데, 참고하여 공부해보겠습니다.
고생하셨습니다! 👍👍
Jimin730
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
동시성 테스트 부분은 테스트 코드도 아주 복잡하네요..
단순한 테스트 코드만 작성해보았는데 이렇게 복잡한 테스트 코드도 한 번 참고 해 볼 수 있어서 좋았습니다! 고생하셨습니다!
Yunsung-Jo
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
고생하셨습니다! 👍
9179f75 to
73e6ca4
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
윤성님이 말씀하신 것처럼 좌석 자체에 락을 걸면 물리적으로 같은 열차를 사용하는 다른 스케줄에서 같은 좌석 예약 시에 이슈가 있을 것 같습니다.
초반에 그래서 SeatReservation 구조를 고민을 많이 했었는데 다시 원점으로 돌아가네요 ㅠㅠ
모두가 같이 열차 스케줄, 구간을 고려해서 어떻게 동시성 락을 해결할 수 있을지 고민해봐야 할 것 같습니다 ㅠ
고생하셨습니다!! 👍
관련 Issue (필수)
주요 변경 사항 (필수)
테스트를 진행하는 과정에서 로직 오류를 발견하여 아래와 같이 수정하였습니다.
객차 타입 검증 로직 수정
유효하지 않은 좌석에 대한 검증 순서에 문제가 있어, 검증 로직의 흐름을 보다 명확하게 조정하였습니다.
DTO로 전달된 승객 정보 List 복사 처리
record 내부의 List는 불변이 아니기 때문에 정렬 등 가공 시 원본이 변경될 수 있습니다. 데이터 무결성을 위해 new ArrayList<>()로 복사하여 사용하도록 수정했습니다.
운행 순서 검증 로직 추가
기차 스케줄과 일치하지 않는 순서로 예매를 시도하는 경우 적절한 예외를 반환하도록 검증 로직을 추가하였습니다.
리뷰어 참고 사항
테스트 작성 중 동시성 이슈가 발생하여, 이를 해결하기 위해 다양한 락 처리 방식들을 공부하면서 적용하려고 하였습니다.
다만, 트랜잭션이 분리되어 있고 좌석이 아닌 겹치는 구간을 기준으로 락을 걸어야 하는 구조적 특성상, 최적의 방법을 찾기 어려웠습니다.
일단 이중 락 방식으로 일단 동시성 문제를 해결하였고 k6로 400명 테스트에서 기존 코드와 비교하여 성능 차이는 크지 않음을 확인했습니다.
비관적 락이 두 번 발생하다 보니 성능에 영향을 줄 수 있는 여지가 있어, 추후 시간적 여유가 생기면 더 나은 구조와 방법으로 성능 개선을 진행할 예정입니다.
추가 정보
없음
PR 작성 체크리스트 (필수)