DDD란?
- 도메인 모델을 중심에 두고 설계하는 방식
- 보통 같이 등장하는 용어로는 " 유비쿼터스 랭귀지 / 도메인 전문가 " 등이 나오게 되는데 하나하나 알아보자
- 먼저 도메인이라는 것은 "영역"을 말한다, 그러니 비즈니스상에서 도메인이란 "업무의 집합"이라고 봐야한다
- 예를들면 스타벅스는 커피도메인, 버거킹은 음식 도메인으로 볼 수 있다
- 서브 도메인이라고 해서 더 구체적으로 쪼갤 수 있지만, 가장 큰 틀에서 도메인의 의미는 위와 같다고 보면 된다
- 그렇다면 IT기업이 업무를 해나가기 위해선 당연히 도메인에 대한 이해가 있어야한다
- 버거킹을 하기위해선 음식을 알아야하고, 커피점을 운영하기위해선 커피를 알아야 하기 때문이다
- 하지만 시스템을 설계하는 기획자는 도메인에 적어도 개발자보다는 높을 것이다
- 여기서는 기획자라고 단정 지었지만, 도메인에 대한 이해가 높은 직군 또는 사람을 단순히 "도메인 전문가"라고 부른다
- 결국 DDD의 핵심가치는 "도메인 전문가" 와 "소프트웨어 엔지니어"가 서로 "보편적인 (유비쿼터스)" 표현으로 기획부터 개발까지 이르는 길을 구체화 시키는 과정에 모두가 참여한다는 것이다
DDD를 코드로 풀어보자
- DDD로 코드를 구현할때 기본이 되는 레이어드 아키텍처
- 코드를 레이어로 구분하는데
- 프레젠테이션,어플리케이션,도메인,인프라 이렇게 4계층으로 나뉜다
Presentation [표현계층]
@RestController
public class MyController {
private final CallService callService;
@GetMapping("/callme")
public Response callMeASAP(){
return Response.success(callService.call());
}
}
Aplication [응용계층]
- 비즈니스 로직을 정의하여, 도매인 계층과 인프라 계층을 연결해주는 역할
@Service
public class MyService {
private final MyRepository myRepository;
@Transactional(readonly = true)
public Response exam(){
ExamDTO examDTO = myRepository.findExam();
return new ResponseDTO(examDTO);
}
}
- 중요한것은 정보를많이 가져선 안되기 때문에, 실제 데이터 변화는 도메인 계층에 위임해야 한다
- 즉 아래와같은 것들을 할 수 있다
Domain [모델계층]
- 비즈니스 규칙과 정보에 대한 실제 도메인 정보를 가지고 모든 것을 책임지는 계층
@Service
public class MyService {
private final MyRepository myRepository;
@Transactional(readonly = true)
public Response exam(){
ExamDTO examDTO = myRepository.findExam();
return new ResponseDTO(examDTO);
}
}
- 아까 설계하는 과정에서 봤던 것처럼 도메인은 비즈니스를 구성하는 영역이기 때문에, 엔티티도 있고 여러가지 서비스들이 존재한다
- 도매인의 핵심은 "상태제어"이다
- 때문에 위에서는 칼럼들 아래에 실제 특정값을 변경하는 로직을 작성하여 목적을 달성하였다
- 이렇게 하면 계층간의 책임분리가 됨으로 코드간결성이 유지된다
Infra [인프라 계층]
- 상위계층을 지원하는 일반화된 기술적 기능을 제공하는 계층
public interface MyRepository extends JpaRepository<User, Long> {
}
- 이런식으로 JPA를 연결 해둔것도 이 코드를 통해 DB에 접근하는 것임으로, 인프라 계층에 속한다고 볼 수 있다
- 결국 인프라 계층은 외부시스템을 호출하는 역할에 주로 쓰인다
- 그리고 얻어온 데이터를 도매인 계층으로 전달하는것 까지가 임무다
한줄요약
- 시나리오: 사용자로부터 storeId 1을 받아서, store객체의 isClose를 false로 바꿔야함
- Presentation: 사용자로부터 storeId 1을 받고, application 계층으로 넘겨줌
- application: 사용자로부터 받은 storeId 1을 repository에서 조회하여 찾음, domain 객체에서 isClose false로 바꿔주는 메서드 찾고 실행
- domain: store 객체 내부에서 isClose의 값을 변경하는 함수 생성
- infra: storeRepository 제공
추가
- DDD는 개발자가 아닌사람과, 도매인전문가와의 중간 협업과정이라고 볼 수 있다
- 중간에 빠진내용이 많으니 참조블로그를 꼭 보길바란다
참조 블로그
https://velog.io/@gowjr207/%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%A3%BC%EB%8F%84-%EC%84%A4%EA%B3%84DDD%EB%A5%BC-%EC%84%A4%EB%AA%85%ED%95%B4%EB%B3%B4%EB%8B%A4