도메인이란?
객체와의 차이점은?
왜 도메인 주도 설계가 나왔을까?
객체 지향에서의 핵심은 결국 객체(무언가를 만드는 주체)라고 볼 수 있음
- 이는 객체들을 어떻게 하면 추려낼 수 있을까?
- 어떻게 하면 어떤 객체가 필요한지 알 수 있을까?
- 어떻게 하면 이 객체들이 서로 상호작용할 수 있을까?
—> 이런 문제를 해결할 수 있는 방법이 도메인 주도 설계
→ 도메인의 복잡성을 조금 더 쉽게 다룰 수 있게 도와주는 도구
EX) 옷 쇼핑몰
이러한 도메인들을 추상화하여 모델링하고 서로 상호작용하며 설계하는 것이 바로 도메인 주도 설계
도메인 모델
- 특정 도메인을 개념적으로 표현한 것
- 도메인 모델을 사용하면 여러 관계자 (개발자, 기획자, 사용자 등)이 동일한 모습으로 도메인을 이해할 수 있음.
도메인 주도 설계 아키텍쳐 개요
도메인 모델의 4개의 영역
PRESENTATION LAYER : 표현 영역 또는 UI 영역. 사용자의 요청을 받아 응용 영역에 전달하고, 응용 영역의 처리 결과를 다시 사용자에게 보여주는 역할을 한다. (Controller 영역)
- 요청을 Service에 전달, 결과를 사용자에게 전달
@Getter
@Entity
@NoArgsConstructor
public class Posts {
@Id
@GeneratedValue(strategy = GenerationType.IDENTIFY)
private Long id;
@Column
private String title;
@Column
private String content;
private String author;
public Posts(String title, String content, String author) {
this.title = title;
this.content = content;
this.author = author;
}
}
@Getter
public class PostsVO {
private Long id;
private String title;
private String content;
private String author;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PostsVO postsVO = (PostsVO) o;
return Objects.equals(id, postsVO.id) && Objects.equals(title, postsVO.title) && Objects.equals(content, postsVO.content) && Objects.equals(author, postsVO.author);
}
@Override
public int hashCode() {
return Objects.hash(id, title, content, author);
}
}
@Getter
@NoArgsConstructor
public class PostsSaveRequestDto {
private String title;
private String content;
private String author;
@Builder
public PostsSaveRequestDto(String title, String content, String author) {
this.title = title;
this.content = content;
this.author = author;
}
public Posts toEntity() {
return Posts.builder()
.title(title)
.content(content)
.author(author)
.build();
}
}
EX) DTO와 VO 구분
DTO aDTO = new DTO("a DTO");
DTO ADTO = new DTO("a DTO");
VO aVO = new VO("a vo");
VO AVO = new VO("a vo");
// DTO는 값이 같다고 해서 같은 객체로 볼수 없음.
// VO는 값이 같다면 같은 객체로 볼 수 있음.
Client <-DTO-> controller(web) <-DTO-> service <-DTO-> repository(DAO) <-Entity-> DB
전략적 설계 (개념 설계) 크게
복잡한 도메인의 맥락(Context) 경계를 명확히 정의하는 과정
Bounded Context안의 도메인 모델에서 보편 언어를 개발하는 방법
도메인에서 서브 도메인으로 복잡성을 분리
컨텍스트 맵핑 기술을 활용해 여러 개의 Bounded Context를 통합
이벤트 스토밍 기법을 활용해 Bounded Context 식별
도메인 Context 경계를 명확히 하지 않으면 진흙 덩어리 문제 (계속 추가 되는 문제가 발생)가 발생
전술적 설계 (구체적 설계)
전략적 설계에서 더 상세한 부분(바운디드 컨텍스트 내부) 모델링
Model Driven Design
빌딩 블록(패턴)을 사용해 모델링 - Aggregate 패턴
계층형 아키텍쳐를 통한 도메인 모델 분리
도메인 이벤트를 통해 도메인을 보다 명확히 모델링
도메인 주도설계란
도메인주도설계
https://ppiyo5.tistory.com/21
https://webdevtechblog.com/entity-vo-dto-666bc72614bb
https://velog.io/@gillog/Entity-DTO-VO-%EB%B0%94%EB%A1%9C-%EC%95%8C%EA%B8%B0
https://parkadd.tistory.com/53
https://jordy-torvalds.tistory.com/81
https://wangmin.tistory.com/51
https://coderoom.tistory.com/entry/DB-Entity%EC%99%80-DTO-%EA%B7%B8%EB%A6%AC%EA%B3%A0-VO
https://prinha.tistory.com/entry/DTO-vs-VO-vs-Entity
https://www.youtube.com/watch?v=VIfNipL5KkU