자바 ORM 표준 JPA 프로그래밍 : 교보문고
자바 ORM 표준 JPA 프로그래밍 - 기본편 : 인프런
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 가 자동으로 생성된다.
value | description |
---|---|
create | 기존 테이블 삭제 후 다시 생성 ( DROP + CREATE ) |
create-drop | create 와 동일하지만 종료 시점에 drop |
update | 변경 부분만 반영 |
validate | 엔티티와 테이블이 정상 Mapping 됐는지 확인만함 |
none | 사용하지 않음 |
Application Loading 시 @Entity 로 선언된 Entity 들을
DataBase 에서 DROP 하고 Create 한다.
즉 DB 테이블을 모두 지우고 모두 다시 생성한다<property name="hibernate.hbm2ddl.auto" value="create" />
Application Loading 시 create 일때와 같이 동작하고 Application 이 종료될 때 DB 의 모든 테이블 DROP
<property name="hibernate.hbm2ddl.auto" value="create-drop" />`
1. 모든 테이블 drop
2. @Entity 로 선언된 Entity 모두 생성
3. Application 종료 전 모든 Table DROP
Application Loading 시 DB 스키마와 @Entity 로 선언된 테이블을 비교하여
변경된 부분이 존재한다면 Alter DDL 이 발생 DB 테이블 스키마를 변경<property name="hibernate.hbm2ddl.auto" value="update" />`
- 다음과 같은 DB 스키마를 가진 Table 을 생성
- 이후 @Entity 에 필드를 추가하고 다시 Application Loading
- alter DDL 이 발생하여 DB 스키마를 변경하는 것을 볼 수 있다.
주의할 점은 필드가 추가하는 것은 인지하지만 필드가 삭제되는 것은 인지하지 못한다.
DB LOCK 이 발생 할 수 있다.
Application Loading 시 엔티티와 테이블이 정상 Mapping 됐는지 확인
<property name="hibernate.hbm2ddl.auto" value="validate" />`
- 새로운 필드 추가
- 예외 발생
- 테이블에 존재하지 않은 필드라는 예외가 발생한것을 볼 수 있다.
옵션을 사용하지 않음
필드 설정을 위한 다양한 속성을 제공하는 Annotation
property name | description |
---|---|
name | 필드 이름 지정 |
updatable | 필드 수정 가능 여부 |
insertable | 필드 데이터 삽입 가능 여부 |
notNull | 필수 값인지 설정 여부 |
unique | 필드가 unique 값인지 설정 (파악하기 어려워서 잘 사용하지 않음 ) |
length | 필드 길이 |
columnDefinition | 직접 DDL 정의 |
percision, scale | BigDecimalType 에서 소수점 표시 |
운영환경에서는 create, create-drop, update 를 사용하면 절대 안된다.
위에서 볼 수 있듯이 실 데이터들이 모두 삭제될 수 있고 DB LOCK 이 걸려
엄청난 손실을 얻을 수 있다.
환경 | 사용가능한 옵션 |
---|---|
개발 초기 | create, update |
테스트 서버 | update, validate ( 사실 update 도 추천하진 않는다) |
스테이징 , 운영서버 | valdate, none ( 안쓰는게 제일 낫다) |
환경에 따라 적절히 사용해야할 기능이다.
특히 운영환경이나 스테이징 서버에서 사용할 때 옵션에 유의하자
local 에서 개발을 진행할때 DB 를 비우기 위해서 create 옵션을 많이 사용했는데
자세히 알아보니 다양한 기능이 있다는 것을 알게 되었다.