지난 포스트와 같이 . JSTF 를 사용시 생산성 향상의 결과를 확인 할 수 있다.
각 도메인을 Tree Model을 활용하여 구현하다보니.
도메인간의 연결은 Entity의 연결로 이루어지고, 이는 Global Tree Map 컴포넌트로 해결을 하였으나,
@Service 간의 참조는 자칫 순환 참조의 결과가 나올 수 있으므로,
이를 해결하기 위하여 중재자 패턴을 적용하고, 활용 할 수 있는 내용을 기술한다.
// 중재자 인터페이스
public interface Mediator {
void doSomethingInA();
void doSomethingInB();
}
// 중재자 구현체
@Service
public class MediatorImpl implements Mediator {
private AService aService;
private BService bService;
@Autowired
public void setAService(AService aService) {
this.aService = aService;
}
@Autowired
public void setBService(BService bService) {
this.bService = bService;
}
public void doSomethingInA() {
System.out.println("Doing something in AService");
bService.doSomethingInB();
}
public void doSomethingInB() {
System.out.println("Doing something in BService");
aService.doSomethingInA();
}
}
// AService
@Service
public class AService {
private Mediator mediator;
@Autowired
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public void doSomethingInA() {
System.out.println("Doing something in AService");
mediator.doSomethingInB();
}
}
// BService
@Service
public class BService {
private Mediator mediator;
@Autowired
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public void doSomethingInB() {
System.out.println("Doing something in BService");
mediator.doSomethingInA();
}
}
위의 예제 코드에서 Mediator 인터페이스는 중재자 역할을 정의합니다. MediatorImpl은 Mediator 인터페이스를 구현하고, AService와 BService를 멤버로 가지며 의존성 주입을 받습니다.
AService와 BService는 각각 Mediator를 의존성 주입받아 사용합니다. 순환 참조를 해결하기 위해 중재자(Mediator)를 통해 서로의 메서드를 호출합니다. AService에서 doSomethingInA()를 호출하면 중재자를 통해 BService의 doSomethingInB()가 호출되고, BService에서 doSomethingInB()를 호출하면 중재자를 통해 AService의 doSomethingInA()가 호출됩니다.
이렇게 중재자를 통해 순환 참조를 해결하면 서비스 간의 순환 참조 문제를 완화할 수 있습니다. 중재자 패턴을 통해 각 서비스는 중재자에게 요청을 전달하고 중재자가 적절한 서비스에게 작업을 위임합니다. 이를 통해 순환 참조를 피하면서 서로간의 상호 작용을 구현할 수 있습니다.