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
스프링 부트를 통해 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
'[공부] 영상 > 스프링 부트 강의' 카테고리의 다른 글
스프링 부트 강의 정리 (35~37 : Actuator) (0) | 2019.05.25 |
---|---|
스프링 부트 강의 정리 (31~34 : NoSQL, API Client) (0) | 2019.05.19 |
스프링 부트 강의 정리 (26 ~ 27 : Security) (0) | 2019.05.11 |
스프링 부트 강의 정리 (23 ~ 25 : 웹플럭스, 컨테이너) (0) | 2019.05.11 |
스프링 부트 강의 정리 (21~22 : 테스트 자동 설정 Annotations) (0) | 2019.04.28 |