요즘 개발자들 사이에서 주로 사용하는 언어들을 보면, " TDD와 DDD로 개발을 진행한다 " 라는 말을 들을수 있다.
그리고 이에 더해 추가로 BDD, RDD 에 대해서 도 알아보자.
소프트웨어 개발 방법론( Software Development Methodology
)에는 다양한 접근 방식이 있으며, TDD(Test-Driven Development), BDD(Behavior-Driven Development), DDD(Domain-Driven Design), RDD(Readme-Driven Development)는 그 중 일부이다.
각각의 방법론은 소프트웨어 개발 과정에서 특정한 초점을 두고 있으며, 개발자들이 보다 효율적이고 체계적으로 프로젝트를 진행할 수 있도록 돕는다.
TDD는 테스트가 개발을 주도해 나가는 개발 방법론이다.
즉, 비즈니스 코드를 작성하기 전에 테스트 코드를 먼저 작성하고, 이 테스트 코드가 통과되도록 비즈니스 코드를 작성하는 방식이다.
코드의 오류를 빠르게 발견하고 수정할 수 있으며, 리팩토링과 코드 품질 향상에 기여함.
초기 테스트 코드 작성에 시간이 많이 소요됨.
개발자로서 프로그램을 작성할 때, 기능 구현과 함께 고려해야 하는 것은 가독성을 위한 coding convention, 즉 앞으로 서비스 확장에 따른 유지보수를 고려해야 한다. 이를 위해 리팩토링과 테스팅이 필수적인데, 해당 과정에서 발생하는 기능에 대한 오류와 이미 생성된 객체에 대한 네이밍 등에 대한 어려움을 TDD 방법론에서 이미 작성한 테스트 코드로 인해 안정적인 리팩토링을 진행할 수 있는 것이다.
BDD는 소프트웨어의 기능이 어떻게 행동
해야 하는지에 초점을 맞춘 개발 방법론이다.
사용자의 행동과 요구사항을 명확한 언어로 정의하여, 이를 기반으로 테스트 코드와 비즈니스 로직을 개발한다.
비개발자(예: 비즈니스 분석가, 제품 관리자)도 이해할 수 있는 명확한 요구사항 정의가 가능함.
BDD를 위한 도구나 프레임워크에 익숙해지는 데 시간이 필요할 수 있음.
온라인 쇼핑 사이트에서 사용자가 상품을 카트에 추가하는 기능을 개발한다고 가정해 보자.
BDD 접근 방식을 사용하여 이 기능을 개발하는 과정은 다음과 같다.
"사용자가 상품을 카트에 추가할 수 있다" 는 비즈니스 요구사항을 기반으로 시나리오를 작성한다.
그리고 Given, When, Then 의 순서를 먼저 작성하고 그에 맞는 행동을 작성한다.
@ExtendWith(SpringExtension.class)
public class ShoppingCartTest {
@BeforeEach
public void setUp() {
// Given: 사용자가 온라인 쇼핑 사이트에 로그인했을 때,
// 사용자의 쇼핑 카트를 초기화
cart = new ShoppingCart();
// 상품 초기화
product = new Product();
product.setId(1L);
product.setName("Test Product");
product.setPrice(100.0);
}
@Test
public void whenUserAddsProductToCart_thenProductIsAddedSuccessfully() {
// When: 사용자가 상품을 카트에 추가하려고 할 때,
cart.addProduct(product, 1); // 상품과 수량을 추가.
// Then: 해당 상품이 카트에 성공적으로 추가되어야 함.
assertThat(cart.getItems()).hasSize(1);
assertThat(cart.getItems()).extracting("product").contains(product);
assertThat(cart.getTotalPrice()).isEqualTo(100.0);
}
}
위 시나리오를 기반으로 자동화된 테스트를 작성한다. 이 테스트는 당연히 초기에는 실패한다(TDD의 원칙에 따라).
테스트를 통과할 수 있도록 실제 기능을 구현.
필요한 경우 코드를 개선하고, 모든 테스트가 통과하는지 확인한다.
BDD는 이처럼 비즈니스 요구사항을 명확하게 이해하고, 이를 바탕으로 테스트와 개발을 진행함으로써, 개발 초기 단계부터 비즈니스 목표와 일치하는 소프트웨어를 만들 수 있도록 돕는다.
DDD는 복잡한 요구사항을 가진 소프트웨어 프로젝트에서, 핵심 비즈니스 개념(도메인)을 중심으로 설계와 개발을 진행하는 방법론이다.
도메인 전문가( 해당기술 고문 )와 개발자가 긴밀하게 협력하여 데이터 주도 설계로, 비즈니스의 복잡성을 관리하고 해결한다.
비즈니스 로직과 요구사항의 복잡성을 효과적으로 관리할 수 있다.
DDD를 적용하기 위해서는 도메인에 대한 깊은 이해와 분석이 필요하다.
온라인 쇼핑 시스템을 개발한다고 가정해 보자.
이 시스템은 여러 하위 도메인으로 나눌 수 있다. 예를 들어, "상품", "주문", "결제" 등등
그리고 각 하위 도메인은 도메인 모델을 통해 추상화되고, 이 모델들은 시스템의 전체 설계를 이끈다.
이러한 도메인 중심의 접근 방식은 복잡한 시스템을 더 잘 이해하고, 관리할 수 있게 해준다. 또한, 비즈니스 요구사항의 변화에 유연하게 대응할 수 있는 설계를 가능하게 한다.
도메인 주도 설계(DDD)는 비즈니스의 본질적인 복잡성을 이해하고, 이를 기반으로 소프트웨어를 설계하는 데 큰 도움을 준다. DDD를 통해 개발자와 비즈니스 전문가 간의 커뮤니케이션을 강화하고, 유연하며 확장 가능한 소프트웨어를 만들 수 있다.
BDD(Behavior-Driven Development, 행동 주도 개발)와 DDD(Domain-Driven Design, 도메인 주도 설계)는 소프트웨어 개발과 설계에 있어 서로 다른 초점을 두고 있다.
하지만 현업에서는 둘 중 하나를 채택하는 것이 아닌, 함께 사용되어 프로젝트를 더 완성도 있게 구현하기도 한다.
간단하게 다시 한 번 정리하자면
BDD (행동 주도 개발)
DDD (도메인 주도 설계)
BDD와 DDD는 서로 보완적인 관계에 있기때문에 DDD를 통해 도메인 모델을 정의하고, 이를 기반으로 BDD 접근 방식을 사용하여 비즈니스 요구사항을 명확한 행동으로 변환하고 테스트를 수행함으로써, 비즈니스 요구사항을 정확히 이해하고 반영하는 고품질의 소프트웨어를 개발할 수 있다. 이러한 결합은 개발 과정에서의 오해를 줄이고 모든 이해관계자가 동일한 목표를 향해 나아갈 수 있도록 돕는다.
정의
RDD는 개발을 시작하기 전에 README 파일을 먼저 작성하는 개발 방법론.
프로젝트의 목표, 설계, 사용 방법 등을 미리 문서화함으로써, 개발 방향성을 명확히 하고 이해관계자 간의 커뮤니케이션을 용이하게 한다.
장점
프로젝트의 목적과 방향성을 초기에 명확히 할 수 있음.
단점
실제 개발 과정에서 변경사항이 발생할 경우, 문서를 지속적으로 업데이트해야 하는 부담이 있음.
https://slaks1005.tistory.com/61
https://hanamon.kr/tdd%EB%9E%80-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%A3%BC%EB%8F%84-%EA%B0%9C%EB%B0%9C/
http://clipsoft.co.kr/wp/blog/tddtest-driven-development-%EB%B0%A9%EB%B2%95%EB%A1%A0/
https://giron.tistory.com/43