Java 개발에서 JUnit 테스트 도입 가이드
1. JUnit 테스트는 왜 필요한가?
대부분의 Java 기반 업무 시스템은 복잡한 비즈니스 로직, DB 조회, 외부 연계 호출 등을 포함합니다.
이러한 시스템에서 테스트 자동화가 없는 경우 다음과 같은 문제가 발생할 수 있습니다.
테스트 자동화가 없는 경우 발생하는 문제
- 코드 변경 시 기존 로직이 깨졌는지 일일이 수동 테스트해야 함
- 오류가 QA 또는 운영 단계에서 뒤늦게 발견됨
- 다른 개발자나 팀원이 기존 로직을 쉽게 파악하기 어려움
JUnit 도입의 장점
| 항목 | 설명 |
| 정확성 검증 | 코드가 의도대로 동작하는지 개발 단계에서 즉시 확인 가능 |
| 회귀 방지 | 기능 수정이나 리팩토링 시 기존 로직에 영향이 없는지 자동 검증 |
| 자동화 기반 | CI/CD 파이프라인과 연동하여 배포 전 품질 게이트 역할 수행 |
| 문서화 효과 | 테스트 코드 자체가 로직의 예시(usage spec)가 되어 가독성 증가 |
2. 단위 테스트(Unit Test)란?
단위 테스트란, 하나의 클래스나 메서드를 독립적으로 검증하는 테스트입니다.
실제 컨트롤러나 전체 플로우를 테스트하는 것이 아니라, 개별 구성요소 하나에 집중합니다.
예시 시나리오:
- 평일 9시~18시 사이에만 처리가 가능한 시간 조건 로직
- 고객 상태가 ACTIVE일 때만 처리를 진행
- 외부 시스템에서 특정 응답값이 들어오면 승인 처리
3. 외부 연계(mocking)와 단위 테스트
서비스 로직에서는 다음과 같은 외부 요소를 자주 호출합니다:
- 데이터베이스 (Repository)
- 타 시스템 API (예: Core, 외부기관)
- 메시지 큐, 캐시, 파일 시스템 등
이러한 외부 요소는 테스트 실행 시 느리고 불안정하기 때문에, Mockito 같은 도구를 사용하여 모킹(Mocking)으로 대체합니다.
Mockito를 이용한 모킹 예시
@Mock
private ExternalApiClient apiClient;
when(apiClient.callSomething()).thenReturn(new ApiResponse("OK"));
모킹의 효과
| 항목 | 설명 |
| 외부 영향 배제 | 외부 시스템 상태와 무관하게 테스트 실행 가능 |
| 속도 향상 | 실제 DB나 API 호출 없이 빠르게 검증 |
| 예외 시뮬레이션 | 실제로 발생하기 어려운 예외나 응답을 강제로 주입 가능 |
4. Jacoco를 이용한 테스트 커버리지 측정
Jacoco란?
Java 애플리케이션에서 테스트 코드가 실제 로직을 얼마나 실행했는지를 시각적으로 보여주는 도구입니다.
테스트 품질을 객관적으로 측정할 수 있습니다.
주요 커버리지 지표
- Line Coverage: 전체 코드 라인 중 테스트가 실행한 비율
- Branch Coverage: if/switch 등의 분기 조건 중 테스트가 타고 간 비율
Gradle 연동 예시
plugins {
id 'jacoco'
}
jacocoTestReport {
reports {
xml.required = true
html.required = true
}
}
실행 명령어
./gradlew test jacocoTestReport
결과 위치
- build/reports/jacoco/test/html/index.html
- 브라우저에서 결과를 열어 녹색(테스트 됨), 빨간색(테스트 안 됨) 상태를 확인 가능
5. CI/CD 연동 시의 효과
어떤 환경에 연동 가능한가?
- Jenkins, GitHub Actions, GitLab CI 등 CI 서버
- PR(Pull Request) 발생 시 자동으로 테스트 + 커버리지 실행 가능
연동의 이점
| 항목 | 효과 |
| 자동 품질 체크 | PR 병합 전에 테스트 통과 자동 검증 가능 |
| 테스트 실패 시 알림 | 빌드 실패 시 Slack, 이메일 등으로 개발자에게 알림 |
| 배포 안전성 확보 | 테스트 통과 기준 미달 시 배포 차단 가능 |
GitHub Actions 예시
name: CI Test Pipeline
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: '8'
- name: Run tests and generate coverage
run: ./gradlew test jacocoTestReport
- name: Upload coverage report
uses: actions/upload-artifact@v3
with:
name: jacoco-report
path: build/reports/jacoco/test/html
6. 단위 테스트 도입 시 체크리스트
| 항목 | 권장 여부 |
| 핵심 서비스 클래스마다 단위 테스트 작성 | ✅ |
| 외부 연계는 모두 Mocking 처리 | ✅ |
| 실패 케이스 / 예외 케이스도 함께 작성 | ✅ |
| 통합 테스트는 최소화, 단위 테스트 중심 구성 | ✅ |
| 커버리지 리포트 주기적으로 검토 | ✅ |
7. 결론
- 테스트 자동화는 개발 품질과 협업 효율성을 동시에 높이는 가장 강력한 도구입니다.
- JUnit + Mockito + Jacoco는 Spring Boot 기반의 Java 프로젝트에서 사실상 표준처럼 사용되는 안정된 조합입니다.
- 테스트가 잘 구성된 프로젝트는 오히려 개발 속도가 느려지지 않고, 더 빠르고 안전하게 개발할 수 있습니다.
- 특히 CI/CD 파이프라인과 연동되면 “테스트 → 품질 검증 → 배포”의 일관된 흐름을 만들어, 실수를 줄이고 품질을 높이는 데 큰 도움이 됩니다.
'Back-end' 카테고리의 다른 글
| Hibernate/JPA Batch Insert/Update (1) | 2025.03.17 |
|---|---|
| JPA의 Bulk Insert : ID 생성 전략에 따른 성능 비교 (0) | 2025.03.14 |
| JPA 영속성 관리 (0) | 2025.03.14 |
| JSP의 기본 구조 (0) | 2025.01.12 |
| Oracle DB와 MySQL DB 비교 (CAP 이론 관점) (0) | 2025.01.06 |
댓글