2026년 03월 03일

🔥 Smoke Test — 시스템의 1차 생존 확인

Java Spring Boot
Cover Image

🔥 Smoke Test — 시스템의 1차 생존 확인

"배포했는데, 서버가 살아있긴 한가?" 스모크 테스트는 이 단 하나의 질문에 답하는 테스트입니다.


💡 스모크 테스트란?

Smoke Test는 시스템이 최소한의 기본 기능을 수행할 수 있는지를 빠르게 확인하는 1차 생존 테스트입니다.

이름의 유래는 하드웨어 테스트에서 왔습니다.

전원을 켰을 때 연기(smoke)가 나면 → ❌ 치명적 결함 연기 없이 켜지면 → ✅ 최소 통과

소프트웨어에서도 동일한 철학입니다.
빠르게 배포하고, "일단 터지지는 않는가" 를 먼저 확인합니다.


🏗️ 스모크 테스트가 확인하는 것

확인 항목설명
✅ 애플리케이션 기동Spring Context가 정상적으로 로드되는가
✅ Bean 생성주요 Bean이 충돌 없이 생성되는가
✅ DB 연결DataSource 연결이 유효한가
✅ 외부 시스템 연결Redis, 외부 API 등 연동이 정상인가
✅ 핵심 API 응답주요 엔드포인트가 500 없이 응답하는가
✅ 보안 설정SecurityConfig가 치명적으로 깨지지 않았는가

🧩 Spring Boot 스모크 테스트 예시

1️⃣ Context 기동 확인 (가장 기본)

@SpringBootTest
class ApplicationSmokeTest {

    @Test
    void contextLoads() {
        // Context가 정상 로드되면 통과
    }

}

가장 단순하지만 강력합니다.
Bean 충돌, 설정 오류, DB 연결 실패가 있으면 이 테스트 하나로 바로 발견됩니다.


2️⃣ 핵심 Bean 주입 확인

@SpringBootTest
class BeanSmokeTest {

    @Autowired ApplicationContext context;

    @Test
    void criticalBeansLoaded() {
        assertNotNull(context.getBean(UserService.class));
        assertNotNull(context.getBean(JwtProvider.class));
    }

}

핵심 컴포넌트가 실제로 주입되는지 명시적으로 검증합니다.


3️⃣ API Health Check (CI/CD에서 가장 많이 사용)

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class ApiSmokeTest {

    @Autowired
    TestRestTemplate restTemplate;

    @Test
    void healthCheck() {
        ResponseEntity<String> response =
            restTemplate.getForEntity("/actuator/health", String.class);

        assertEquals(HttpStatus.OK, response.getStatusCode());
    }

}

배포 직후 CI/CD 파이프라인에서 자동으로 실행하는 대표적인 패턴입니다.


4️⃣ DB & Redis 연결 확인

@SpringBootTest
class InfrastructureSmokeTest {

    @Autowired DataSource dataSource;
    @Autowired RedisTemplate<String, String> redisTemplate;

    @Test
    void databaseConnectionIsHealthy() throws Exception {
        try (Connection connection = dataSource.getConnection()) {
            assertTrue(connection.isValid(1));
        }
    }

    @Test
    void redisConnectionIsHealthy() {
        redisTemplate.opsForValue().set("smoke:ping", "pong");
        assertEquals("pong", redisTemplate.opsForValue().get("smoke:ping"));
    }

}

외부 인프라 연결 문제를 배포 직후 빠르게 잡아낼 수 있습니다.


🎯 테스트 종류 비교

종류목적범위속도
Smoke Test기본 기동 / 생존 확인아주 좁음⚡ 매우 빠름
Unit Test개별 로직 검증매우 좁음🔵 빠름
Integration Test모듈 간 동작 확인중간🟡 느림
E2E Test전체 사용자 시나리오넓음🔴 매우 느림

스모크 테스트는 가장 먼저, 가장 빠르게 실행해서 치명적 결함을 조기에 차단합니다.


🚀 DevOps 파이프라인에서의 위치

스모크 테스트가 실패하면 배포 자체가 차단됩니다.
이후 비용이 큰 통합/E2E 테스트를 실행하기 전에 빠르게 걸러내는 것이 핵심입니다.


🏢 MSA 환경에서의 스모크 전략

MSA 환경에서는 서비스 단위로 스모크 테스트를 구성합니다.
Spring Boot Actuator를 활용하면 표준화된 헬스체크 엔드포인트를 쉽게 만들 수 있습니다.

# application.yml
management:
  endpoints:
    web:
      exposure:
        include: health, info, ready
  endpoint:
    health:
      show-details: always
엔드포인트용도
GET /actuator/health서비스 전반 상태 확인
GET /actuator/health/liveness프로세스 생존 여부 (Kubernetes liveness probe)
GET /actuator/health/readiness트래픽 수신 준비 여부 (Kubernetes readiness probe)

✅ 체크리스트 — 내 프로젝트에 적용하기

스모크 테스트 도입 시 아래 항목을 순서대로 확인합니다.

□ @SpringBootTest contextLoads() 테스트 존재하는가?
□ DB 연결 검증 테스트가 있는가?
□ Redis 등 외부 인프라 연결 검증이 있는가?
□ JWT / Security 설정 오류를 잡는 테스트가 있는가?
□ /actuator/health 엔드포인트가 200을 반환하는가?
□ CI/CD 파이프라인에서 스모크 테스트가 자동 실행되는가?
□ 스모크 테스트 실패 시 배포가 차단되는가?

📌 한 줄 정리

스모크 테스트는 "시스템이 최소한 터지지 않고 기본 기능은 작동하는지 확인하는 1차 생존 테스트"이다.

빠르게 실패하고(Fail Fast), 빠르게 탐지하는 것이 핵심입니다.
정교한 비즈니스 로직 검증은 통합 테스트와 E2E 테스트에 맡기세요.

← 목록으로 돌아가기