미션 후기
미션을 통해 배운 점
- mock을 통한 테스트 코드 활용
- 레거시 코드 리팩터링 경험
- DTO 활용
- 도메인 모델 Entity 작업
- 일급 컬렉션 작업
- DAO > Repository 교체 작업
- Service > domain 책임 리팩터링
- 의존성 리팩터링 경험
- 멀티 모듈 적용 방법
가장 힘들고 많은 고민을 하게 했던 미션이었다
대신 정말 정말 많은 걸 배웠던 미션이다
앞에서 진행했던 미션들을 응용해서 완성시키는 사실상 마지막 단계라고 봐도 무관할 것 같다
이번 미션을 통과하느냐 마느냐에 따라 수료가 결정된다고 할 정도로 어렵다고 미리 얘기를 들었었다
일단 이번 미션에서 테스트 코드의 진정한 쓰임새가 돋보이는 느낌이다
레거시 코드를 리팩터링하면서 코드를 보호하기 위해 mock을 활용한 테스트 코드를 많이 사용하였지만
mock은 최대한 늦게 사용하고, 도메인 단위로 테스트하는 것이 좋은 TDD 방법이라고 한다
지금까지 개발하면서 의존성에 대한 고민을 해본 적이 거의 없다
객체지향적 개발이 아니라 절차지향적 개발을 주로 해왔기 때문에 더 고민할 필요성을 느끼지 못했던 것 같다
절차 지향적으로 개발하게 되면
즉, service 레벨에 핵심 로직을 구현하게 되면 객체끼리 협력관계(OOP)가 없는 상태가 된다
도메인 단위로 책임을 위임하면 메서드의 단위가 작아져 TDD 하기 쉬워지고
또한 DB에 의존하지 않기 때문에 TDD를 작성하기 쉬워진다
모든 미션을 통틀어서 가장 막막하고 힘들었지만 성취감도 그만큼 컸던 미션인 것 같다 :)
리팩터링 팁
객체 참조 설정 규칙
- 함께 생성되고 함께 삭제되는 객체들을 패키지로 함께 묶어라
- 도메인 제약사항을 공유하는 객체들을 패키지로 함께 묶어라
- 가능하면 패키지를 분리해라
의존성 분리 방법
- id를 통해 repository로 가져오도록 하여 연관관계 구현. 의존관계를 삭제
- 중간 처리용 객체를 생성하여 단방향으로 설계
- 인터페이스나 추상화를 통해 단방향으로 처리되도록 설계
- 도메인 이벤트, 이벤트 핸들러 사용
- service를 생성하여 한곳에 모음. 비즈니스 흐름이 한눈에 보이는 절차 지향 코드로 구현
(주객전도가 되지않도록 주의)
의존성 분리 방법 상세
우선 내가 사용했던 방법은
이벤트 핸들러를 사용하는 방식은 현재 구현한 코드와 맞지 않아보여서 배제했고
validator 클래스에서 의존해야하는 service 클래스를 참조하여 처리하는 방식으로 구현했다
Before
After
예를 들어 설명하자면
order validator 클래스에서 menu service(menu repository) 를 의존하도록 하여
order service 에서 menu service에 대한 의존성을 제거하도록 처리했다
멀티 모듈
멀티 모듈 장점
- 최소 의존성을 가지고 독립적으로 수행되기 때문에 재사용성이 높음
- 모듈 별로 빌드가 가능하여 전체 프로젝트를 빌드할 필요가 없음
- 버그 발생 시 해당 모듈만 디버깅
멀티 모듈 단점
- 멀티 모듈을 하나의 JVM으로 띄우기 위한 사전 작업 필요
(설정 파일을 계속 신경 써야함) - 의존성 관리에 신경 써야함
Code / Feedback
🚀 1단계 - 테스트를 통한 코드 보호
https://github.com/next-step/jwp-refactoring/pull/476
🚀 2단계 - 서비스 리팩터링
https://github.com/next-step/jwp-refactoring/pull/488
🚀 3단계 - 의존성 리팩터링
https://github.com/next-step/jwp-refactoring/pull/530
🚀 4단계 - 멀티 모듈 적용
https://github.com/next-step/jwp-refactoring/pull/536
'개발 교육 > 우아한 테크캠프 Pro' 카테고리의 다른 글
9. 우아한 테크캠프 Pro를 마치며 (1) | 2022.07.12 |
---|---|
8. 안정적인 서비스 만들기 (0) | 2022.07.12 |
6. 서비스 진단하기 (0) | 2022.07.12 |
5. 인수 테스트 기반 TDD (0) | 2022.07.11 |
4. 그럴듯한 서비스 만들기 (0) | 2022.07.11 |