DDD에 대해 다들 관심만 있고 이론적인 내용을 프로젝트로 적용하는 것은 처음이다보니 우선 DDD의 이론적인 부분에 대해 이야기를 나누었다.
DDD는 Domain-Driven Design으로 도메인 주도 설계를 의미한다.
DDD는 총 4가지 layer로 이루어져 있고, domain, application, presentation, infrastructure이다.
Domain
domain은 나머지 3 layer의 존재를 모르기 때문에 아무것도 의존하고 있지 않고(외부 의존성이 낮음) 오직 순수한 비지니스에만 집중한다. 즉, 낮은 추상화 수준만 가지고 atomic한 로직들이 가지고 있다. 만약 순수하게 로직을 구현할 수 없는 경우는 domain layer에는 인터페이스를 두고 구현체를 infrastructure layer로 분리하는 방법을 선택한다. 그 예 중 하나는 repository이다. repository는 어플리케이션이 어떤 DBMS를 사용하는지, 어떤 ORM을 사용하는지 등 데이터베이스에 대한 정보를 알고 있다. DB에 관한 세부사항은 명백히 도메인 지식과는 관계가 없는 부분이므로, domain layer에는 interface만 작성하고 이에 대한 구현체는 infrastructure layer에서 작성하도록 한다.
Application
application은 domain의 존재만을 알고 있다. 즉, domain에만 의존하고 있다.
나는 application 층은 비지니스로직들을 조합하는 구간이라 생각한다. service를 빗대어 말하기도 한다.
Presentation
presentation은 application의 존재만을 알고 있다. 애플리케이션의 가장 프론트 엔드에 위치하는 레이어로,
-- cilent로부터 request를 받고 response를 return하는 api 정의
-- api route별 로깅, 보안 등의 전처리
의 역할을 한다.
Infrastructure
infrastructure은 domain, application, presentation의 존재를 알고 있다. 존재를 안다는 것은 즉 import를 할 수 있다는 이야기와 동일하다. infrastructure에 의해 나머지 3가지 layer이 잘 구동될 수 있도록 layer들을 통합해서 하나의 어플리케이션으로 serving하는 역할을 한다.
기존의 ottsharing은 MVC 구성으로 되어 있다. 나는 도메인적으로 설계하기 위해 우선 usecase를 만들어서 이를 바탕으로 도메인을 나누려고 한다. 아래 기입된 usecase들은 controller를 기준별로 나누었다.
-로그인하기
-로그아웃하기
-회원가입하기
-내 정보 보기
-내 정보 수정하기
1) 파티생성하기
-리더인지 확인하기
-돈 지불하게 하기
-대기자 명단에서 3명 초대하기
-해당 파티에 4명이 다 모였는지 표시
2) 내 파티정보가져오기
-나의 정보를 통해 가입된 파티객체 가져오기
-가입되지 않고 대기자 명단에 있는지 확인하기
3) 파티에 들어가기
-돈 지불하게 하기
-생성이 오래된 순으로 빈 파티 찾기
-남아있는 파티가 없으면 대기자 명단으로 넣기
-빈 파티에 멤버에 넣고 파티가 다 채워졌는지 체크하기
4) 파티 삭제하기
-해당 파티 일원인지 확인하기
-파티 리더인지 확인하기
-나머지 팀원들에게 환불하기
-파티 삭제하기
5) 파티탈퇴하기
-리더인지 확인하기
-파티 일원인지 확인하기
-환불하기
-빈 파티로 만들기
-탈퇴시키기
6) 파티정보수정하기
-ottId, ottpassword,닉네임 수정하기
-리더인지 아닌지 구별하기
-대기자 명단에서 삭제하기
-충전하기
-인출하기
본래 프로젝트에는 user,파티정보를 가지고 있는 party,대기자 명단이 있는 partywaiting, 파티의 일원들 정보를 가지고 있는 partymember라는 총 4가지의 DB가 있다.
DB와 usecase를 본 결과 총 4가지의 도메인으로 나누기로 했다. sharing이라는 도메인이 이 프로젝트의 주요 기능을 가진 도메인이 될것이며 기존에는 포인트로만 운영되던 것을 따로 payment라는 도메인을 추가하였다. notification 도메인은 도메인간의 이벤트 기능 뿐만 아니라 달마다 사용자가 지불하는 것에 대한 알림설정을 해줄 수 있는 기능을 담고 있는 도메인이다.