데이터베이스 스키마 자동 생성

  • DDL을 애플리케이션 실행 시점에 자동 생성
    • 테이블을 미리 만들어 두지 않아도 된다는 이점이 있음.
  • 테이블 중심 → 객체 중심
  • 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성
    • DB 별로 문법이 살짝씩 다른 것을 극복 가능하다.
  • 이렇게 생성된 DDL은 개발 장비에만 사용
  • 생성된 DDL은 운영서버에서는 사용하지 않거나, 적절히 다듬은 후 사용

데이터 베이스 스키마 자동 생성 - 속성

  • hibernate.hbm2ddl.auto
<?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>
            <!-- 필수 속성 -->
            <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"/>
            <!-- 아래 코드의 value 값을 말한다. -->
            <property name="hibernate.hbm2ddl.auto" value="create" />
        </properties>
    </persistence-unit>
</persistence>
옵션 설명
create 기존 테이블 삭제 후 다시 생성(DROP + CREATE)
create-drop create와 같으나 종료시점에 테이블 DROP
update 변경분만 반영(운영DB 사용하면 안됨) -> alter 동작 지우는건 안됨!! 추가하는거만 동작함!!
validate 엔티티와 테이블이 정상 매핑되었는지만 확인
none 사용하지 않음 -> 관례상 none 이라고 씀 아무거나 넣어도 상관은 없음! 어짜피 동작하지 않기에..

 

데이터베이스 스키마 자동 생성 - 주의

  • 운영 장비에는 절대 create, create-drop, update 사용하면 안된다
  • 개발 초기 단계는 create 또는 update
  • 테스트 서버는 update 또는 validate
    • update는 편하긴 하지만 alter 문은 굉장히 위험하기 때문에 가급적으로 쓰지 않아야 할 것 같다.
  • 스테이징과 운영 서버는 validate 또는 none

DDL 생성 기능

  • 제약조건 추가: 회원 이름은 필수, 10자 초과X
    • @Column(nullable = false, length = 10)
  • 유니크 제약조건 추가
    • @Table(uniqueConstraints = {@UniqueConstraint( name = "NAME_AGE_UNIQUE", columnNames = {"NAME", "AGE"} )}
  • DDL 생성 기능은 DDL을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않는다

'DB > JPA' 카테고리의 다른 글

기본 키 매핑  (0) 2023.01.03
필드와 컬럼 매핑  (0) 2022.12.31
객체와 테이블 매핑  (0) 2022.12.30
준영속 상태  (0) 2022.12.30
플러시  (1) 2022.12.30

+ Recent posts