Skip to content

[사전숙제] 스레드 동시성 문제 제어#10

Open
jje0ngyu wants to merge 3 commits intohanghae-skillup:mainfrom
jje0ngyu:jje0ngyu
Open

[사전숙제] 스레드 동시성 문제 제어#10
jje0ngyu wants to merge 3 commits intohanghae-skillup:mainfrom
jje0ngyu:jje0ngyu

Conversation

@jje0ngyu
Copy link

@jje0ngyu jje0ngyu commented Jan 4, 2025

제목(title)

주차와 함께 변경 사항을 요약하여 구성해 주세요.

ex: [1주차] 사용자 로그인 기능 구현


작업 내용

이번 PR에서 진행된 주요 변경 사항을 기술해 주세요.

코드 구조, 핵심 로직 등에 대해 설명해 주시면 좋습니다. (이미지 첨부 가능)

ex: ConcurrentOrderService에 동시 주문 요청 처리 기능 추가

  • 아이템 구매 시, ReentrantLock을 이용한 동시성 제어
  • ConcurrentHashMap 을 이용한 사용자별 마지막 구매 이력 저장
  • jUnit5을 이용한 테스트 코드 작성

발생했던 문제와 해결 과정을 남겨 주세요.

ex) 문제 1 - 다수의 사용자가 동시에 같은 리소스를 업데이트할 때 재고 수량이 음수로 내려가는 데이터 불일치 문제 발생

해결 방법 1 - Redis SET 명령어에 NX(Not Exists)와 PX(Expire Time) 옵션을 활용해 락을 설정했습니다. 이유는 ~

  • 문제 1 - 여러 스레드가 동작 후, 최종 재고 수량이 기대치 보다 많은 문제가 발생
  • 해결 방법 1 - "사과"의 재고를 저장하는 클래스에 private final Lock lock = new ReentrantLock(); 를 선언하여 공유자원 제어
  • 문제 2 - 사용자별 마지막 구매 이력 관리 시, 손님 수(스레드 수)와 구매 이력이 일치하지 않는 문제가 발생
  • 해결 방법 2 - 구매 이력을 HashMap으로 관리하려하였으나, 동시성 문제가 발생하여 ConcurrentHashMap 을 이용하여 문제해결

이번 주차에서 고민되었던 지점이나, 어려웠던 점을 알려 주세요.

과제를 해결하며 특히 어려웠던 점이나 고민되었던 지점이 있다면 남겨주세요.

  • 스레드와 테스트코드를 실무에서 다뤄본적이 없고, 스레드에 대한 개념을 출퇴근 때 강의로만 배웠던 것을 실제 문제가 제시된 상태에서 코드를 작성하다보니 어려웠습니다.
  • latestOrderDatabase 를 어떻게 구현해야할 지 고민되었습니다. latestOrderDatabase는 유저별로 독립된 저장소이고 편의상 key 는 ProductName 으로 설정했다는 것이, latestOrderDatabase를 구분하는 기준이 1개 (유저)인지 2개(유저 and ProductName)인지 헷갈렸습니다. 이번에 코드를 작성할 때에는 유저 별로 독립된 저장소인 것에 초점을 두어 hashMap의 key로 유저이름으로 지정하여 '사용자별 마지막 구매 이력'을 저장하였습니다.

리뷰 포인트

리뷰어가 특히 의견을 주었으면 하는 부분이 있다면 작성해 주세요.

ex) Redis 락 설정 부분의 타임아웃 값이 적절한지 의견을 여쭙고 싶습니다.

  • LatestOrderDatabase 를 따로 클래스로 구분하여 관리할 필요가 있을까요? 편의를 위해 별도의 클래스를 추가하였습니다만, latestOrderDatabase에 대한 의도를 제대로 파악하지 못한 것 같아 마음에 걸립니다.

기타 질문

추가로 질문하고 싶은 내용이 있다면 남겨주세요.

ex) 테스트 환경에서 동시성 테스트를 수행하였고, 모든 케이스를 통과했습니다. 추가할 테스트 시나리오가 있을까요?

  • 테스트 코드를 처음 작성해봅니다. 실무에서도 테스트코드를 작성할 때, 실제코드와 동일한 로직을 복사/붙여넣기하여 작성하나요? 더 간결하게 테스트코드를 작성하는 방법은 없을까요?
  • 실무에서는 ThreadLocal이 ReentrantLock 보다 더 선호되나요?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant