PromleeBlog
sitemap
aboutMe

posting thumbnail
테스트를 통과시키는 최소 구현 - Spring Boot로 시작하는 TDD 4편
Minimum Implementation to Pass Tests - TDD with Spring Boot Part 4

📅

🚀

들어가기 전에 🔗

지난 3편에서 우리는 요구사항을 정의하고 실패하는 테스트 코드를 작성했습니다.
기억하시나요?
우리의 화면에는 빨간색 컴파일 에러가 가득했습니다.

오늘은 이 빨간 불을 초록 불(Green)로 바꾸는 과정을 함께 하겠습니다.
목표는 단 하나,
어떤 방법을 써서라도 테스트를 통과시키는 것
입니다.

🚀

Green 단계의 의미 🔗

TDD 사이클에서
Green
단계는
테스트 통과
를 의미합니다.
여기서 중요한 원칙이 하나 있습니다.
바로
죄악(Sin)을 저질러도 좋다
는 것입니다.

코드가 더러워도 괜찮습니다.
변수명이 엉망이어도 괜찮습니다.
심지어 값을 하드코딩(고정된 값을 그대로 입력)해도 괜찮습니다.
일단 테스트를 통과시켜서 심리적 안정감을 얻는 것이 최우선 목표이기 때문입니다.

🚀

컴파일 에러 해결하기 🔗

가장 먼저 할 일은 빨간 줄(컴파일 에러)을 없애는 것입니다.
지난 시간에 ProductService 클래스와 register 메서드가 없어서 에러가 났었죠?
이제 실제로 파일을 만들어 보겠습니다.

클래스와 메서드 생성 🔗

테스트 코드가 위치한 패키지와 동일한 구조로 메인 패키지에 클래스를 생성합니다.
src/main/java/com/example/tdd_study/product/ProductService.java
package com.example.tdd_study.product;
 
public class ProductService {
 
    public void register(String name, int price) {
        // 내용은 아직 비워둡니다
    }
}
이렇게 껍데기만 만들어도 IDE의 빨간 줄은 모두 사라집니다.
자바 문법상 틀린 부분이 없기 때문입니다.
이 상태에서 테스트를 한번 돌려볼까요?

IntelliJ에서는 테스트 메서드 옆에 초록색 재생 버튼이 나타납니다.
혹은, 우측 상단의 실행 아이콘에서 테스트 Application을 실행해도 됩니다.
테스트 메서드 실행
테스트 메서드 실행

첫 번째 실행 결과 🔗

테스트를 실행하면 초록색 불이 들어옵니다!

"어? 코드를 하나도 안 짰는데 왜 성공하죠?"

우리가 작성한 테스트 코드를 다시 살펴봅시다.
src/test/java/com/example/tdd_study/product/ProductServiceTest.java
@Test
@DisplayName("상품 등록이 성공해야 한다")
void 상품_등록_성공() {
  // Given: 테스트를 위한 준비
  String name = "아메리카노";
  int price = 4500;
  ProductService productService = new ProductService();
 
  // When: 실제 테스트할 동작 수행
  productService.register(name, price);
 
  // 검증(Assert) 로직이 아직 없습니다!
}
아직 검증(Assert) 단계가 없어서 에러가 발생하지 않은 것뿐입니다.
하지만 이것도 TDD의 과정입니다.
이제 우리는
메서드를 호출해도 프로그램이 터지지 않는다
는 사실을 검증한 것입니다.

🚀

최소 구현 원칙 🔗

이제 진짜 검증 로직을 추가해 보겠습니다.
상품을 등록했으니, 등록된 상품 정보를 확인할 수 있어야겠죠?
테스트 코드를 조금 수정해 보겠습니다.
src/test/java/com/example/tdd_study/product/ProductServiceTest.java
package com.example.tdd_study.product;
 
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.DisplayName;
 
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
 
class ProductServiceTest {
 
    @Test
    @DisplayName("상품 등록이 성공해야 한다")
    void 상품_등록_성공() {
        // Given: 테스트를 위한 준비
        String name = "아메리카노";
        int price = 4500;
        ProductService productService = new ProductService();
 
        // When: 실제 테스트할 동작 수행
        productService.register(name, price);
 
        // 등록된 상품을 가져와서 검증
        Product product = productService.findProduct();
        assertThat(product.getName()).isEqualTo("아메리카노");
    }
}
 
이제 다시 컴파일 에러가 발생합니다.
Product 클래스도 없고, findProduct 메서드도 없으니까요.
이제
최소한의 코드
로 이 테스트를 통과시켜 보겠습니다.

1. 필요한 클래스 생성 🔗

먼저 Product 클래스를 생성합니다.
src/main/java/com/example/tdd_study/product/Product.java
package com.example.tdd_study.product;
 
public class Product {
    private String name;
    private int price;
 
    public Product(String name, int price) {
        this.name = name;
        this.price = price;
    }
 
    public String getName() {
        return name;
    }
}

2. Service 계층 최소 구현 🔗

여기서 재미있는 점을 보여드리겠습니다.
정상적으로 구현하려면 DB에 저장하고 다시 조회해야 하지만, 우리는
테스트 통과만을 위해
가짜로 구현할 것입니다.
src/main/java/com/example/tdd_study/product/ProductService.java
package com.example.tdd_study.product;
 
public class ProductService {
    private Product product;
 
    // 상품 등록 시, 단순히 멤버 변수에 저장
    public void register(String name, int price) {
        this.product = new Product(name, price);
    }
 
    // 등록된 상품을 반환
    public Product findProduct() {
        return this.product;
    }
}
데이터베이스(Repository)도 연결하지 않았고, 메모리(변수)에 대충 저장했습니다.
하지만 테스트를 실행하면
초록 불(Green)
이 뜹니다.

이것이 바로
최소 구현
입니다.
알고리즘 문제 풀이로 치면, 복잡한 공식 대신 단순 반복문으로 일단 정답만 맞힌 상태와 같습니다.

🚀

왜 이렇게 개발할까요? 🔗

아마 의문이 드실 겁니다.
"어차피 나중에 DB 연결할 건데 왜 두 번 일하나요?"

이유는
집중력 유지
때문입니다.
한 번에 너무 많은 것을 생각하면 뇌에 과부하가 걸립니다.


이 모든 것을 한꺼번에 하려다 보면 실수가 나옵니다.
TDD는 문제를 아주 작게 쪼개서,
지금 당장 해결해야 할 문제
에만 집중하게 도와줍니다.
일단 기능이 돌아가는 것을 확인했으니(Green), 구조를 개선하는 것(Refactor)은 마음 편하게 나중에 하면 됩니다.

🚀

결론 🔗

오늘은 테스트를 통과시키는 최소 구현에 대해 알아보았습니다.


이제 우리에게는 든든한 초록 불이 켜졌습니다.
기능은 동작하지만 코드는 아직 엉성합니다.
다음 시간에는 이 코드를 전문가답게 다듬는 리팩토링(Refactoring) 과정을 진행하겠습니다.
이때 진짜 설계의 마법이 일어납니다.

참고 🔗