Spring/jpa

[JPA] persistence.xml

라임온조 2023. 2. 9. 10:03

1. 개념

jpa는 persistence.xml을 사용해서 필요한 설정 정보를 관리한다.

 

2. 위치

resources - META-INF - persistence.xml

 

3. 내용

<?xml version="1.0" encoding="UTF-8"?>
<!--xml 네임스페이스와 사용할 버전 지정-->
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
<!--영속성 유닛 - 연결할 데이터베이스당 하나의 영속성 유닛을 등록함 name은 영속성 유닛의 고유한 이름-->
    <persistence-unit name="jpastudy">
        <properties>
        <!--필수-->
            <!--JPA 표준 속성 - 특정 구현체에 종속되지 않는다-->
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> <!--jdbc 드라이버-->
            <property name="javax.persistence.jdbc.user" value="root"/> <!--데이터베이스 접속 아이디-->
            <property name="javax.persistence.jdbc.password" value=""/> <!--데이터베이스 접속 비밀번호-->
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpa_study"/> <!--데이터베이스 접속 URL-->
            <!--하이버네이트 속성 - 하이버네이트 전용 속성이라 하이버네이트에서만 사용할 수 있다-->
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/> <!--데이터베이스 방언 설정-->
        <!--옵션-->
            <property name="hibernate.show_sql" value="true"/> <!--하이버네이트가 실행한 sql을 출력-->
            <property name="hibernate.format_sql" value="true"/> <!--하이버네이트가 실행한 sql을 출력할 때 보기 좋게 만듦-->
            <property name="hibernate..use_sql_comments" value="true"/> <!--쿼리를 출력할 때 주석도 함께 출력-->
            <property name="hibernate.id.new_generator_mappings" value="true"/> <!--jpa표준에 맞춘 새로운 키 생성 전략을 사용-->
            <property name="hibernate.hbm2ddl.auto" value="create"/> <!--애플리케이션 실행 시점에 데이터베이스 테이블을 자동으로 생성-->
			
        </properties>

    </persistence-unit>
</persistence>

4. 데이터베이스 방언

JPA는 특정 데이터베이스에 종속적이지 않은 기술이다. 

특정 데이터베이스만의 고유한 기능이나 SQL 표준을 지키지 않는 것을 JPA에서는 방언이라고 하는데, 하이버네이트를 포함한 대부분의 JPA 구현체들은 이런 문제를 해결하려고 다양한 데이터베이스 방언을 제공하기 때문이다.

따라서, 데이터베이스가 변경되어도 애플리케이션 코드를 변경할 필요가 없이 데이터베이스 방언만 교체하면 된다.

 

5. hibernate.hbm2ddl.auto

1) 개념

테이블 자동생성 기능

2) 속성

create

  • 기존 테이블을 삭제하고 새로 생성
  • 개발 초기

create-drop

  • create 속성에 추가로 애플리케이션을 종료할 때 생성한 DDL을 제거

update

  • 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 변경 사항만 수정
  • 개발 초기, 테스트 서버

validate

  • 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션을 실행하지 않는다. DDL을 수정하지 않음
  • 테스트 서버, 운영 서버

none

  • 자동 생성 기능을 사용하지 않기위해 주는 유효하지 않은 옵션 값
  • 운영 서버

3) 특징

main 함수에 아무것도 안 적어도 실행만 하면 자동으로 테이블 만들어 주는 줄 알았는데 아니었다. 적어도 EntityManagerFactory는 생성해야 테이블 만들어 주는 코드가 작동한다. 

 

왜 이런가 싶어서 검색을 해 봤다.

ddl-auto 옵션은 Hibernate의 SchemaManagementTool이 관리하고, SchemaManagementTool은 SessionFactory 라이프사이클의 일부로, SessionFactory가 생성되거나 종료될 때 자동으로 동작한다고 한다. 따라서 ddl-auto 옵션은 SessionFactory가 생성되거나 종료될 때 적용되는 것이다. 

그리고 이 Hibernate에서의 SesstionFactory가 JPA에서는 EntityManagerFactory라고 볼 수 있다.

 

따라서, EntityManagerFactory가 생성되지 않는다면 ddl-auto 옵션도 적용이 안 되었던 것이다.