DDD?

Terror·2024년 9월 24일
0

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);
    }
}
  • 중요한것은 정보를많이 가져선 안되기 때문에, 실제 데이터 변화는 도메인 계층에 위임해야 한다
  • 즉 아래와같은 것들을 할 수 있다
    • 트랜잭션 관리
    • DTO 변환
    • 모듈간의 연계

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

profile
테러대응전문가

0개의 댓글