Reference. 한 번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online
이전 글
더보기
기본 개념
Context
: 프레임워크에서 컨테이너들이 관리하고 있는 내용들을 일컬음 → Persistence Context: Persistence 컨테이너가 관리하고 있는 내용
Persistence
(영속화): 사라지지 않고 지속적으로 접근할 수 있는 것을 의미- 메모리의 존재하는 데이터는 서비스가 종료되면 사라짐
- 파일, 데이터베이스에 저장하면 서비스에 상관 없이 사라지지않고 존재
EntityManager
: 영속성 컨텍스트의 주체적인 역할
- JPA를 사용하기 위해
META-INF > persistence.xml
을 통해 설정이 필요- 스프링 부트는 build.gradle에
org.springframework.boot:spring-boot-starter-data-jpa
를 통해 Persistence Context에 설정을 처리build.gradle dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' ... }
- 스프링 부트는 build.gradle에
Dialect
- 데이터베이스 방언을 의미 → 각각의 DB마다 다른 부분을 맞춰주는 기능
- JPA는 ORM을 통해 데이터베이스 쿼리로 변환을 해서 JDBC를 통해 전달 → 특정 데이터베이스에 쿼리를 자동으로 변경해 줄 때 사용 (varchar, varchar2 등)
데이터베이스 변경(H2 → Mysql)
build.gradle
dependencies {
...
runtimeOnly 'mysql:mysql-connector-java'
}
application.yml
spring:
h2:
console:
enabled: true
jpa:
defer-datasource-initialization: true
show-sql: true
properties:
hibernate:
format_sql: true
generate-ddl: true
hibernate:
ddl-auto: create-drop //create, create-drop, update, validate, none
datasource: //mysql database 정보로 수정
url: jdbc:mysql://localhost:3306/book_manager
username: root
password: root
logging:
level:
# org.hibernate.SQL: DEBUG
org.hibernate.type: trace
spring.jpa.generate-ddl
:H2(임베디드 DB)
에선 자동 생성,Mysql(상용)
에선 설정 필요
spring.jpa.hibernate.ddl-auto
none
: ddl-auto 실행하지 않는 옵션
create
: 항상 새로 생성하는 옵션 ( drop → create )
create-drop
: 생성하고 종료될 때 자동으로 drop ( create → drop )
update
: 실제 스키마와 엔티티를 비교해서 변경된 부분만 반영 ( drop X )
validate
: 스키마와 엔티티를 비교만하고 다른 경우 오류 발생
현업에서도 놓치기 쉬운 옵션들 간의 차이 및 우선순위
- 테스트 환경
- H2 데이터베이스를 사용해서 자동으로 DDL 처리를 설정
generate-ddl
,ddl-auto
옵션을 사용할 필요가 없음
- 운영 환경
- 자동화 된 ddl을 사용하는 경우 리스크가 발생
generate-ddl: false
,ddl-auto: none
으로 지정
- 간혹
ddl-auto: validate
는 사용
generate-ddl
-ddl-auto
옵션의 차이generate-ddl
- 구현체와 상관없이 자동화된 ddl을 사용하도록 하는 옵션
- 범용적인 옵션
ddl-auto
- hibernate에 특화된 구체적인 옵션
- 스프링에선 임베디드 DB(H2)에선 default로
ddl-auto: create-drop
- 스프링에 우선순위는
ddl-auto
>generate-ddl
ddl-auto
옵션이 존재하면generate-ddl
옵션은 무시 →ddl-auto: false
,ddl-auto: create-drop
인 경우ddl-auto
옵션으로 실행
spring.sql.init.mode
옵션 (Spring 2.4spring.datasource.initialization-mode
)- 운영 데이터베이스(
Mysql
, 등)가 실행될 때 초기 SQL 실행 여부(data.sql
,schema.sql
)
spring.sql.init.mode(schema.sql)
,ddl-auto
옵션 충돌이 발생할 수 있음 → 스프링에 우선순위 옵션spring.sql.init.mode
>ddl-auto
- 운영 데이터베이스(
테스트 코드 수정하기
- 테스크 클래스 상단에
@Transactional
을 선언하면 각 테스트 메소드가 종료될 때 마다 Rollback
@SpringBootTest //스프링 컨텍스트를 사용하겠다.
@Transactional
class UserRepositoryTest {
...
}
'백엔드 > JPA' 카테고리의 다른 글
[ JPA ] 6-3. Entity 생명주기 (1) | 2021.08.08 |
---|---|
[ JPA ] 6-2. Entity 캐시 (0) | 2021.08.07 |
[ JPA ] 5-5. Entity Relations ( N:N @ManyToMany ) (0) | 2021.08.01 |
[ JPA ] 5-4. Entity Relations ( N:1 @ManyToOne ) (0) | 2021.08.01 |
[ JPA ] 5-3. Entity Relations ( 1:N @OneToMany ) (0) | 2021.07.25 |