PROJECT/항해플러스 Lite 백엔드

1주차 - WIL (Weekly I Learned)

yong_ღ'ᴗ'ღ 2025. 5. 25. 20:10

🧐 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)의 개념을 도입하니, 테스트가 쉬워지고 구조도 더 깔끔하게 유지된다.

🔁 지난 주 목표 회고

[✔] 포인트 컨트롤러 기능 구현 (조회, 충전, 사용, 이력 조회)

[✔] 단위 테스트 및 통합 테스트 작성

[✔] 충전/사용 정책 로직 구현 (음수 금액, 최대 보유 포인트 등)

[✔] 유저별 동시성 제어 구현

[❌] 동시성 제어 방식에 대한 분석 및 보고서 작성