클린 코드 ‐ 클래스[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) { /* 카카오페이 결제 로직 */ }
}

의존성 주입

  • 의존성 주입은 제어 역전 기법을 의존성 관리에 적용한 메커니즘이다.
  • 제어 역전에서는 한 객체가 맡은 보조 책임을 새로운 객체에게 전적으로 떠넘긴다.