책이나 개발 커뮤니티에서 항상 자주보던 TDD
AI의 도움을 받아 바이브코딩을 하게 되면 TDD가 필수라고 하던데..
어떻게 개발하는게 TDD일까?
1. TDD가 뭐임?
TDD 3줄 요약
1. 테스트를 먼저 작성하고, 그 테스트를 통과할 최소한의 코드를 작성한다.
2. 코드와 테스트를 리팩토링하며 품질과 구조를 개선한다.
3. 이 과정을 Red(실패) → Green(성공) → Refactor 사이클로 반복한다.
위 내용도 매우 유명하다.
매우 유명해서 나도 이전에 저 순서를 따라 개발해보려 했으나
무엇을 먼저 시작해야할지 모르겠다.
* 명언에 좋아요를 추가하는 기능을 TDD로 개발한다고 생각하고 시작함.
1. 엔티티 추가(좋아요 관리 테이블)

- 우선 거두절미하고 기능 개발을 위해 필요한 엔티티를 하나 추가했다.
2. 실패 테스트 추가 (RED)
@Test
fun `좋아요 요청 시 score가 1 증가한다`() {
// given
val savedQuote = quoteRepository.save(Quote(content = "테스트 명언", speaker = "테스트 연사", score = 0))
val request = FeedbackRequest(quoteId = savedQuote.id, liked = true)
// when
feedbackService.processFeedback("test-user", request)
// then
val updatedQuote = quoteRepository.findById(savedQuote.id).get()
assert(updatedQuote.score == 1)
}
feedbackService.processFeedback() 함수도 구현되지 않았고,
당연히 quote.score를 조회해도 +1이 되지않는다.
결과: 실패
3. 실패 테스트 리팩토링 (GREEN)
* processFeedback 함수를 리팩토링하여 테스트가 성공하도록 수정한다
@Transactional
fun processFeedback(userIdentifier: String, request: FeedbackRequest) {
// 중복 피드백 확인
feedbackRepository.findByUserIdentifierAndQuoteId(userIdentifier, request.quoteId)?.let {
throw IllegalArgumentException("Already feedback given") // 예외 처리는 추후에 구체화
}
val quote = quoteRepository.findById(request.quoteId).orElseThrow()
quote.score += 1 // 우선 단순 증가 로직만 구현
feedbackRepository.save(
Feedback(
quoteId = request.quoteId,
userIdentifier = userIdentifier,
liked = request.liked
)
)
}
(이제 +1이 될거임)
테스트 (GREEN)
@Test
fun `좋아요 요청 시 201 Created를 반환하고 명언의 score가 1 증가한다`() {
// given
val savedQuote = quoteRepository.save(
Quote(content = "테스트 명언", speaker = "테스트 연사", score = 0)
)
val request = FeedbackRequest(quoteId = savedQuote.id, liked = true)
// when
feedbackService.processFeedback("test-user", request)
// then
val updatedQuote = quoteRepository.findById(savedQuote.id).get()
assertThat(updatedQuote.score).isEqualTo(1)
}
'공부 > 테스트 코드' 카테고리의 다른 글
| 테스트 더블 (0) | 2025.08.20 |
|---|---|
| TDD 초 기초편 2(SecurityConfig 에러) (0) | 2025.08.10 |
| ArchUnit 테스트? 그것이 무엇인가? (4) | 2025.08.08 |