Back-end

Java 개발에서 JUnit 테스트 도입 가이드

elysia365 2025. 5. 13.

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 파이프라인과 연동되면 “테스트 → 품질 검증 → 배포”의 일관된 흐름을 만들어, 실수를 줄이고 품질을 높이는 데 큰 도움이 됩니다.

댓글