개발/항해99

항해 플러스 백엔드 (1주차 WIL)

IamBD 2024. 9. 28. 17:11

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' 카테고리의 다른 글

항해 플러스 백엔드 (3주차 WIL)  (0) 2024.10.12
항해 플러스 백엔드 (2주차 WIL)  (2) 2024.10.09