본문 바로가기
회고

[항해99-1주차 회고] TDD 시작하기

by 코동이 2024. 10. 2.

문제

- 이번 주차를 지나며 겪었던 문제가 무엇이었나요?


 이번 주차의 가장 큰 문제는 동시성 제어였습니다. 특히 포인트 충전/사용은 "사용자별"로 동시성 제어가 중요했습니다. 철수와 영희가 각각 포인트를 충전한다면 철수와 영희가 굳이 충전의 행위를 동시성으로 제어할 필요가 없습니다. 철수가 동시에 여러 번 충전하는 경우, 영희가 동시에 여러 번 충전하는 경우에 동시성 제어를 해야 합니다.

 

시도

- 문제를 해결하기 위해 어떤 시도를 하셨나요?


 동시성 문제를 해결하기 위해 락 메커니즘을 떠올렸습니다. 어플리케이션 수준의 락, DB 수준의 락, 혹은 Redis 등의 기타 락 방법이 있습니다. 이번 과제는 DB를 컬렉션을 이용하였기 때문에 어플리케이션 수준의 락을 사용하는 과제라고 생각했습니다. 

 

해결

- 문제를 어떻게 해결하셨나요?


 어플리케이션 수준의 락에서 사용 가능한 방법들을 찾았습니다. synchronized,   ReentrantLock, ConcurrentHashMap와 ReentrantLock을 활용하는 방법까지 순차적으로 개선된 전략들을 활용했습니다.

 

 

알게 된 것

- 문제를 해결하기 위해 시도하며 새롭게 알게 된 것은 무엇인가요?


 synchronized는 간단하게 동시성 제어를 구현할 수 있다고 알고 있었는데 이번 학습을 통하여 구체적으로 어떤 부분이 문제인지 학습했습니다. synchronized보다 개선된 ReentrankLock와 비교하면 바로 확인이 가능한데, 데드락의 위험성공정성 문제입니다. 메서드에 synchronized를 선언하는 것 밖에 하지 못해 락을 획득했을 때 해제 할 수 있는 별도의 방법이 없습니다. 또한 대기하던 쓰레드들 중 랜덤으로 락을 획득하기 때문에 대기가 늦더라도 먼저 락을 얻을 수 있습니다. ReentrankLock은 이 모든 것을 해결할 수 있었고, 한걸음 더 나아가 ConcurrentHashMap을 활용해 사용자 고유 식별자 id를 key값으로, ReentrantLock을 value로 사용하면 사용자별로 동시성을 제어할 수 있습니다.

 

 동시성 주제가 정해지고 각종 강의, 세션, Q&A, 키워드 검색을 통해 다양하게 정보를 습득하기 위해 노력했습니다. 이전에 막연히 알고 있었는데, 이 기술이 어떤 장단점이 있고 따라서 나는 왜 이 기술을 선택했는지 근거를 찾아가는 여정이 뿌듯했습니다.

 

 단위 테스트 강조를 많이 하셨는데, 단위 테스트에 꼭 mock을 써야 하는지 궁금했습니다. 단위 테스트는 내가 구현한 부분이 잘 동작하는지 확인이 필요하므로, 외부의 의존성이 영향을 미치면 안된다는 답변이 있었습니다. 따라서 mock을 잘 활용해 테스트를 활용하는 방향을 잡았습니다.

 

 테스트코드는 안정적인 코드를 짜는게 목표이므로 실패 케이스를 많이 고민해야 합니다. 여러 실패하는 케이스를 고민하다보면 더 안정적인 코드로 발전 할 것이라고 생각합니다. 아직 정해지지 않은 정책이나 정확하지 않던 부분들이 다시 정리되어 훨씬 견고해지며 추가적인 장애 발생을 예방합니다.

 

 

지난 목표 회고

- 지난주에 설정해 두었던 목표는 달성하셨나요? 잘된 것은 무엇이고 안된 것은 무엇인가요?


 주어진 과제에 먼저 todo-list를 세우고 차근차근 해결하며, 기술적 난이도가 있는 구현 부분은 근거를 잘 찾아 정리한 부분이 만족스러웠습니다. 특히 이번 항해 과정은 단순히 과제를 완료하는 것이 목표가 아닌, 더 확장된 요구사항이나 스스로 개선 점을 파악해 보는 등 다양한 고민들이 중요함을 깨닫습니다.

 

 같은 항해 참여 인원들과 소통을 많이 못한 부분이 아쉽습니다. 같은 팀도 그렇고 다른 팀도 그렇고 바쁜 일정이 있다 보니, 과제를 완료하는데 신경을 쏟다 보니, 특정 주제나 자신만의 풀이를 공유하거나 피드백할 수 있는 시간이 적었습니다. 이는 점차 시간이 지날수록 환경에 적응하면 자연스럽게 나아질 것이라고 생각합니다.

 

 

 

다음 목표 설정

- 반복적인 성장을 위한 실천 가능한 단기적인 목표를 설정해 보세요!


 과제는 기본적인 default와 step 2개가 주어집니다. 처음에는 마치 default만 주어진 것처럼 충실하게 구현합니다. 이후 실제로 추가 요청이 들어온다고 가정하고 step에 따라서 개선, 리팩토링 하도록 합니다. 현업과 비슷한 환경을 유지하기 위해 유지보수 작업을 하면서 좋은 설계와 개선을 찬찬히 음미하며 고민해 보도록 합니다.

 

 프로젝트 환경에 따라 다양한 해결책들을 고민하고 나만의 근거로 결과에 도달하는 연습을 해보고 싶습니다.

반응형