Projects/[Spring] Coffee Shop Project

[Test] Spring Boot contextLoads 테스트가 실패하는 이유

montmer27 2026. 4. 4. 21:49

Spring Boot 프로젝트를 처음 만들면 자동으로 생성되는 테스트가 하나 있다.

@SpringBootTest
class GigaCoffeeApplicationTests {

    @Test
    void contextLoads() {
    }
}

내용이 비어 있어서 별거 아닌 것처럼 보이지만, 실제로는 꽤 중요한 테스트다. 이 테스트가 어떤 이유로 실패하는지, 그리고 왜 다른 테스트는 통과하는데 이것만 실패하는지를 정리해본다.

스택 트레이스 읽는 법

실패 로그를 보면 이런 식으로 출력된다.

GigaCoffeeApplicationTests > contextLoads() FAILED
    java.lang.IllegalStateException
        Caused by: BeanCreationException
            Caused by: PersistenceException
                Caused by: AuthException
                    Caused by: java.sql.SQLException

Caused by 체인은 아래로 내려갈수록 진짜 원인에 가까워진다. 위에서부터 읽으면 증상이고, 아래로 내려가면 원인이다.

위 로그의 진짜 원인은 마지막 줄인 SQLException, 그리고 그 위의 AuthException이다. DB 인증 자체가 실패한 것이다.

원인 체인 해석

IllegalStateException: Spring이 컨텍스트 로딩에 실패했음을 알려주는 최상위 예외다.
BeanCreationException: EntityManagerFactory 같은 JPA 관련 Bean을 생성하다가 실패했다는 뜻이다.
PersistenceException: JPA 영속성 계층 초기화 중 예외가 발생했다.
AuthException: Hibernate가 DB에 연결을 시도했는데 인증이 거부됐다.
SQLException: JDBC 레벨에서 실제로 터진 에러다.

왜 DB 인증이 실패하는가

보통 세 가지 경우 중 하나다.

첫째, 테스트용 설정 파일이 없거나 datasource 정보가 빠져 있다. src/test/resources 아래에 application.yml이 없으면 프로덕션 설정으로 붙으려 하고, 그 정보가 테스트 환경에서 주입되지 않아 실패한다.

둘째, 테스트에서 H2를 써야 하는데 MySQL로 연결을 시도하고 있다. 프로파일 분리가 안 된 경우 발생한다.

셋째, AWS Parameter Store나 환경변수로 주입받아야 하는 DB 정보가 테스트 실행 시점에 없다. CI 환경에서 자주 발생하는 케이스다.

다른 테스트는 왜 통과하는가

contextLoads가 실패하는데 다른 테스트는 멀쩡한 경우가 있다. 테스트 어노테이션마다 Spring 컨텍스트를 로딩하는 범위가 다르기 때문이다.

  • @SpringBootTest는 전체 애플리케이션 컨텍스트를 통째로 띄운다. DataSource, EntityManagerFactory, Hibernate 초기화까지 전부 수행하고, 실제 DB 연결을 시도한다. contextLoads가 여기에 해당한다.
  • @WebMvcTest는 Controller 레이어만 로딩한다. JPA나 DataSource를 아예 초기화하지 않아서 DB 인증 시도 자체가 없다.
  • @DataJpaTest는 JPA 레이어만 로딩하되, 기본적으로 H2 인메모리 DB로 자동 대체해준다. 실제 DB에 연결하지 않는다.
  • MockitoExtension을 쓰는 순수 단위 테스트는 Spring 컨텍스트 자체를 사용하지 않는다. DB와 완전히 무관하게 동작한다.
  • @MockBean으로 Repository를 모킹한 경우도 실제 DB 접근 없이 가짜 객체로 처리한다.

결국 contextLoads만 유일하게 실제 DB 연결까지 요구하는 풀 컨텍스트 테스트다. 다른 테스트들이 통과한다면 그 테스트들은 전체 컨텍스트를 안 쓰거나 DB를 우회하는 방식으로 작성된 것이다.

해결 방향

가장 간단한 해결책은 테스트 프로파일을 분리하는 것이다. src/test/resources/application-test.yml에 H2 datasource 설정을 추가하고, 테스트 클래스에 @ActiveProfiles("test")를 붙이면 contextLoads도 H2로 붙어서 통과하게 된다.

# src/test/resources/application-test.yml
spring:
  datasource:
    url: jdbc:h2:mem:testdb
    driver-class-name: org.h2.Driver
    username: sa
    password:
  jpa:
    database-platform: org.hibernate.dialect.H2Dialect
@SpringBootTest
@ActiveProfiles("test")
class GigaCoffeeApplicationTests {

    @Test
    void contextLoads() {
    }
}