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

테스트 주도 개발(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에 대해서 알아보자!
'JAVA' 카테고리의 다른 글
| [TDD] SpringBoot 를 통한 TDD 손쉬운 작성 - 02) TDD 작성 해보기! (0) | 2026.02.17 |
|---|---|
| [Querydsl] 03. 기본 문법 (fetchJoin, case, 상수문자더하기) (0) | 2024.03.31 |
| [Querydsl] 02. 기본 문법 (Q-Type,검색조건쿼리,결과조회,정렬,페이징,집합) (0) | 2024.01.28 |
| [Querydsl] 01. 소개 및 프로젝트 설정 (0) | 2024.01.28 |
| [JPA] JPA 정복하기 - 05. 스프링 데이터 JPA 분석 (1) | 2024.01.21 |
