kok202
스프링 부트 강의 정리 (28~30 : Database)

2019. 5. 19. 03:26[공부] 영상/스프링 부트 강의

스프링 프레임워크는 SQL DB에 접근하기 위해 다양한 방법등을 지원한다.

방법 1. JDBC를 직접 사용하는 방법(JdbcTemplate)

방법 2. MyBatis(Mapper)를 사용하는 방법

방법 3. JPA(ORM)을 사용하는 방법 등

 

 

 

 

 

DataSource

스프링 부트는 DataSource를 필요한 곳 어디에서든 재사용한다.

DataSource 를 정의하는 방법은 두가지가 있다.

방법 1. datasource를 커스텀하게 Bean 으로 등록하고 properties 이용하기

@Bean
@ConfigurationProperties(prefix="app.datasource")
public DataSource dataSource() {
	return new FancyDataSource();
}
app.datasource.url=jdbc:h2:mem:mydb
app.datasource.username=sa
app.datasource.pool-size=30

방법 2. spring boot 에서 제공하는 datasource를 사용하고 Properties를 이용하기

spring.datasource.url=jdbc:h2:mem:mydb
spring.datasource.username=sa
spring.datasource.pool-size=30

Configuration이 스프링 부트의 datasource에 알아서 설정이 주입된다. 

Hikari DB 를 쓰는경우 app.datasource.url 이 아니라 app.datasource.jdbc-url을 사용해야한다. 

*driver-class-name 설정은 url 설정만을 보고도 어떤 driver 가 필요한지 알아 낼 수 있는 경우가 있기 때문에 종종 필요가 없을 수 있다.

 

 

 

 

spring.datasource.url 설정이 있으면 Production DB라고 부른다.

spring.datasource.url 설정이 없으면 스프링 부트는 Embedded DB를 사용하려한다.

스프링 부트는 인메모리 DB 세가지(H2, HSQL, Derby)를 Embedded DB 로 지원한다. 

- Embedded DB를 사용하려면 원하는 인메모리 DB 의 depedency 를 가져오면 된다.

- 그런데 인메모리 DB를 사용하려면 spring-jdbc 의 depedency 를 가져와야 한다.

=> Embedded DB를 사용하려면 인메모리 DB 의 depedency, spring-jdbc 의 depedency 가 필요하다.

 

인메모리 DB를 사용한다면 DB가 스스로 끌 수 있도록 하는 설정을 활성화 해두지 않는 것이 좋다.

= 예를들면 H2 를 쓰고 있다면 DB_CLOSE_ON_EXIT=FALSE 를 해두어라

인메모리 DB의 종료마저도 스프링 부트가 관리하도록 하는 것이 좋다.

 

H2 요약 : https://kok202.tistory.com/85

 

[2019.03.16] H2와 Dialect

H2 - 스프링 내장형 데이터 베이스이다. - 인메모리 데이터 베이스이다. - 용량이 1.5M 밖에 안하고 가볍다. - 웹에서 쿼리를 할 수 있는 GUI를 제공한다. (http://localhost:8080/console/) - 테스트 단계에서 사..

kok202.tistory.com

 

 

 

 

 

스프링 부트를 통해 DB를 Initialize 할 수 있다.

스프링 부트는 DDL 스크립트를 통해 자동으로 스키마를 만들어주고 DML 스크립트를 통해 초기화 해준다. 

DDL 스크립트는 resources/schema.sql 으로 관리한다.

DML 스크립트는 resources/data.sql 으로 관리한다.

 

 

 

 

 

스프링 부트는 아래 알고리즘을 이용해서 DataSource Pooling 설정을 자동으로 주입받는다.

1. Hikari CP 가 있으면 이를 사용한다.

2. Tomcat DB CP가 있으면 이를 사용한다.

3. Commons DB CP가 있으면 이를 사용한다.

알고리즘을 무시하고 싶으면 spring.datasource.type 을 지정해주면된다.

 

 

 

 

 


JPA

spring-boot-starter-data-jpa 는 아래와 같은 모듈들에 의존성이 있다.

1. Hibernate : 가장 유명한 JPA 구현체

2. Spring Data JPA : JPA 기반의 Repository를 구현해주는 모듈

3. Spring ORMs : 스프링 프레임워크에 있는 Core ORM

 

Entity

JPA는 persistence.xml 을 이용해서 Entity를 관리하지만, 스프링 부트는 이를 필요로 하지않는다. 스프링 부트는 EntityScanning 과 @Entity를 이용해서 관리한다. EntityScanning은 @EnableAutoConfiguration 이나 @SpringBootApplication 둘 중 하나를 사용하기만 하면 알아서 스캐닝한다.

 

Repository

각종 JPA 쿼리들을 자동으로 만들어주고, 복잡한 쿼리는 사용자가 직접 만들어서 사용할 수 있도록 @Query 를 지원한다.

 

EntityManager

View 에서도 렌더링할 때 세션이나 EntityManager 에 접근해서 데이터를 가져올 수 있도록 되어있다. 위험할 수도 있으니 가능하면 끄는 것이 좋다.

 

JPA 관련 괜찮은 속성 (개발 : create-drop 추천, 배포 : validate 추천)

spring.jpa.hibernate.ddl-auto=create-drop: 스키마가 새로 생성

spring.jpa.hibernate.ddl-auto=update: Entity가 변동이 되면 스키마 맵핑을 할 수 있게 끔 바꿔준다.

spring.jpa.hibernate.ddl-auto=validate : Entity에 등록된 맵핑이 실제 DB에 뜨는 스키마와 맵핑이 되는지 검증을 한다.

 

짧은 지식

* JPA DDL의 실행, 검증은 ApplicationContext가 실행이 될 때까지 지연이 된다.

 

* ApplicationRunner 타입을 상속받고 빈으로 등록하면 스프링 어플리케이션이 실행되면 알아서 run 메소드를 실행한다.

 

* JOOQ : Type-safe 하게 코드를 작성할 수 있는 QueryDSL