JAVA/JAVA | Spring 학습기록

[Spring] 테스트에서 test 스키마가 아닌 main의 스키마를 의존한다면? _ application.yml 설정

kth990303 2022. 6. 9. 00:25
반응형

아래 그림과 같이 main과 test 패키지에서 따로 db를 생성해야 한다고 해보자.

테스트에서는 매번 drop table if exists를 해주지만, main에서의 schema.sql에서 drop table을 해줄 경우에 배포할 때마다 데이터들이 리셋되므로 정말 큰일나게 된다. 이렇게 테스트 때와 실제 실행에서의 schema.sql을 다르게 해주고 싶다면 어떻게 해야 할까?

 

@Sql 어노테이션을 쓰는 방법으로 해결된다고들 하지만, 나는 그 방법으로 해결되지 않았다.

test 클래스마다 @Sql 어노테이션으로 classpath prefix까지 붙여주면서 사용해보아도 자꾸 test_schema가 아닌 메인 패키지의 schema.sql을 의존했다. 아직도 이 부분은 명확한 이유를 모르겠다..

 

그럼 어떻게 해결했느냐?

application.yml 설정으로 init schema 설정해주기

spring:
  profiles.active: test
  datasource:
    url: jdbc:h2:mem:testdb;MODE=MYSQL
    username: sa
    driver-class-name: org.h2.Driver
  h2.console.enabled: true
  mvc.pathmatch.matching-strategy: ANT_PATH_MATCHER
  sql:
    init:
      schema-locations: classpath:test_schema.sql
      data-locations: classpath:data.sql
      mode:

spring.profiles.active 로 test일 때만 이 세팅을 이용하도록,

sql.init의 schema-locations로 어떤 스키마를 사용할지, data-locations로 어떤 데이터를 사용할지 추가해주었다.

 

참고로 위 application.yml 은 테스트 패키지에 존재한다.

main의 application.yml은 따로 sql.init을 해주지 않아도 알아서 메인의 schema.sql이 잘 돌아가는 듯하다.

 

+) 만약 로컬에서 서버를 실행할 때, schema.sql 중첩 문제가 발생해서 이미 table이 존재한다고 뜬다면 아래와 같이 create table if not exists 문법을 사용해주자.


서버에서 실행이 잘 되어 싱싱한 감자들이 남아있음을 확인할 수 있다~

 

drop table을 하지 않으니 로컬에서 실행하더라도 데이터가 남아있는 것 또한 확인할 수 있다! 실제로 회원가입된 회원들이 재실행하고 난 뒤에도 데이터가 남아있음을 확인할 수 있었다.

반응형