jseop-lim / anam-earth-be-fastapi

Refactor anam-earth backend
0 stars 0 forks source link

[질문] 간선 엔티티가 노드를 보유하는 형태와 간선 레포지토리 #29

Closed jseop-lim closed 1 year ago

jseop-lim commented 1 year ago
  1. 간선 엔티티는 속성으로 노드 엔티티를 가진다. 간선 레포지토리가 간선 엔티티를 반환할 때는 노드의 속성도 모두 함께 DB에서 가져온다.
  2. 간선 엔티티는 속성으로 노드 ID를 가진다. 간선 레포지토리가 간선 엔티티를 반환할 때는 노드의 ID만 DB에서 가져온다. 노드의 속성이 궁금하다면 노드 레포지토리를 사용한다.
jseop-lim commented 1 year ago

관점 1

[Medium] 애그리게잇 하나에 리파지토리 하나

DDD 관점에서, 지도어드민 context의 간선과 노드는 하나의 aggregate에 속한다. 노드를 삭제하면 연관된 간선도 함께 삭제되어야 하기 때문이다. root aggregate는 간선이다. 노드가 간선에 속하기 때문에 간선 엔티티를 통해 노드 엔티티를 조작할 수 있기 때문이다.

관점 2

DDD 관점에서, 지도어드민 context의 간선과 노드는 서로 다른 aggregate에 속한다. 노드를 삭제하면 연관된 간선도 지워지는 것을 제외하면, 노드와 간선은 다른 시점에 다른 이유로 생성된다. 그리고 노드와 간선을 가로지르는 비즈니스 규칙이 없다.

서로 다른 aggregate 간 경계 구분을 위해 간선 엔티티는 노드 엔티티를 ID로 참조하게 만든다.

그럼 노드와 간선의 패키지를 분리해야 하나?

jseop-lim commented 1 year ago

관점 1을 선택한다.

이유

간선은 노드 없이 존재할 수 없다. 또한, 간선과 노드 사이에 비즈니스 규칙이 존재한다. (e.g. 노드 간 간선은 오직 하나)

그에 따른 제약

그리하여 use case에서는 간선 엔티티를 import하여 객체를 생성하고 접근할 수 없으며, 간선 데이터만 따로 edge repository를 통해 영속적으로 저장할 수 없다.