1주차 WIL
9월 21일 항해 플러스를 시작으로 1주간의 KPT를 정리합니다.
1. 문제 (과제, 프로젝트를 진행하면서 부딪혔던 기술적인 문제)
PointService를 정상 동작하게 구현하는 Default 과제는 어렵지 않게 해결했습니다.
이후 Step1~Step2인 동시성 제어에서 다뤄본 적이 없었기에 어떠한 방법을 사용해야 하는지
전혀 감이 오지 않았습니다.
공개 Q&A 덕분에 ConcurrentHashMap과 Lock에 대한 Keyword를 얻었지만
동시성, 순차성 등 용어의 혼선으로 실패만 되는 테스트 케이스에 부딪혔습니다.
2. 시도
처음엔 UserId와 UserPoint 객체를 가지는 ConcurrentHashMap만을 사용하여 로직을 구현하였습니다.
하지만 이는 순차성을 보장할 순 없었습니다.
병렬적으로 충전 - 충전 - 충전 - 사용 이벤트가 발생했을 때, 순서대로 이루어져야
정상적인 포인트 사용이 이루어지겠지만 ConcurrentHashMap은 이를 보장하지 못했습니다.
3. 해결
생각해보니 코치님의 키워드는 ConcurrentHashMap 하나가 아닌 Lock을 포함한 두 가지였습니다.
Service에서 공유하는 Lock 객체를 선언하고 ConcurrentHashMap에 UserPoint가 아닌 Lock 객체를 넣어
유저별 Chrage나 Use가 발생할 때 Lock을 통해 다른 메서드의 실행을 막아 순차성을 확보하였습니다.
4. 알게된 것
테스트 코드 자체도 어색하지만 "동시성"에 대한 테스트를 어떻게 작성해야 하는지? 에 대한 감을 잡은 것 같습니다.
또한 알고리즘을 학습하면서도 많은 Java API에 대해서 알게되고, 이를 실무에도 많은 적용을 했었는데
이번 ConcurrentHashMap과 Lock 또한 비즈니스 요구사항을 충족하기 위한 추가적인 선택지가 될 수 있을 것 같습니다.
Keep
- 집에 돌아가면 나태해질게 뻔하니 매일 퇴근을 안하고 꾸준히 학습했습니다.
- Fail로 예상되긴 하지만 Step1, Step2 과제 모두 제출했습니다.
- 4년차가 무색하게 과제를 해며 스스로가 매우 작아졌으나 놓지 않았습니다.
Problem
- 회사에서 매일 자정까지의 학습은 10주간을 봤을 때 지칠 것 같습니다.
- 과제의 요구사항을 명확하게 이해하지 못했습니다.
그로인해 불필요한 수정 개발이 발생되었고 결과적으로는 좋지 못한 코드를 제출했습니다.
- 동시성 제어를 위한 Lock 사용시 구현에만 급급했습니다.
- 팀원과의 소통 부재로 피어 리뷰를 진행하지 못했습니다.
Try
- 평일은 시간이 매우 한정적이기에 주말 여가를 일부 포기하고 과제의 80% 이상은 만들고
이 후 시간에는 리팩토링에 집중합니다.
- 요구사항을 "명확히" 이해합니다.
- 조금 더 적극적으로 팀원들과 물음표를 던지고, 다양한 시각에서의 요구사항과 코드를 바라봅니다.
- 과제에 집중하되, 남는 시간이 발생시 휴식이 아닌 사용한 키워드들에 대한 조사와 보고서를 작성합니다.
1주차 주요 학습 Keyword
ConcurrentHashMap
CompletableFutre
ReentrantLock
'개발 > 항해99' 카테고리의 다른 글
[Spring, Redis, Cache] @Cacheable 적용 (1) | 2024.11.07 |
---|---|
[Spring, Redisson] e-커머스 동시성 이슈 분석 및 제어 방법 (0) | 2024.10.30 |
항해 플러스 백엔드 (4주차 WIL) (1) | 2024.10.19 |
항해 플러스 백엔드 (3주차 WIL) (0) | 2024.10.12 |
항해 플러스 백엔드 (2주차 WIL) (3) | 2024.10.09 |