본문 바로가기

CS(Computer Science)

TDD, DDD

TDD(Test Driven Development) - 테스트 주도 개발

  • 소스코드를 작성하기 전에 테이스트 케이스를 먼저 작성하고 테스트로 검증된 코드를 가지고 실제 코드를 작성하는
    개발 방법론

개념

  • 요구되는 기능에 대한 자동화된 테스트 케이스를 작성
  • 해당 테스트 케이스를 통과하는 가장 짧고 가독성이 좋고 유지보수성이 뛰어난 코드 작성
  • 상황에 맞게 리팩토링

TDD 사이클

  • Red(실패) : 실패하는 테스트 코드를 먼저 작성
  • Green(성공) : 테스트 코드를 성공시키기 위한 실제 코드를 작성
  • Refactor(리팩토링) : 실제 코드와 테스트 코드 리팩토링 수행

장점

  • 좋은 코드 작성에 유리
    • 테스트 코드 작성 -> 기능 구현 코드 작성 -> 리팩토링의 단계를 반복하기 때문에 시스템에서 발생할 수 있는
      오류들을 줄일 수 있다.
    • 짧은 간격으로 기능의 구현과 리팩토링의 과정을 반복하여 간결하고 깔끔한 코드를 작성하는데 도움이 된다.
  • 리팩토링을 통해 변경되는 소스의 기능에 대한 부분에서 보다 안정적인 리팩토링이 가능하다
  • 작은 단위의 기능부터 개발을 진행하기 때문에 유연한 확장성을 가지게 해준다.

 

단점

  • 코드 생산성 문제
    • 테스트 코드의 작성으로 절대적인 코드량이 늘어난다.
    • 기능 구현 외에 테스트 코드를 추가적으로 작성해야 하기 때문에 프로젝트 시간이 늘어난다.
    • 일정이 촉박하고 빠른 개발이 필요한 프로젝트에서는 적용하기 어렵다.
  • 테스트 코드 진입장벽
    • 테스트 코드를 작성하기 위해서는 만들고자 하는 소프트웨어에 대한 높은 이해도가 필요하다.
  • 테스트 코드 작성 범위에 대한 고민
    • 모든 소스 코드의 기능과 예외사항에 대해서 테스트 코드를 작성하기는 어렵기 때문에
      어디까지 테스트 코드를 작성해야 할지 정해야 하는 문제가 있다.

 

 

DDD(Domain Driven Design) - 도메인 주도 설계

  • 복잡한 도메인을 가진 소프트웨어를 개발할 때 유용한 소프트웨어 설계 및 개발 방법론
  • 도메인 모델을 중심으로 개발을 진행함으로써 비즈니스 요구사항을 보다 명확하게 이해하고 실제 코드로
    구현하는 것을 강조한다.

음식 주문 배달 어플리케이션의 도메인

  • 도메인 : 유사한 업무들의 집합
  • 세분화하여 상위 도메인과 하위 도메인으로 표현할 수 있다.

 

애그리거트(Agrregate)

  • 비슷한 도메인들의 묶음
  • 애그리거트 내에서 엔티티와 값 객체는 연관성을 가지고 있으며, 루트 엔티티가 애그리거트 내의 일관성과
    불변성을 유지하면서 조정하는 역할을 한다.

애그리거트 루트(Aggregate Root)

  • 애그리거트 안에는 1개 이상의 도메인이 있으며, 그 중 하나가 애그리커트를 대표하는 도메인이 된다.
  • 하나의 애그리거트를 대표하는 도메인을 애그리거트 루트라 한다.
  • 애그리거트 내의 도메인들 중 다른 모든 도메인들과 직,간접적으로 연결되어 있는 도메인이 있는데,
    특정 도메인이 다른 모든 도메인들과 연관이 있다면 애그리거트 루트로 선정 가능하다.

데이터베이스 테이블 간 관계로 애그리거트 루트의 기본키 정보를 다른 도메인들이 외래 키 형태로 가지고 있는 것이다.

 

장점

  • 요구사항 이해
    • 도메인을 중심으로 개발하기 때문에 요구사항을 보다 명확하게 이해하고 모델링 가능하다
  • 모듈화와 재사용성
    • DDD의 구성요소는 모듈화와 재사용성을 촉진한다.
    • 비즈니스 로직이나 도메인 규칙을 중심으로 모듈을 구성하기 때문에 기능을 쉽게 재사용 가능하다.
  • 테스트 용이성
    • 도메인 모델을 중심으로 테스트를 작성할 수 있도록 돕는다.
    • 도메인 모델을 단위 테스트 하거나 통합 테스트 하면서 비즈니스 로직의 정확성을 검증할 수 있다.

 

단점

  • 복잡성 추가 가능성
    • 잘못된 모델링이나 너무 많은 복잡한 구성 요소 도입으로 인해 코드가 더 복잡해질 수 있다.
  • 프로젝트 크기에 따른 적용 어려움
    • 복잡한 도메인을 다룰 때 효과적이지만, 작은 규모의 프로젝트에서는 과도한 복잡성을 초래할 수 있다.

 

 


참고 블로그

[CS] 도메인 주도 설계(DDD: Domain-Driven Design)란?

TDD란? 테스트 주도 개발

TDD, BDD, DDD란?

TDD?? BDD??

 

 


PPT

TDD와 DDD.pptx
0.18MB