2019-11-24 일요일

DDD에서의 책임🤔

Aropa-Coffee를 구현하다 생각할 거리가 생겼다. 상황은 이렇다.

  1. 고객(Client)이 있다.
  2. 고객은 주문(Order)을 할 수 있다.

단순하게 생각하면 고객이 주문을 하므로 Client Entity에 주문의 책임이 있어야 될 것이니, 이 메시지를 수신하는 order메서드가 있어야 할 것 같다. 그래서 그냥 그대로 구현을 했다.

그런데 생각해보니까 주문을 하라는 메시지는 행위 그 자체다. 그러니까 유스케이스인데, 결국 이 메시지를 수신하는것은 Application이다. 그러면 이에 대한 응답은 바로 그냥 주문을 만드는 것이다. 사실 엄밀히 말하면 주문을 하라가 아니라 주문내역을 만들어라이다. 그러니까 그냥 Application에서 Order를 만들면, 그것이 주문 내역을 만드는 행위니까 이대로 끝내면 될 것 같다.

그런데 문제는 주문의 지불 방법이 외상이면, 외상(Credit)도 만들어야 한다. 그러면 이 책임은 누가 갖는 걸까?

이런 고민들이 있어서 okky에 질문도 올려봤는데 아직까지 답변이 달리진 않았다. 그런데 네이버 지식인에서 답변도 달고 잠깐 이 고민에서 벗어나 다른 일을 하다가 다시 돌아와보니, 생각이 정리되었다!

지금은 이렇게 하기로 결정했다.

  1. 주문내역을 만들어라OrderApplication이 처리한다.
  2. OrderClient가 필수다. ClientOrder를 생성할 책임을 갖는게 맞는 것 같다(어차피 요청온 clientId값을 검증해야되기 때문에 Client Entity를 생성하는게 맞는 것 같다).
  3. 만약 외상이면, Credit을 만들어라는 비즈니스 규칙이다. 이 규칙이 Application에 있으면 안되므로, OrderCredit의 생성을 책임진다. 왜냐하면 결제방법에 대한 정보전문가는 Order이기 때문이다.

이게 최선인지는 모르겠지만, 일단 오늘은 이게 최선인 것 같다. (어차피 정답은 없잖아~~🙄)