스프링 통합 테스트 애노테이션
`@SpringBootTest`
: 스프링 컨테이너와 테스트를 함께 실행한다.
: @SpringBootApplication 을 찾아 설정으로 사용한다.
`@Transactional` : 테스트를 완료한 뒤 항상 rollback 하여 DB에 반영되지 않도록 한다.
`@Commit`
: @Transactional 이라도 commit 하여 DB에 저장된다.
: @Rollback(false) 와 같은 기능이다.
데이터베이스 연동하여 테스트하기
테스트의 중요한 원칙
- `테스트는 다른 테스트와 격리해야 한다.`
- `테스트는 반복해서 실행할 수 있어야 한다.`
1. 테스트 데이터베이스 별도 운영하기
로컬의 서버 데이터베이스에서 테스트를 실행하면, 테스트의 실행 결과가 서버 데이터베이스에 반영되는 큰 문제가 발생한다.
따라서 별도의 테스트 데이터베이스를 만들어 운영해야 한다.
- 초기 설정
우선, test 에 있는 application.properties 에 해당 설정을 추가해 주어야 테스트 데이터베이스가 연동된다.
spring.datasource.url=jdbc:h2:tcp://localhost/~/testcase
spring.datasource.username=sa
(`jdbc:h2:~/testcase` 로 최초 접속 하고, 이후 `jdbc:h2:tcp://localhost/~/testcase` 로 접속해야 한다.)
- @Transactional
그리고 데이터베이스에 테스트 결과가 누적되어 저장되면, 각각의 테스트가 올바르게 실행되지 않을 수도 있다.
따라서 `@Transactional` 을 사용하여 테스트 데이터에 트랜잭션을 적용하고,
테스트가 끝나면 트랜잭션을 자동으로 롤백시켜 테스트 데이터베이스에 결과가 남지 않도록 해야 한다.
(테스트에서는 @Transactional 을 사용하면, 성공적으로 수행돼도 커밋하지 않고 항상 롤백한다.)
이때, `@Commit` 을 통해 강제로 커밋하여 테스트 데이터베이스의 결과를 직접 확인할 수도 있다.
2. 테스트 데이터베이스 임베디드 모드로 운영하기
테스트 데이터베이스는 테스트가 종료되면 데이터베이스의 모든 데이터를 삭제해도 된다.
- 임베디드 모드
임베디드 모드는 데이터베이스를 JVM 안에서 메모리 모드로 실행할 수 있다.
또한 애플리케이션이 종료되면 임베디드 데이터베이스도 종료되고, 데이터도 모두 사라진다.
@Bean
@Profile("test")
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.h2.Driver");
dataSource.setUrl("jdbc:h2:mem:db;DB_CLOSE_DELAY=-1");
dataSource.setUsername("sa");
dataSource.setPassword("");
return dataSource;
}
우선, 사용할 DataSource 를 직접 빈으로 등록한다.
`@Profile`
: 프로필이 test 인 경우에만 해당 DataSource 를 빈으로 등록할 수 있도록 한다.
(test 의 application.properties 에 `spring.profiles.active=test` 옵션이 있어야 한다.
test 라는 프로필이 일치하는 경우 해당 메서드 실행하여 빈을 등록한다.)
`jdbc:h2:mem:db` : DataSource 를 만들 때 임베디드 모드로 동작하는 데이터베이스를 사용할 수 있다.
`DB_CLOSE_DELAY=-1`
: 임베디드 모드에서 데이터베이스 커넥션 연결이 모두 끊어지면 데이터베이스도 종료되는 것을 방지하는 설정이다.
drop table if exists item CASCADE;
create table item
(
id bigint generated by default as identity,
item_name varchar(10),
price integer,
quantity integer,
primary key (id)
);
그리고 test/resources 에 `schema.sql` 이라는 파일을 추가하여 데이터베이스 테이블을 초기화해준다.
- 스프링 부트와 임베디드 모드
스프링 부트는 데이터베이스에 대한 설정이 존재하지 않으면, 임베디드 데이터베이스를 기본으로 사용한다.
위처럼 DataSource 를 빈으로 직접 등록하지 않아도,
`schema.sql` 파일로 데이터베이스 테이블만 생성해도 스프링 부트가 자동으로 임베디드 모드로 실행해 준다.
출처 | 스프링 DB 2(김영한) - 인프런
'💠프로그래밍 언어 > Spring' 카테고리의 다른 글
[Spring] JPA 소개 및 사용 예시 (0) | 2025.05.02 |
---|---|
[Spring] MyBatis 사용법 익히기 ! (1) | 2025.05.01 |
[Spring] JdbcTemplate 상세 사용법 정리 (1) | 2025.04.30 |
[Spring] 에러 코드로 예외 처리하기, 스프링 예외 추상화 사용하기 (0) | 2025.04.23 |
[Spring] 스프링 트랜잭션의 추상화, 템플릿, AOP 그리고 자동 등록까지 (0) | 2025.04.23 |