Data Source vs DataSource
- Data Source : 데이터베이스
- Datasource : 데이터베이스와 물리적, 논리적으로 연결을 관리하는 Java클래스
Spring에서 Datasource 설정
- application.properties에서 다음과 같이 설정할 수 있다.
- 만일 해당 설정이 없다면 기본적으로 내장 메모리인 h2에 연결된다.
spring.datasource.url=jdbc:mysql://localhost:3306/exampledb
spring.datasource.username=sa
spring.datasource.password=sa1234
- 다음과 같이 클래스를 만들어 DataSourceBuilder를 통해 생성할 수도 있다.
@Configuration
public class DatasourceConfig {
@Bean
@ConfigurationProperties("foo.datasource")
public DataSource getDatasource() {
DataSourceBuilder dsb = DataSourceBuilder.create();
dsb.password(securePasswordService());
return dsb.build();
}
- 여기서 ConfigurationProperties는 인자의 값을 통해 application.properties에서 값을 가져온다.
Spring에서 datasource 초기화
- spring.datasource.initialization-mode의 값을 변경하여 설정할 수 있다.
- Embedded : 기본값이며 H2와 같은 내장 데이터베이스에서 초기화를한다.
- Always : 항상 초기화함
- Never : 초기화하지 않음
- spring.jpa.hibernate.ddl-auto를 통해 초기화 방법을 설정할 수 있다.
- create : 정의된 Entity의 모든 테이블을 drop하고 새로 생성
- create-drop : 테이블을 생성하고 종료될 때 drop
- update : 현재의 Entity의 테이블에 맞춰 이전의 테이블을 옮김
- validate : 테이블이나 열이 없으면 예외 처리함
- none : 테이블을 초기화하지 않음
- spring.jpa.show-sql을 통해 자동으로 생성되는 SQL문을 콘솔에 출력할 수 있다.
- spring.jpa.properties.hibernate.format_sql을 통해 indent를 추가해 보기 쉽게 SQL문을 볼 수 있다.
Datasource에서 Unit test
- @DataJpaTest : application.properties 파일의 설정 없이 테스트할 수 있다. 자동으로 내장메모리를 사용할 수 있다면 자동으로 설정하고 사용한다. Spring Data JPA Repository와 Entity만 실행하고, Service나 Controller는 실행되지 않는다.
- TestEntityManager : 테스트 데이터에 EntityManager를 사용하기 위해 존재한다. @DataJpaTest에서 사용가능하다.
- @AutoConfigureTestDatabase : Spring의 자동으로 테스트할 때 기존의 데이터베이스를 대체하는 설정을 변경한다. 아래 코드는 @DataJpaTests에서 내장메모리를 사용하는 것을 막는다.
@AutoConfigureTestDatabase(replace=Replace.NONE)