JPA DDL

XingXi·2023년 12월 27일
0

JPA

목록 보기
7/23
post-thumbnail

🍕 Reference

자바 ORM 표준 JPA 프로그래밍 : 교보문고
자바 ORM 표준 JPA 프로그래밍 - 기본편 : 인프런

DDL

Data Define Language
테이블을 정의하는 언어

Application 에서 DDL 을 사용해서 Table 을 정의할 수 있는 기능을 JPA 에서 제공해준다.
Hibernate 구현체에서 다음과 같이 사용하면 Application Loading 시
Application 에 정의된 Entity 정보를 사용해서 Table 을 정의할 수 있다.

persistence.xml

<property name="hibernate.hbm2ddl.auto" value="create" /> 
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
             xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
    <persistence-unit name="hello">
        <properties>
            <!-- JDBC 필수정보 -->
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="javax.persistence.jdbc.user" value="sa"/>
            <property name="javax.persistence.jdbc.password" value=""/>
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
            
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> 
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.use_sql_comments" value="true"/> 
            <property name="hibernate.hbm2ddl.auto" value="create" /> 
        </properties>
    </persistence-unit>
</persistence>

application.properties

spring.jpa.hibernate.ddl-auto=none

JPA 구현체인 Hibernate 에서 제공하는 다음 기능을 사용하면 Application Loading 시점에
DB Scheme 가 자동으로 생성된다.

종류

valuedescription
create기존 테이블 삭제 후 다시 생성 ( DROP + CREATE )
create-dropcreate 와 동일하지만 종료 시점에 drop
update변경 부분만 반영
validate엔티티와 테이블이 정상 Mapping 됐는지 확인만함
none사용하지 않음

create

Application Loading 시 @Entity 로 선언된 Entity 들을
DataBase 에서 DROP 하고 Create 한다.
즉 DB 테이블을 모두 지우고 모두 다시 생성한다

<property name="hibernate.hbm2ddl.auto" value="create" />

  1. 먼저 Table 을 모두 DROP
  2. Table 을 모두 생성

create-drop

Application Loading 시 create 일때와 같이 동작하고 Application 이 종료될 때 DB 의 모든 테이블 DROP

<property name="hibernate.hbm2ddl.auto" value="create-drop" />`


1. 모든 테이블 drop
2. @Entity 로 선언된 Entity 모두 생성
3. Application 종료 전 모든 Table DROP


update

Application Loading 시 DB 스키마와 @Entity 로 선언된 테이블을 비교하여
변경된 부분이 존재한다면 Alter DDL 이 발생 DB 테이블 스키마를 변경

<property name="hibernate.hbm2ddl.auto" value="update" />`
  1. 다음과 같은 DB 스키마를 가진 Table 을 생성
  2. 이후 @Entity 에 필드를 추가하고 다시 Application Loading
  • alter DDL 이 발생하여 DB 스키마를 변경하는 것을 볼 수 있다.
    주의할 점은 필드가 추가하는 것은 인지하지만 필드가 삭제되는 것은 인지하지 못한다.
    DB LOCK 이 발생 할 수 있다.

validate

Application Loading 시 엔티티와 테이블이 정상 Mapping 됐는지 확인

<property name="hibernate.hbm2ddl.auto" value="validate" />`
  1. 새로운 필드 추가
  2. 예외 발생
  • 테이블에 존재하지 않은 필드라는 예외가 발생한것을 볼 수 있다.

none

옵션을 사용하지 않음


@Column

필드 설정을 위한 다양한 속성을 제공하는 Annotation

property namedescription
name필드 이름 지정
updatable필드 수정 가능 여부
insertable필드 데이터 삽입 가능 여부
notNull필수 값인지 설정 여부
unique필드가 unique 값인지 설정
(파악하기 어려워서 잘 사용하지 않음 )
length필드 길이
columnDefinition직접 DDL 정의
percision, scaleBigDecimalType 에서 소수점 표시
  • DDL 자동 생성 시 적용된다 ( JPA 로직에 영향을 주진 않는다.)

주의점

운영환경에서는 create, create-drop, update 를 사용하면 절대 안된다.
위에서 볼 수 있듯이 실 데이터들이 모두 삭제될 수 있고 DB LOCK 이 걸려
엄청난 손실을 얻을 수 있다.

환경사용가능한 옵션
개발 초기create, update
테스트 서버update, validate ( 사실 update 도 추천하진 않는다)
스테이징 , 운영서버valdate, none ( 안쓰는게 제일 낫다)

결론

환경에 따라 적절히 사용해야할 기능이다.
특히 운영환경이나 스테이징 서버에서 사용할 때 옵션에 유의하자
local 에서 개발을 진행할때 DB 를 비우기 위해서 create 옵션을 많이 사용했는데
자세히 알아보니 다양한 기능이 있다는 것을 알게 되었다.

0개의 댓글