0. 이번 주차 과제
하나의 서버에서 동시성을 제어하는 것이 키포인트!
코드 레벨에서 동시성을 어떻게 해결할 것인가?
1. 문제 - 이번 주차를 지나며 겪었던 문제가 무엇이었나요?
1 - 1. Kotlin 문법 미숙
Java, Spring만 사용하다가 Kotlin, Spring으로 개발하려다보니 익숙해지는 시간이 걸렸다.
1 - 2. Service Layer 의 Unit Test를 어떻게 해결하면 좋을까
단위 테스트는 단일 모듈을 테스트하는 것을 말한다.
서비스는 Repository 객체를 의존하기 때문에 Repository 객체를 어떻게 처리하면 좋을지 고민이 되었다.
1 - 3. 동시성
여러 요청을 동시에 처리할 때 race condition이 발생한다.
동시성 문제를 고민해 본적이 없어서 막막했다.
순차적으로 처리되도록 처리하려면 어떻게 해야 좋을지 고민이 되었다.
1 - 4. Pull Request
깃허브의 Pull Request 기능으로 과제를 제출해야 했다.
해당 기능은 이번에 처음 사용하는 것이라 조금 헤맸다.
2. 시도 - 문제를 해결하기 위해 어떤 시도를 하셨나요?
2 - 1. Kotlin을 많이 사용하자
외국어를 공부하는 것은 원래 힘든 일이다.
많이 사용해보고, 듣고, 의식적으로 노력해야 외국어를 습득할 수 있는게 당연하다.
프로그래밍 언어도 마찬가지다.
Kotlin이 익숙치 않으니 계속 코드를 짜보고, 다른 사람들의 코드를 많이 보는 수밖에 없다.
2 - 2. Service class가 interface를 바라보도록 했다.
Service class가 Repository 구현체를 의존하지 않고 interface를 구현하게 했다.
테스트 코드에는 interface를 구현하는 Fake 객체를 주입해줌으로 Service class를 단위 테스트 할 수 있었다.
2 - 3. 동시성
CompletableFuture와 ReentrantLock을 사용하여 동시에 들어온 요청을 순차적으로 처리할 수 있었다.
CompletableFuture는 동시에 요청을 보낼 수 있게 해주는 객체다.
CompletableFuture를 통해 테스트 코드에서 동시에 요청을 보낼 수 있었다.
테스트 코드를 통과시키기 위해 ReentrantLock을 Service class에 도입하였고 순차적으로 처리했다.
3. 알게된 것 - 문제를 해결하기 위해 시도하며 새롭게 알게된 것은 무엇인가요?
단위테스트인지 아닌지 판단하는 간단한 방법은 @SpringBootTest가 있는지 없는지 여부라는 걸 깨달았다.
Spring의 핵심은 IoC 기능이라고 생각한다.
내가 작성한 Service는 @Component가 붙은 Repository를 의존하기 때문에
Spring Container 없이는 동작할 수 없는 것이다.
따라서, Service를 단위 테스트 하기 위해서는 Mock이 되었건, Stub이 되었건 간에 Spring Container가 의존성 주입해주지 않는 부분을 해결해 줘야한다.
Keep - 현재 만족하고 계속 유지할 부분
Kotlin이 익숙치 않고 Pull Request도 어려워 했지만,
일단 시도해본 것에 만족한다.
앞으로 남은 기간 동안 실패를 두려워하지 않고 일단 시도해보자.
Problem - 개선이 필요하다고 생각하는 문제점
또한, PR을 생성하는 방법을 좀 더 고민해야 겠다.
기능별로 브랜치를 나눠서 PR을 생성해봐야 겠다.
Try - 문제점을 해결하기 위해 시도해야 할 것
일단, Best Practice를 분석하는 것이 필요하다.
다른 사람들은 어떻게 문제를 해결했는지 공부를 좀 해야겠다.
https://github.com/Griotold/hhplus-tdd-point-1/pull/2
'항해플러스 백엔드 5기' 카테고리의 다른 글
연말 기부로 마음까지 따뜻하게, 깃허브 잔디 기부 인증 (1) | 2024.12.24 |
---|---|
항해플러스 백엔드 5기 - 시작하는 마음 (0) | 2024.06.15 |