클린 코드 ‐ 클래스[Clean Code 11] - thought-corner/Backend-PlayGround GitHub Wiki
팩토리
- 객체가 생성되는 시점을 애플리케이션이 결정할 필요도 생긴다.
// ❌ Bad(구체적인 구현 클래스들을 서비스가 직접 의존하고 있음)
@Service
public class OrderService {
private final NaverPayProcessor naverPayProcessor;
private final KakaoPayProcessor kakaoPayProcessor;
public OrderService(NaverPayProcessor naverPayProcessor, KakaoPayProcessor kakaoPayProcessor) {
this.naverPayProcessor = naverPayProcessor;
this.kakaoPayProcessor = kakaoPayProcessor;
}
public void processOrder(OrderDto orderDto, String payType) {
// 핵심 비즈니스 흐름 도중에 지저분한 생성/분기 로직이 가로막고 있음
PayProcessor processor;
if (payType.equals("NAVER")) {
processor = naverPayProcessor;
} else if (payType.equals("KAKAO")) {
processor = kakaoPayProcessor;
} else {
throw new IllegalArgumentException("지원하지 않는 결제 수단입니다.");
}
// 실제 핵심 비즈니스는 이 한 줄뿐인데, 위쪽의 분기문 때문에 코드가 지저분해짐
processor.pay(orderDto.getAmount());
}
}
// ⭕ Good
public interface PayProcessor {
void pay(BigDecimal amount);
}
@Component
public class NaverPayProcessor implements PayProcessor {
@Override public void pay(BigDecimal amount) { /* 네이버페이 결제 로직 */ }
}
@Component
public class KakaoPayProcessor implements PayProcessor {
@Override public void pay(BigDecimal amount) { /* 카카오페이 결제 로직 */ }
}
의존성 주입
- 의존성 주입은 제어 역전 기법을 의존성 관리에 적용한 메커니즘이다.
- 제어 역전에서는 한 객체가 맡은 보조 책임을 새로운 객체에게 전적으로 떠넘긴다.