deVlog

[항해 플러스 백엔드 6기] 1주차 회고 - 동시성 너 생각보다 쉽지 않구나? 본문

Study/항해플러스 백엔드 6기

[항해 플러스 백엔드 6기] 1주차 회고 - 동시성 너 생각보다 쉽지 않구나?

은루밍 2024. 9. 28. 17:08

목차

     

    😂 동시성을 처음 접하면서

    이번 1주차 과제는 테스트 코드를 작성하면서 동시성 문제를 자바 코드로 해결하는 것을 목표로 한 과제였다.

    1주차부터 동시성 이슈를 다루게 되어 당황스러웠지만, 지난 일주일을 돌이켜보면 좋은 학습 시간이었던 것 같다.. (힘들긴 했음)

     

    과제에 대한 상세는 아래와 같다.

    더보기

    Default

    • /point 패키지 (디렉토리) 내에 PointService 기본 기능 작성
    • /database 패키지의 구현체는 수정하지 않고, 이를 활용해 기능을 구현
    • 각 기능에 대한 단위 테스트 작성

    총 4가지 기본 기능 (포인트 조회, 포인트 충전/사용 내역 조회, 충전, 사용) 을 구현합니다.

     

    Step 1

    • 포인트 충전, 사용에 대한 정책 추가 (잔고 부족, 최대 잔고 등)
      • 동시에 여러 요청이 들어오더라도 순서대로 (혹은 한번에 하나의 요청씩만) 제어될 수 있도록 리팩토링
    • 동시성 제어에 대한 통합 테스트 작성

    Step 2

    • 동시성 제어 방식에 대한 분석 및 보고서 작성하기

    모든 기능에 대해 테스트 코드를 작성하며 동시성 제어에 대해 통합 테스트까지 작성했어야 했다.

    부끄럽지만 동시성 제어는 DB 락으로만 살짝 해보고 자바 코드 레벨해서 처리하는 것은 처음이여서 많이 헤맸던 것 같다...

    보고서까지 작성했어야 했기 때문에 더욱 힘이 들었던 것 같다. 그래도 이번에 동시성 제어에 대해 깊이 알아볼 수 있는 기회가 되었던 것 같아서 나름 만족하고 있다ㅎㅎ

     

     

     

     

    ⁉️ 동시성은 순서를 보장해야 할까? 

    과제를 진행하면서 겪었던 가장 큰 기술적 문제는 동일한 유저에 대해 포인트 충전/사용 요청이 동시에 들어올 때, 이를 어떻게 처리해야 할지였다. 특히, 요청의 순서를 보장해야 하는지에 대한 고민이 컸다. 멘토링 시간에 받은 조언 덕분에 이를 해결하는 실마리를 찾을 수 있었다.

     

    코치님께서는 보통 동시성 문제라는 건 여러 스레드나 프로세스가 동시에 같은 자원에 접근할 때 발생하고, 여기서 중요한 건 자원의 일관성을 유지하는 것이지 요청 순서는 일반적으로 보장되지 않는다고 하셨다. 즉, 동시성 문제에서는 각 작업이 서로 간섭하지 않도록 하는 게 핵심인 것이다.

     

    다만, 수강신청이나 티켓팅 같은 서비스는 요청 순서가 중요하다. 이런 경우에는 단순히 동시성 문제를 해결하는 걸 넘어서, 순서 보장을 위한 추가적인 방법이 필요하다. 예를 들어, 요청을 큐에 넣어서 순차적으로 처리하거나, 타임스탬프를 기반으로 요청을 정렬하는 방법도 있을 수 있다. 결론적으로, 일반적인 동시성 문제는 순서를 고려하지 않지만, 순서가 중요한 서비스라면 그에 맞는 별도의 처리 방식이 필요하다. 상황에 따라 해결책이 달라진다고 보면 된다.

     

     

     

    자바에서 동시성을 제어하려면..?

    동시성 제어를 위해 synchronized, ConcurrentHashMap, ReentrantLock 등을 비교하며 분석했고, 요구 사항에 가장 적합한 방법을 찾기 위해 노력했다. 각각의 방법이 어떻게 동작하는지 이해하려 했고, 특히 ReentrantLock이 공정성 보장에서 우수하다는 점에서 깊이 있게 학습했다.

     

    나는 아래와 같은 테스트 시나리오를 작성했다.

    테스트 시나리오

    • 동일한 사용자에 대해 포인트 충전 10건이 동시에 요청되면 성공적으로 처리된다.
    • 동일한 사용자에 대해 포인트 사용 10건이 동시에 요청되면 성공적으로 처리된다.
    • 동일한 사용자에 대해 포인트 충전 5건, 사용 5건이 동시에 요청되면 성공적으로 처리된다.
    • 두 명의 사용자에 대해 포인트 충전이 각각 10건씩 동시에 요청되면 모두 성공적으로 처리된다.

     

     

    알게된 것

    • 동시성 문제는 단순한 DB 락이 아니라 자바 코드 레벨에서 제어해야 할 필요가 있다는 점
    • 다양한 동시성 제어 방법들을 직접 비교하며 그 차이점을 이해하는 것이 중요함을 깨달았다.

     

     

    Keep

    이번 주 동안 만족스러웠던 부분은 동시성 제어를 처음 접했음에도 불구하고 적극적으로 여러 방법을 시도해보고, 이를 통해 개념을 깊이 이해하게 된 것이다. 특히 다양한 테스트 시나리오를 통해 동시성 제어의 효과를 직접 확인할 수 있었던 점이 좋았다.

     

     

    Problem

    이번 주차에서는 생각보다 패키지 구조를 잡는데 시간이 너무 오래 걸렸다. 그래서 다른 기능의 완성도가 조금 떨어졌던 것 같다...

    또, 아직 다양한 동시성 제어 방법의 성능 차이에 대해 깊이 있게 파악하지 못한 부분이 아쉬웠다.

     

     

     

     


    할인 코드 입력하시고 20만원 혜택 받으세요!

    항플 추천인 코드 :  KjKuTu