Spring Boot에서는 개발 환경과 테스트 환경의 설정을 분리해서 사용할 수 있다.
개발 환경과 테스트 환경이 같은 DB를 사용하면 테스트 중 생성하거나 수정한 데이터가 실제 개발 데이터에 영향을 줄 수 있다.
따라서 보통은
- 개발 환경(dev) → 파일 기반 DB
- 테스트 환경(test) → 메모리 기반 DB
를 사용한다.
SpringBootTest는 AssertJ가 기본 포함
일반 자바 프로젝트에서는 AssertJ를 사용하려면 build.gradle에 의존성을 추가해야 한다.
testImplementation("org.assertj:assertj-core:3.26.3")
하지만 Spring Boot 프로젝트에서는 spring-boot-starter-test에 AssertJ가 포함되어 있기 때문에 별도로 추가할 필요가 없다.
application-test.yml 생성
테스트 환경에서만 사용할 설정 파일을 만든다.
application-test.yml
spring:
datasource:
url: jdbc:h2:mem:db_dev;MODE=MySQL
application-test.yml은 test 프로파일이 활성화되었을 때만 적용된다.
테스트 클래스에는 아래 어노테이션을 추가한다.
@ActiveProfiles("test")
@SpringBootTest
class PostServiceTest {
}
@ActiveProfiles("test")를 붙이면 테스트 실행 시 test 프로파일이 활성화되어 application-test.yml 설정을 사용한다.
메모리 모드를 사용하는 이유
테스트에서는 아래 URL을 사용한다.
jdbc:h2:mem:db_dev;MODE=MySQL
여기서 mem은 메모리 모드를 의미한다.
메모리 DB는 프로그램이 실행되는 동안에만 존재하며, 종료되면 자동으로 삭제된다.
따라서
- 테스트가 끝나면 데이터가 자동으로 사라진다.
- 매번 DB를 직접 삭제하거나 초기화할 필요가 없다.
- 항상 깨끗한 환경에서 테스트를 실행할 수 있다.
@Transactional 테스트
@Transactional
public class PostRepositoryTest {
...
}
테스트 클래스에 @Transactional 을 붙이면 테스트 종료 후 트랜잭션이 롤백된다.
즉, DB가 자동으로 원래 상태로 복구된다.
각 테스트마다 붙일 필요 없이 클래스에 한 번만 붙이면 된다.
application-dev.yml 생성
개발 환경에서는 기존처럼 파일 기반 H2를 사용한다.
application-dev.yml
spring:
datasource:
url: jdbc:h2:./db_dev;MODE=MySQL
username: sa
password:
driver-class-name: org.h2.Driver
파일 모드이므로 애플리케이션을 종료해도 데이터가 그대로 유지된다.
application.yaml과의 관계
application-test.yml은 application.yaml의 내용을 모두 대체하는 것이 아니다.
기본적으로는 application.yaml을 먼저 읽고,
application-test.yml에 있는 내용만 덮어쓴다(Override).
기본 프로파일 지정
특별히 지정하지 않으면 dev 환경이 실행되도록 설정한다.
spring:
profiles:
active: dev
'BackEnd > Spring' 카테고리의 다른 글
| [Spring] Spring Boot에서 웹 요청은 어떻게 처리될까? (@Controller, @GetMapping) (0) | 2026.08.05 |
|---|---|
| [Spring] 외래키 (0) | 2026.08.04 |
| [Spring] BaseEntity와 @MappedSuperclass (0) | 2026.08.04 |
| [Spring] 더티 체킹(Dirty Checking) (0) | 2026.08.04 |
| [Spring] @Component, @Transactional, JPA Auditing (0) | 2026.07.31 |
댓글