[도메인 이벤트]
도메인의 변경이 일어날때 이벤트를 발행시키고 그 이벤트를 구독하는 곳에서 이벤트를 받아 처리한다.
도메인 이벤트를 사용하는 이유
발행-구독 모델을 이용하게 되면 결합도를 낮출 수 있다.
이벤트가 발생되는 곳에서는 이벤트를 발행만 하면 되고 그 이벤트가 발생되고 처리되어야 하는 부분에서 이벤트를 구독받아 이후 로직을 처리하면 되기 때문
도메인 이벤트를 사용하지 않는 경우
public class FooService {
private FooRepository fooRepository;
private BooService booService;
private ZooService zooService;
public void run() {
Foo foo = new Foo();
// codes...
fooRepository.save(foo);
boo.runBooByFoo(foo);
zoo.runZooByFoo(foo);
}
}
public interface BooService {
void runBooByFoo(Foo foo);
}
public interface ZooService {
void runZooByFoo(Foo foo);
}
도메인 이벤트를 사용하는 경우
public class Foo {
public Foo() {
// codes...
// publish event
registerEvent(new FooCreatedEvent(this));
}
}
public class FooService {
private FooRepository fooRepository;
public void run() {
Foo foo = new Foo();
// codes...
fooRepository.save(foo);
}
}
// boo package
public interface FooCreatedEventHandler {
void handle(FooCreatedEvent fooCreatedEvent);
}
// zoo package
public interface FooCreatedEventHandler {
void handle(FooCreatedEvent fooCreatedEvent);
}
이와 같이 FooService 에서 BooService, ZooService 의 의존관계들이 없어져 낮은 결합도, 높은 응집도를 유지 할 수 있다.