Feature B에 Port를 작성하고, Feature A가 이를 통해 Feature B의 Service에 접근하도록 설계한 경우
Feature B의 Port와 Inbound Port
구조
Feature B는 자신의 비즈니스 로직(Service)을 노출하기 위해 Port를 작성합니다.
Feature A는 Feature B의 Port를 통해 필요한 기능을 호출합니다.
이때, Feature B의 Port는 **Feature B 내부(Core)**로 들어오는 요청을 처리하므로, Feature B 입장에서는 Inbound Port로 간주됩니다.
[Feature A] ---> [Feature B's Port (Inbound)] ---> [Feature B's Core Logic]
예시 코드
Feature B의 Inbound Port 정의
Feature B는 자신이 제공하는 비즈니스 기능을 추상화하여 Port로 정의합니다.
// Feature B의 Inbound Port
public interface FeatureBPort {
String performBusinessLogic(String input);
}
Feature B의 Port 구현
Feature B의 Service를 사용하여 Port의 메서드를 구현합니다.
// Feature B의 Port 구현체
@Service
public class FeatureBPortImpl implements FeatureBPort {
private final FeatureBService featureBService;
public FeatureBPortImpl(FeatureBService featureBService) {
this.featureBService = featureBService;
}
@Override
public String performBusinessLogic(String input) {
return featureBService.businessLogic(input);
}
}
// Feature B의 내부 Service
@Service
public class FeatureBService {
public String businessLogic(String input) {
return "Processed: " + input;
}
}
Feature A에서 Feature B의 Port 호출
Feature A는 Feature B의 Port를 주입받아 호출합니다.
3. Feature A 입장에서의 Port의 역할
Feature A 관점
Feature A는 Feature B의 Port를 호출하여 Feature B의 내부(Core) 기능에 접근합니다.
이 Port는 Feature B의 진입점 역할을 하므로, Feature B의 Inbound Port로 간주됩니다.
Feature B 관점
Feature B의 Port는 외부에서 들어오는 요청을 처리하여 자신의 비즈니스 로직(Service)을 호출하는 역할을 합니다.
따라서, 이 Port는 Feature B의 Inbound Port입니다.
4. 장단점
장점
Feature 간 결합도 감소:
Feature A는 Feature B의 Service 구현체가 아닌 Port 인터페이스를 통해 접근하므로, 두 Feature 간 결합도가 낮아집니다.
유연성 증가:
Feature B의 Port를 Mocking하여 Feature A에서 독립적으로 테스트 가능.
Feature B의 응집력 유지:
Feature B의 비즈니스 로직은 Port를 통해서만 접근 가능하므로, Feature B의 응집력을 유지할 수 있습니다.
단점
복잡성 증가:
각 Feature 간 상호작용을 위해 Port와 Adapter를 작성해야 하므로 초기 설계가 복잡해질 수 있습니다.
Feature 간 간접 의존성:
Feature A는 Feature B의 Port 인터페이스에 의존하게 되어, Feature B가 제거되거나 변경될 경우 간접적으로 영향을 받을 수 있습니다.
5. 결론
Feature A에서 Feature B의 Service를 접근하도록 Feature B가 Port를 작성한 경우, 그 Port는 Feature B의 Inbound Port로 간주됩니다.
이 설계는 Feature 간 결합도를 줄이고, Feature B의 비즈니스 로직을 캡슐화하는 데 유용합니다.
다만, Feature 간의 상호작용이 많아질 경우, Port와 Adapter가 많아질 수 있으므로 설계 복잡성을 관리해야 합니다.