테스트 코드 작성중 매번 initData 들을 빌더로 생성해서 테스트를 하니까 JPA 테스트를 할 때에 상당히 불편했다.
스터디 도중 방법을 알게되어 포스팅한다.
여러 방법이 있을텐데 main의 resources
에 application-test.yaml
이라는 프로퍼티를 구현했다.
그리고서는 @ActiveProfiles("test")
을 Test할 클래스에 입력해주게 되면 그 클래스는 프로퍼티를 설정해준 값으로 설정이 되어 동작한다.
기본적으로 스프링 부트에서 테스트코드에서 db를 실행해주는데 data.sql
과 scheme.sql
이라고 한다.
Spring은 EntityScan을 통해 @Entity
어노테이션이 명시한 클래스를 찾는다.
spring.jpa.generate-ddl=true
옵션을 true로 설정하면 해당 데이터를 근거로 서버 시작 시점에 DDL문을 생성하여 DB에 적용한다.
jpa.generate
설정은 JPA 구현체 DDL생성 옵션의 링크이고, true/false
밖에 선택할 수 없다.
대부분 구현체로 Hibernate를 사용하기 때문에 spring.jpa.hibernate.ddl-auto
옵션을 통해서 보다 상세한 데이터베이스 초기화 전략을 설정할 수 있다.
Spring 기본값으로 classpath
루트에 schema.sql
파일이 있다면 서버가 시작할 때 스크립트를 실행한다. schema.sql
은 DDL
스크립트를 명시해두고, DML문은 data.sql
파일로 작성해두면 역시 자동으로 실행한다.
Hibernate
에도 기본 실행 스크립트가 있다는 점을 조심해야 한다.
Hibernate
는 classpath
루트의 import.sql
파일이 있다면 서버 시작시 해당 스크립트를 자동 실행한다.
만약 Spring이 인식하는 schema.sql
파일과 data.sql
파일이 있거나, spring.datasource.data
옵션을 통해 추가로 적용할 스크립트 파일을 지정했음에도 불구하고, 동일 내용으로 import.sql
파일을 작성한다면 중복 입력으로 오류가 발생할 수 있다.
추가로, Hibernate
가 인식하는 import.sql
파일의 경우, 각 명령을 한 줄로 작성해야 문법오류가 발생하지 않는다
또한, JPA는 schema-${platform}.sql
과 data-${platform}.sql
파일이 있다면 실행시켜 데이터베이스 플랫폼에 맞춘 스크립트 실행이 가능하다. 사용할 플랫폼 정의는 spring.datasource.platform
값을 따른다
커스텀으로 Data들을 넣어주려고 할때는 임의의 sql 파일을 생성해준 다음에
테스트 진행할 클래스에서 @Sql("classpath:만든 sql파일.sql")
을 넣어주면
쿼리문을 쭉 로딩하면서 넣어준다.