본문 요약
분류 | DDD 설계 | SQL 중심 설계 |
---|---|---|
개념 | 도메인을 중심으로 설계해 나아가는 방법 | 데이터 중심으로 설계해 나아가는 방법 |
특징 | 1. 도메인의 개념을 먼저 정의하고 구현한다. 2. 각각의 도메인이 철저히 분리돼 변경과 확장에 용이하다. 3. 도메인의 복잡성 해결에 힘쓴다. 4. 개발자와 도메인 전문가의 협업을 통해 커뮤니케이션 문제를 해결한다. |
1. 관계형 데이터베이스의 테이블을 먼저 만들고 엔티티를 설계한다. 2. 도메인 변경 시 RDB의 테이블과 쿼리도 모두 수정해야 한다. 3. 데이터베이스의 효율성과 최적화를 중요시한다. 4. 협업을 고려하지 않은 개발자 위주의 용어 선택으로 커뮤니케이션 문제를 야기할 수 있다. |
차이점 | 1. 도메인 중심의 설계 2. 객체지향적 3. 도메인과 데이터의 느슨한 결합 |
1. 데이터 중심의 설계 2. 객체지향적이지 않음 3. 도메인과 데이터의 강한 결합 |
DDD의 도메인이란?
- 일반적인 요구사항, 소프트웨어로 해결하고자 하는 문제 영역(집합)
- 주로 비즈니스에서 다루는 분야를 뜻한다.
- ex) 결제 도메인
- ex) 회원 도메인
- ex) 검색 도메인
DDD란?
- 도메인 주도 설계(Domain Driven Design, DDD)
- 도메인을 중심으로 설계해 나아가는 것
- 데이터 중심 설계에서 벗어나는 것
- DDD의 주요 요소 3가지
- 유비쿼터스 언어(Ubiquitous Language)
- 개발자도 알고 도메인 전문가(기획자)도 아는 보편적인 언어
- 비즈니스 용어를 하나로 통일한 공통의 언어
- 커뮤니케이션 문제를 없앨 수 있다.
- 전략적 설계(Strategic Design)
- 개념적 설계
- 도메인 이해 관계자끼리 유비쿼터스 언어로 도메인 지식을 공유하고 이해한다.
- 개념과 경계를 식별해 바운디드 컨텍스트(Bounded Context)로 정의한다.
- Bounded Context에 따라 Model의 역할과 책임이 달라진다.
- 문맥에 따라 객체의 역할이 바뀐다.
- 경계의 관계를 컨텍스트 맵(Context Map)으로 정의한다.
- 전술적 설계(Tactical Design)
- 구체적 설계
- 전략적 설계에서 도출된 바운디드 컨텍스트와 도메인을 이용하여 애그리거트 패턴, 엔티티와 값 객체, 레포지토리 등을 구성하고 구현한다.
- 유비쿼터스 언어(Ubiquitous Language)
- DDD의 핵심 목표
- Loose Coupling(느슨한 결합)
- High Cohesion(높은 응집도)
SQL 중심 설계란?
- 데이터 중심 설계
- 데이터를 중심으로 설계해 나아가는 것
- 관계형 데이터베이스 테이블의 구조를 먼저 설계하고, 데이터베이스의 CRUD 작업을 중심으로 시스템을 개발한다.
- 데이터의 저장과 검색을 효율적으로 처리하기 위해 DB를 최적화하는데 초점을 맞춘다.
- 관계형 데이터베이스는 비즈니스 도메인에 수정할 것이 생기면 데이터베이스 테이블과 쿼리도 다시 수정해야 한다.
- 휴먼 에러가 발생할 가능성이 높아진다.
- 비즈니스 도메인과 데이터베이스의 구조가 강하게 결합된 것을 알 수 있다.
- 관계형 데이터베이스에 객체지향을 완벽하게 녹일 수가 없다.
- 관계형 DB는 데이터를 정규화해서 저장하는 걸 목표, 객체는 캡슐화해서 쓰는 걸 목표로 만들어졌기 때문이다.
- 열심히 객체지향스럽게 만든 객체 ➡️ SQL로 변환 ➡️ 객체지향스럽지 않게 RDB에 저장
- 객체를 테이블에 맞춰 모델링하기 때문에 객체지향스럽지 않게 된다. 객체지향스럽게 모델링하면.. 매핑작업이 늘어나 일이 번잡해진다. (SQL 매퍼가 된 개발자 🧟 : 사...살려줘!!)
해결 방안은 없을까?
- 힘들게 만든 객체지향스러운 객체를 객체지향스럽게 DB에 저장하고 싶다면, 관계형 데이터베이스 대신 JPA를 쓰자!!
참고
- https://huisam.tistory.com/entry/DDD
- https://blog.bespinglobal.com/post/domain-driven-design-1%EB%B6%80-strategic-design/
- https://happycloud-lee.tistory.com/94
- https://seokrae.gitbook.io/sr/book/object/_1
- https://incheol-jung.gitbook.io/docs/q-and-a/architecture/ddd
- https://velog.io/@syleemk/JPA-JPA-%EC%99%9C-%EC%8D%A8%EC%95%BC%ED%95%98%EB%8A%94%EA%B0%80