해결하려는 분야(Domain)의 핵심 문제와 비즈니스 요구사항을 이해하고,
이를 소프트웨어 모델에 명확히 반영하는 것을 최우선으로 한 소프트웨어 개발 방법론이다.
요구사항을 명확히 이해하고, 정의해야한다.
용어 정의
일관된 용어를 사용하자는 개념이다. 이 언어는 모델링에 사용되고, 코드와 문서에도 반영된다.사용자 이다.사건들 이다. 주로 과거 시제로 기록한다. (e.g. 로그인에 성공함, 상품이 배송됨)명령이다. 주로 API와 대응된다.비즈니스 로직이라고 볼 수 있다. Policy에 의해 다른 Event가 Trigger될 수 있다. ****(e.g. 매월 카드 결제일이 되면 계좌에서 결제대금이 빠져나간다)미결정 사항 이다.데이터 객체의 집합이라고 할 수 있다. (e.g. 주문이라는 agreegate는 배송정보, 결제정보와 같은 Domain Model(Entity)로 이루어져 있다.)디자인 과정 : Event Storming
Command를 붙인다.Actor를 설정한다.디자인 예시

Actor 정의

Domain Event 나열
수강신청 Application에서 생길 수 있는 모든 Event나열
수강신청관련 Event

이 Event를 일으키는 Command 설정.
이 Command는 추후 API가 된다.

External System 표시
Actor 표기

Event Grouping 및 Model, Aggregate 정의

Aggregate는 비즈니스 로직 수행을 위한 데이터 객체의 집합.
여기서는 Course Application, Lecture를 묶어 하나의 Aggregate로 정의할 수 있다.
여기서 Course 자체가 진입점이 되고, Course에 의해 Lecture와 Course Application의 Lifecycle이 결정되기 때문에 Course를 Aggregate Root라고 부를 수 있다.

BoundedContext
Data 정의
크게 User, Course, Lecture, Course Application Model로 나눴고, 각각 담고 있는 정보에 대해 정하기.
User - 기본적으로 이메일, 비밀번호가 존재할 것이고, 닉네임을 추가한다. 또한, 해당 유저가 튜터인지, 학생인지 구분하기 위한 역할 데이터도 존재해야 한다.
Course - 제목과 함께, 설명을 부가적으로 입력할 수 있다고 가정한다. 또한, 우리의 기획에 따라 신청내역과 강의 목록은 함께 조회를 할 수 있어야한다. 이와 별도로, 최대 수강 가능 인원 수 정보를 조회할 수도 있고, 현재 신청 승인된 인원 수도 조회할 수 있도록 데이터를 정의한다.
Lecture 목록CourseApplication (신청내역 ) 목록Lecture - 제목, 그리고 영상에 대한 URL이 존재한다
CourseApplication - 신청한 User 정보, 그리고 어떤 Course 에 신청 했는지가 중요!
UserCourseREST(REpresentational State Transfer) 란?
상태의 전이(State Transfer)를 표현하기 위한 HTTP 아키텍쳐 스타일
여기서 State는 Resource의 State를 의미한다. 이 Resource는 파일, 문서, 데이터 등을 모두 포함한다. 우리는 데이터를 응답해주는 역할을 하고, 이 데이터는 우리가 정의한 Domain Model에 대한 데이터이기 때문에, Resource가 Domain Model을 칭한다고 봐도 무방하다.
Respresentation(표현)이 핵심! HTTP를 사용하기 떄문에 이 프로토콜을 활용해 표현한다.
/models GET : Read 요청이다.. Resource의 정보를 획득하기 위해 사용한다.POST : Create 요청이다. 새로운 Resource를 생성하기 위해 사용한다.PUT : Update 요청이다. Resource에 대한 정보를 수정하기 위해 사용한다. 수정되는 정보를 포함한 모든 Resource의 정보를 포함하여 요청한다.PATCH : Update 요청다. Resource에 대한 정보를 수정하기 위해 사용한다. 수정되는 정보만을 요청한다.DELETE : Delete 요청이다. Resource를 삭제하기 위해 사용한다.OPTIONS : 서버와 클라이언트 사이의 통신 옵션을 확인하기 위해 사용한다. REST에서 표현을 위해 사용하진 않고, HTTP에서 보안 및 효율성을 위해 자동적으로 생성되는 요청이다.REST Style API 디자인 가이드
URI, 즉 Resource의 이름은 명사, 소문자, 복수형을 사용하길 권장한다. /posts 와 같은 식으로 사용한다. /getPosts 이런식으로 동사를 사용하는걸 지양해야한다.
/ 를 통해 Resource 관의 계층 관계를 표현한다. / 는 has 를 의미한다고 볼 수 있다! 예를 들어 특정 포스트에 달린 댓글들을 URI로 표현한다면, /posts/{id}/comments 이렇게 된다.
URI 마지막에 / 를 포함하지 않는다. /posts/ 이런 형태는 지양한다
밑줄 (_)은 사용하지 않아야하고, 가독성을 높이려면 하이픈(-)을 사용한다 -> /posts/{id}/long-comments
특정 Resource 하나를 가져올때에는 URI에 해당 Resource의 Identifier를 포함하여 표현한다. /posts/{id}
Resource 목록의 페이징(Paging), 필터링(Filtering), 정렬(Sorting), 검색(Searching)을 통해 정보를 가져올시, Path Variable을 활용한다. /posts?page=12 , /posts?order=latest
적절한 Status Code를 응답한다.
예시
GET /postsGET /posts/{id}POST /postsPUT /posts/{id}DELETE /posts/{id}GET /posts/{id}/commentsPOST /posts/{id}/commentsPUT /posts/{id}/comments/{id}DELETE /posts/{id}/comments/{id}REST의 규칙을 잘 지킨다. 성숙도 모델
빠른 개발 생산성을 위해 일반적으로 Level2 까지만을 어느정도 준수한다
Command 를 API로 !