[Spring] 데이터베이스 연동하여 테스트하기 ! (별도 DB, 임베디드 모드)

728x90

 

스프링 통합 테스트 애노테이션

`@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(김영한) - 인프런

728x90