백엔드/JPA

[ JPA ] 6-1. 영속성 컨텍스트(Persistence Context)

Reference. 한 번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online

이전 글

기본 개념

  • Context: 프레임워크에서 컨테이너들이 관리하고 있는 내용들을 일컬음 → Persistence Context: Persistence 컨테이너가 관리하고 있는 내용
  • Persistence(영속화): 사라지지 않고 지속적으로 접근할 수 있는 것을 의미
    • 메모리의 존재하는 데이터는 서비스가 종료되면 사라짐
    • 파일, 데이터베이스에 저장하면 서비스에 상관 없이 사라지지않고 존재
  • EntityManager: 영속성 컨텍스트의 주체적인 역할
  • JPA를 사용하기 위해 META-INF > persistence.xml 을 통해 설정이 필요
    • 스프링 부트build.gradleorg.springframework.boot:spring-boot-starter-data-jpa 를 통해 Persistence Context에 설정을 처리build.gradle
    • dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' ... }
  • 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)에선 defaultddl-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.4 spring.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 {
		...
}