1주차 - WIL (Weekly I Learned)
🧐 1주차 과제 : TDD 기반 포인트 서비스 구현
1. TDD기반으로 controller 및 필요한 코드 작성
2. 각 기능에 대한 단위 테스트 작성
3. 동시성 제어에 대한 통합 테스트 작성
✅ Keep (잘한 점 / 유지할 점)
- 테스트를 먼저 작성하고 실제 구현을 진행하는 TDD 흐름을 최대한 따르며 개발을 진행했다. (Red - Green -Refactor 사이클 기반)
- 단위 테스트에서는 Mock 객체를 활용해 빠르고 명확한 단위 검증을 수행했고, 통합 테스트에서는 실제 구현체로 전체 흐름을 검증했다.
- 예외 상황을 정의해보고, 동시에 여러 요청이 들어오더라도 순서대로 제어될 수 있도록 리팩토링했다.
❗️ Problem (문제점)
- TDD 흐름을 처음 적용하다보니, 테스트 코드를 작성하는 것이 더 어려웠다.
- 도메인 로직이 서비스 클래스에 과도하게 집중되어, 책임 분리가 부족한 구조였다.
- Mock 객체 사용 시 내부 구현 변경에 따라 테스트 코드가 깨지는 문제가 있었다.
- 처음에는 동시성 문제를 고려하지 않아, 실제 테스트에서 예상치 못한 결과(포인트 불일치)가 발생했다.
💡 Try (해결을 위한 시도)
- 도메인 객체 내부에 validateAndCalculateUse(), validateAndCalculateCharge() 메서드를 정의하여 검증 및 계산 책임을 명확히 분리했다. (DDD)
- 테스트에서 발생한 NullPointerException 문제를 해결하기 위해, 사전에 필요한 상태(Mock data) 설정을 더 철저히 수행했다.
- ConcurrentHashMap 기반의 LockManager 클래스를 도입하여 유저별로 동기화 처리하도록 구조를 개선했다.
💬 이번 주 알게 된 것들
- TDD에서의 테스트는 단순한 검증 도구가 아니라 설계 품질을 높이는 중심 도구라는 것을 느꼈다.
- 멀티스레드 환경에서는 반드시 동시성 테스트를 포함시켜야 예기치 못한 오류를 방지할 수 있다는 걸 배웠다.
- 도메인 중심 설계(DDD)의 개념을 도입하니, 테스트가 쉬워지고 구조도 더 깔끔하게 유지된다.
🔁 지난 주 목표 회고
[✔] 포인트 컨트롤러 기능 구현 (조회, 충전, 사용, 이력 조회)
[✔] 단위 테스트 및 통합 테스트 작성
[✔] 충전/사용 정책 로직 구현 (음수 금액, 최대 보유 포인트 등)
[✔] 유저별 동시성 제어 구현
[❌] 동시성 제어 방식에 대한 분석 및 보고서 작성