새소식

Programming/Spring

[Spring Boot] Embeded Mode로 테스트 하기 (feat. H2 Database)

 

 

H2 데이터베이스의 두 가지 모드

 

H2 데이터베이스는 서버 모드(Server Mode)와 내장 모드(Embeded Mode) 중 하나로 선택하여 사용할 수 있다.

그중 Embeded 모드는 H2 DB를 애플리케이션 내부에 포함시켜 사용하는 모드로, 애플리케이션과 함께 실행되는 내장 데이터베이스로 활용된다. 애플리케이션이 종료되면 Embeded 모드로 동작하는 H2 DB도 함께 종료되고, 데이터도 함께 사라진다.

 

Embeded 모드를 사용하면 별도의 서버 프로세스를 실행할 필요가 없고, DB 파일이나 인메모리 DB를 사용하여 간단하게 데이터를 저장하거나 검색할 수 있다.

 

 

 

테스트의 필요성과 고려사항

 

소프트웨어 개발에서 테스트는 매우 중요한 단계다. 코드에서 발생할 수 있는 버그를 조기에 발견하여 수정할 수 있고, 코드에 변경이 있을 때 기존 동작에 부정적 영향을 미치는지 확인할 수 있어 유지보수가 용이해진다.

 

테스트를 할 때는 고려해야 할 몇 가지 주요 사항들이 있다.

 

  • 명확하고 이해하기 쉬워야 함
  • 각 테스트는 다른 테스트와 격리되어 독립적으로 실행될 수 있어야 함
  • 반복적으로 실행할 수 있어야 함
  • 실행 환경에 독립적이어야 함

 

Embeded 모드의 테스트는 반복적인 실행이 가능하며, 각 테스트가 독립적으로 실행되도록 하는 좋은 방법인 것이다.

 

 

 

Embeded Mode로 테스트 수행하기

 

Spring Boot는 데이터베이스에 대한 특별한 설정이 없으면 내장 데이터베이스를 사용하는데,

몇 가지 설정과 코드 예시를 통해 Embeded Mode로 테스트하는 방법을 알아보고자 한다.

여기서는 데이터 접근 방법으로 MyBatis를 사용하였다. 

 

1. build.gradle 설정

dependencies {
    //H2 데이터베이스 사용
    runtimeOnly 'com.h2database:h2'
}

 

H2 데이터베이스를 사용하기 위해 라이브러리를 추가한다.

 

 

2. application.properties (main/resources/) 설정

spring.profiles.active=local

spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.username=sa

 

`main/resources/application.properties`에 profile과 데이터베이스의 설정을 추가한다.

 

 

3. application.properties (test/resources/) 설정

spring.profiles.active=test

 

`test/resources/application.properties`에 profile 설정을 추가한다.

테스트 케이스는 test 패키지 내의 `application.properties`의 설정을 우선적으로 적용하니 참고하자.

 

 

4. 테스트 코드 작성

@Transactional
@SpringBootTest
class UserRepositoryTest {

    @Autowired
    UserRepository userRepository;

    @Test
    void save() {
        User user = new User("star", "0121");
        User savedUser = userRepository.save(user);

        assertThat(savedUser.getUserName()).isEqualTo("star");
        assertThat(savedUser.getPhoneNum()).isEqualTo("0121");
    }

    @Test
    void findById() {
        User user = new User("cckk", "038");
        User savedUser = userRepository.save(user);
        User foundUser = userRepository.findById(savedUser.getId()).orElse(null);
        assertThat(foundUser.getUserName()).isEqualTo("cckk");
    }

    //이하 생략
}

 

테스트 데이터 초기화를 위해 `@Transactional`을 사용한다.

테스트에서 해당 애너테이션을 사용하면 테스트 종료 시 트랜잭션을 자동으로 롤백하기 때문에 데이터가 초기화될 수 있는 것이다.

 

 

5. schema.sql 작성

create table users (
     id        bigint generated by default as identity,
     user_name varchar(10),
     phone_num varchar(25),
     primary key (id)
);

 

`test/resources/schema.sql`에 테이블 생성 쿼리를 작성하면 테스트를 실행할 때마다 테이블을 자동으로 생성해 준다.

해당 파일의 경로와 파일명은 변경해서는 안되니 주의하자.

 

 

이제 테스트를 반복적으로 실행해도 모두 성공할 것이다.

 

 

 

만약 테스트에 실패한다면 테스트 로직에 문제는 없는지, SQL 쿼리에 오타는 없는지, 사용하는 테이블명이 예약어는 아닌지 점검해 보자.

위에서 언급한 모든 설정 파일은 경로가 특히 중요하다. 

`application.properties`와 `schema.sql`의 경로도 다시 체크해 보자.

 

 

 

 

 

참고

  • 스프링 DB 2편 - 데이터 접근 활용 기술 (김영한)

 

 

Contents

Copied URL!

Liked this Posting!