Spring

[ SpringBoot - JUnit 5 ] Dev , Test DB 분리 ( feat. h2 )

walwal_ 2023. 10. 9. 16:41

 

Test 코드를 작성 할 때 DB 환경을 분리해 왔습니다.

하지만 초기 설정 때 마다 기억이 잘 나지않아 이번에 Dev 와 Test 를 분리하는 방법을 기록하려 합니다.

 

이 프로젝트는 gradle 환경이며 yaml 파일을 사용 중입니다.

이번 게시글의 목표는 Dev - Sqlite , Test - h2 를 사용해 실행 확인을 마치는 것입니다. 

 

++ h2 사용하며 발생했던 문제

 

 

 

application.yaml 

먼저 Dev 환경의 DB 설정입니다.

개인 프로젝트이기 때문에 sqlite 를 사용 하고 있습니다.

spring:
  datasource:
    url: jdbc:sqlite:db.sqlite
    driver-class-name: org.sqlite.JDBC
  jpa:
    hibernate:
      ddl-auto: create
    show-sql: true
    database-platform: org.hibernate.community.dialect.SQLiteDialect
    defer-datasource-initialization: true
  sql:
    init:
      mode: always

 

 

 

build.gradle

h2 를 사용하기 위해 의존성을 추가해 줍니다.

//H2
runtimeOnly 'com.mysql:mysql-connector-j'
implementation 'com.h2database:h2'

 

 

 

application-test.yaml 

 

test 를 위한 yaml 을 만들어 줍니다.

application-{..프로퍼티 명..}.yaml 형태로 만들어야 원하는 동작을 기대할 수 있으니 주의해 주세요! 

spring:
  datasource:
    url: jdbc:h2:mem:testdb
    username: sa
    password:
    driver-class-name: org.h2.Driver
  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        format_sql: true
  sql:
    init:
      mode: always

 

 

 

 

 

Test

 

test 코드에서, application-test.yaml 을 사용하도록 test 클래스에 @ActiveProfiles("test") 를 명시 해 줍니다.

@ActiveProfiles("test") 여기서 test 는 이전 단계에 생성해 주었던 application-test.yaml 입니다.

@SpringBootTest
@Transactional
@ActiveProfiles("test")
class JobRepositoryTest {

    @Autowired
    JobRepository jobRepository;
    
    ... 생략 ...
    
    @BeforeEach
    public void init() {
        jobRepository.save(new Job(1, 1,"카카오","BE",100000,"BE 포지션","Java","KOR","PUS",new ArrayList<>()));
    }
    
    @DisplayName("공고 저장 테스트")
    @Test
    void save() {

        // given
        Job job = new Job(2, 1, "카카오", "BE", 100000, "BE 포지션", "Java", "KOR", "PUS", new ArrayList<>());

        // when
        Job saveJob = jobRepository.save(job);

        // then
        assertThat(jobRepository.findAll().size()).isEqualTo(2);
        assertThat(jobRepository.findById(jobSequence).get().getId()).isEqualTo(saveJob.getId());
    }
    
}

 

 

 

 

여기까지 설정을 마친 후 테스트를 실행하면 h2 DB 가 연결 되었음을 확인할 수 있습니다,

 

또한 로그를 살펴보면 아래와 같이 SQL 문이 잘 실행이 됐고,

테스트도 문제 없이 통과하였음을 확인할 수 있습니다.

 

 

감사합니다!!