📋 Spring Boot TDD 기본 흐름
TDD는 항상 3단계 사이클:
- Red – 실패하는 테스트 작성 (처음엔 무조건 실패해야 정상)
- Green – 테스트를 통과시키기 위한 최소한의 코드 작성
- Refactor – 코드를 예쁘게 다듬고 최적화 (테스트는 계속 통과해야 함)
즉,
테스트 먼저 → 코드 작성 → 리팩터링
✨ Spring Boot TDD 실습 예시
예를 들어, "회원가입" 기능을 만든다고 가정
1. 실패하는 테스트 먼저 만들기 (Red)
// src/test/java/com/example/demo/MemberServiceTest.java
package com.example.demo;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
class MemberServiceTest {
private MemberService memberService = new MemberService();
@Test
void 회원가입_성공() {
// given
String name = "Alice";
// when
Member member = memberService.register(name);
// then
assertThat(member.getName()).isEqualTo("Alice");
}
}
- MemberService와 register() 아직 없음 → 당연히 테스트 실패함.
2. 테스트 통과시키는 최소한 코드 작성 (Green)
// src/main/java/com/example/demo/MemberService.java
package com.example.demo;
public class MemberService {
public Member register(String name) {
Member member = new Member();
member.setName(name);
return member;
}
}
// src/main/java/com/example/demo/Member.java
package com.example.demo;
public class Member {
private String name;
// getter, setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 이제 테스트 통과함 ✅
3. 리팩터링 (Refactor)
- 혹시라도 중복 제거
- 객체 생성 깔끔하게 정리
- 테스트 메서드 이름 정리 등
📦 Spring Boot에서 TDD 기본 세팅
- 의존성 추가 (build.gradle):
dependencies {
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
- 테스트 라이브러리:
- JUnit5 (Spring Boot 기본)
- AssertJ (더 읽기 좋은 assertion)
- Mockito (Mocking할 때)
- Spring Test (통합 테스트할 때)
🚀 TDD를 어디에 쓰냐?
- Service 계층 테스트 (비즈니스 로직 검증)
- Repository 계층 테스트 (DB 테스트)
- Controller 계층 테스트 (API 테스트, @WebMvcTest)
- 통합 테스트 (@SpringBootTest)
🛠️ 정리
구분방법
단위(Unit) 테스트 | @SpringBootTest 없이 클래스만 테스트 |
통합(Integration) 테스트 | @SpringBootTest 사용해서 스프링 환경 띄움 |
Mock 테스트 | @MockBean, Mockito 사용해서 의존성 가짜로 만듦 |
API 테스트 | @WebMvcTest, MockMvc 사용 |