DDD Aggregate Root 에 기반한 FSD 의 entities/slice 구성 #20
Replies: 4 comments 9 replies
-
저도 comment,feed를 하나로 합치는게 좋다고 생각해요 |
Beta Was this translation helpful? Give feedback.
-
|
요지는 DB 테이블 기준으로 다만 떠오르는 단점으로는, 추후에 |
Beta Was this translation helpful? Give feedback.
-
|
일단 굉장히 긴 글 잘 읽었습니다 :) 일단 프론트 엔드의 구조를 백엔드의 DDD 의 분할 구조를 따라 가고 싶다고 말씀하시는걸로 이해했는데 맞을까요? @toothlessdev 저는 이의 경계를 나누는 것을 Seperate of Concern 의 기준에서 바라보자면, 백엔드의 먼저 백엔드의 경우에는 변경 싸이클의 생명 주기를 함께하는 요소를 동일 Aggregate 로 묶습니다. 즉, 댓글이 변경된다고 해서, 저희는 기존 게시글에 대한 형태가 변경되지 않습니다. 추후에 반정규화로 게시물에 댓글 수에 대한 것을 처리한다면, 동일 Aggregate 로 볼 수 있지만, 현재는 생명 주기를 함께하는 형태는 아니라고 판단했기 때문에 분리해서 놔두었습니다 프론트엔드의 FSD 의 경우에는 화면이나 사용자 행동 중심의 요소로 Slice 가 되며, 이는 꼭 백엔드의 요소와 맞춰질 필요는 없다고 생각합니다! 또한 댓글에 답글까지 고도화 방향성이 잡혀있는데, 그렇게 된다면, Feed, Comment, CommentReply 요소가 모두 같은 형태에 들어가면, 난해해진않은지도 궁금합니다. 저희의 경우 Aggregate Root 가 추가로 궁금하거나 이상한 부분이 있으면 답글 남겨주세요! |
Beta Was this translation helpful? Give feedback.
-
|
@polyglot-k 님 의견은 이렇게 정리하면 깔끔할 것 같습니다 entities는 DB 스키마/순수 도메인 엔티티 단위로 최대한 얇게 유지하고 즉 add-comment, delete-comment 같은 feature가 여러 entity(feed, comment 등)를 조합해서 상태를 변경하고, 화면/캐시 정합성까지 포함한 흐름을 관리하는 방식으로 이해했습니다 이 방향으로 entities를 DB 스키마 기준으로 진행하는방식으로 하겠습니다 |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
프론트엔드 폴더구조에 대한 컨벤션을 정하면서 Feature Sliced Design 을 도입하고 있습니다
Feature Sliced Design 은 간단히 말해 위와 같은 방식으로 설계를 하는 방식입니다
각 layer는 app < features < entities < shared 로의 단방향 의존관계를 가지고,
layer 내부의 slice 끼리는 참조를 하지 못하는 구조입니다.
여기서 entities 라는 레이어의 slice 를 어떤식으로 나눌지에 대한 고민을 하고 있습니다
이전 프로젝트에서는 entities 안의 slice 들을 RDB 테이블 스키마에 맞게 정의를 해두고 사용하는 방식을 채택했지만,
특정 slice 들이 다른 slice 를 참조하면서
layer 내부의 slice 끼리는 참조를 하지 못하는 구조를 위반하게 되었습니다예를들어 잡만리를 예시로 들자면,
entities 의 slice 를 DB 테이블 스키마에 맞게
entities/feed,entities/comment로 나누는 경우,comment 가 변경되었을때 feed 의 comment_count 가 변경됨에 따라 서로 참조하는 경우가 발생할것이라 예상됩니다
(낙관적업데이트 등의 로직을 포함한다고 가정했을때)
이를 해결하기위해서 DDD 를 조금 공부하다보니, Aggregate Root 라는 개념을 접하게 되었습니다
외부에서 접근 가능한 유일한 진입점이자, 해당 묶음의 생명주기와 상태 일관성을 책임지는 중심 엔티티로 알고 있는데
이 개념을 프론트엔드 관점에서 바라보면,
entities 레이어의 slice는 개별 테이블이 아니라, 함께 변해야 하는 상태의 경계,
Aggregate Root 단위로 나누는 것이 더 자연스럽지 않을까라는 생각으로 이어졌습니다
위의 예시에서 entities/(slice) 를 Aggregate Root 로 나눈다고 가정을 하면,
entities/comment와entities/feed는entities/feed라는 하나의 Aggregate Root (feed) 로 묶이게 되고,자연스럽게 순환참조문제도 해결됩니다
정리해보면, 기존에 사용하던 RDB 테이블 기준의 entities/slice 분리 방식은
프론트엔드에서 다음과 같은 문제를 만들고 있었습니다.
이는 Feature Sliced Design에서 의도한
layer 내부 slice 간 참조 금지규칙을 구조적으로 어기게 되는 결과로 이어졌습니다.반면, entities/slice를 Aggregate Root 단위로 정의할 경우,
현재는 다음과 같은 기준을 하나의 방향성으로 두고 검토 중입니다.
entities/slice는 DB 테이블 기준이 아니라
함께 생성, 변경, 삭제되는 상태의 경계
즉, Aggregate Root 단위로 나눈다
예를 들어,
이렇게 구성할 경우,
등을 하나의 entity slice 내부에서 처리할 수 있게 됩니다
논의하고 싶은 지점
프론트엔드와 백엔드 관점 모두에서의 의견이나 실제 적용 경험을 자유롭게 공유해주시면 감사하겠습니다
Beta Was this translation helpful? Give feedback.
All reactions