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() {
}
}
'Projects > [Spring] Coffee Shop Project' 카테고리의 다른 글
| [트러블슈팅] : Kafka 역직렬화 오류 - trusted packages 불일치 (0) | 2026.04.05 |
|---|---|
| [트러블슈팅] Spring Boot 4 마이그레이션 후 contextLoads() 테스트 실패 해결기 (0) | 2026.04.04 |
| Spring 내부 이벤트와 Kafka 이벤트 처리, 무엇이 다를까? (0) | 2026.04.04 |
| [트러블슈팅] @WebMvcTest 환경에서 @EnableJpaAuditing으로 인한 테스트 실패 해결하기 (0) | 2026.04.03 |
| [트러블슈팅] JSON 응답 필드 순서 고정하기 (JsonPropertyOrder) (0) | 2026.04.03 |