코알못

[TDD] SpringBoot 를 통한 TDD 손쉬운 작성 - 01) TDD 란 ? 본문

JAVA

[TDD] SpringBoot 를 통한 TDD 손쉬운 작성 - 01) TDD 란 ?

코린이s 2026. 2. 16. 22:16

테스트 주도 개발(TDD) 개념부터 실무 활용까지 알아보자!

개발을 하다 보면 “테스트는 나중에 하지 뭐…”라고 생각하는 경우가 많다고 한다.

하지만 안정적인 서비스를 만들기 위해서는 테스트가 매우 중요하다.

이때 등장하는 개념이 바로 TDD(Test-Driven Development) 다!

지금부터 하나씩 알아보자!


TDD(Test-Driven Development)란?

TDD는 테스트 시나리오대로 코드를 먼저 작성한 뒤,
그 테스트를 통과시키기 위해 코드를 만들고,
이후 리팩토링을 통해 계속해서 개선하는 개발 방법이라고 한다.

이 개념은 켄트 벡이 정립한 개발 방법론으로 알려져 있다고 한다.


TDD의 3단계 

TDD는 크게 3단계로 반복된다!

간단하게 설명하면 아래와 같다!

Red → 실패하는 테스트 작성
Green → 최소한으로 통과
Refactor → 구조 개선

각각의 과정에 대한 내용을 적어보면 아래와 같이 진행한다.

이름 내용
Red 단계
  • 테스트 시나리오를 작성한다.
  • 반드시 실패하는 테스트를 만든다.
  • 아직 기능이 없으므로 테스트는 실패 상태라고 한다.
Green 단계
  • 테스트를 통과할 수 있는 최소한의 코드를 작성한다.
  • 빠진 테스트 케이스가 있다면 추가한다.
  • 목표는 “일단 통과”라고 한다.
Refactor 단계
  • 코드 개선 및 구조 리팩토링을 진행한다.
  • 이 과정을 통해 설계를 개선한다.

이 모든 테스트 케이스가 통과되면 테스트 작성이 종료 된다!


실무에서는 하이브리드 TDD !

이론적으로는 테스트부터 작성하는 것이 이상적이라고 한다.
하지만 실무에서는 “일단 돌아가게부터 만들어 주세요…” 라는 요구가 많을 수 있다.

이런 상황 때문에 테스트를 먼저 만들기 어려운 경우가 많다.

그래서 실무에서는 하이브리드 TDD 방식을 많이 사용한다고 한다.

  • 기능 먼저 구현
  • 이후 테스트 코드 작성
  • TDD 방식으로 보완

TDD 단위 테스트

하나의 기능만 정확히 테스트하는것이 '단위 테스트'이다. 

여기서 통합 테스트와 다르게 단위 테스트는 

하나의 클래스/메서드만 테스트하는 것으로 외부 의존성 전부 Mock / Stub 처리 한다.

TDD의 80~90%는 단위 테스트로 진행하며, 각각의 단위 테스트는 서로 영향 주지 않게 작성하며 이를 '테스트 격리' 라고 한다.

이러한 테스트 코드들이 있기에 리펙토리를 해도 테스트를 진행하면 되기에 기능이 안전하다고 생각할 수 있다.

이러한 특징을 '리팩토링 안전망' 이라고 부른다!

여기서 단위 테스트할때 의존성의 Mock[목], Stub[스텁] 처리 한다고 하는데 해당 개념이 무엇인지 알아보자!

Mock과 Stub은 모두 테스트에서 실제 DB, API, 메일 서버 대신 사용하는 가짜 객체다.

이를 사용하는 목적은 아래와 같다!

✔️ 테스트를 빠르게
✔️ 테스트를 안정적으로
✔️ 외부 환경에 의존하지 않게

Stub 은 값을 대신 돌려주는 객체로 미리 정해둔 값만 반환하는 역할을 한다.

아래와 같이 적으면 userRepo 에서 kim 값을 찾으면 kim 인 User 객체를 반환하도록 모의로 셋팅 하는것이다.

when(userRepo.find("kim"))
    .thenReturn(new User("kim"));

 

Mock은 행동을 검증하는 객체로 메서드가 호출되었는지 자체를 검증한다.

예를 들어 “회원가입하면 메일이 반드시 발송되어야 한다” 를 검증한다고 해보자!

아래와 같이 service.register 을 하면 mailService 에서 해당 이메일로 메일이 가도록 구현 되어있는지 로직만 검증 하는것이다.

@Mock
MailService mailService;  // 가짜

@InjectMocks
UserService service;       // mailService가 service에 주입됨

User user = new User("kim", "a@test.com");

service.register(user);

verify(mailService).send("a@test.com");

우선 개념만 간단하게 알아봐서 사실 실제 작성해보지 않으면 모르겠다..!

다음 시간에는 실습을 통해 차근차근 TDD에 대해서 알아보자!

728x90
Comments