JPA

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

coding-orange 2024. 1. 5. 17:45
728x90

 

 

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

 

 

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

  • DDL(Data Definition Language)을 애플리케이션 실행 시점에 자동으로 생성한다는 뜻이다.
  • 테이블 중심보다는 객체 중심이다.
  • 데이터베이스 방언을 활용하여 데이터베이스에 맞는 적절한 DDL이 생성된다.
  • 생성된 DDL은 개발 장비에서만 활용해야 한다. 운영서버에서는 사용하지 않기를 적극 권장하고, 적절히 다듬은 후 사용해야 한다.

 

 

 


 

 

 

 

02. 데이터베이스 스키마 자동 생성의 속성

 

속성은 다음과 같다.

옵션 설명
create 기존테이블 삭제 후 다시 생성 (drop + create)
create-drop create와 동일하지만 종료 시 테이블 drop
update 변경된 내용만 반영
validate 엔티티와 테이블이 정상 매핑되었는지만 확인
none 사용하지 않음

 

 

 

속성 적용 방법

  • 프로젝트의 resources/META-INF/persistence.xmlproperty를 추가하거나 수정하면 된다.
  • 예를 들어 다음과 같이 작성할 수 있다.
<property name="hibernate.hbm2ddl.auto" value="create" />

 

 

 

 


 

 

 

 

03. 스키마 자동 생성하기 옵션별 확인 예시 코드

 

따로 설명을 붙여놓지 않은 부분의 JpaMain 코드는 하위 코드를 사용하면 된다.

더보기
package hello.jpa;
import javax.persistence.*;

public class JpaMain {

    public static void main(String[] args) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();

        try {
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close();
        }

        emf.close();

    }

}

 

 

create 예시 코드

  • 프로젝트의 resources/META-INF/persistence.xmlproperty를 다음과 같이 설정한다.
<property name="hibernate.hbm2ddl.auto" value="create" />

 

 

  • Member 클래스를 다음과 같이 작성한다.
package hellojpa;
import javax.persistence.*;

@Entity
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class Member {

    @Id
    private Long id;
    private String name;

 }

 

 

프로젝트를 실행하고 실행 로그를 보면, 먼저 테이블을 drop하고 새로 create 하는 것을 볼 수 있다.



 

create-drop 예시 코드

  • 테스트 케이스를 실행할 때 사용하면 유용하다.
  • 프로젝트의 resources/META-INF/persistence.xmlproperty를 다음과 같이 설정한다. 나머지 코드는 create 예시 코드와 동일하다.
<property name="hibernate.hbm2ddl.auto" value="create-drop" />

 


프로젝트를 실행하고 실행 로그를 보면, 먼저 테이블을 drop하고 새로 create 하고 종료할 때 다시 테이블을 drop 하는 것을 볼 수 있다.

 

 

 

update 예시 코드

  • 필드를 추가하는 것은 가능하지만, 필드를 지우는 것은 안된다.
  • 프로젝트의 resources/META-INF/persistence.xmlproperty를 다음과 같이 설정한다.
<property name="hibernate.hbm2ddl.auto" value="update" />

 

 

 

validate 예시 코드

  • 프로젝트의 resources/META-INF/persistence.xmlproperty를 다음과 같이 설정한다.
<property name="hibernate.hbm2ddl.auto" value="validate" />

 

  • Member 클래스에 다음 코드를 추가한다.
private String name2;

 

 

실행 전 DB 상태이고, 실행 후도 동일하다.



 

  • 현재 DB 상태와 객체의 필드가 일치하는지 확인을 해준다. 일치하지 않는다면 오류를 발생시킨다.
  • DB에는 id와 name만 있는데 객체에는 id, name, name2가 있기 때문에 오류가 발생한다.

 

 

 


 

 

04. 데이터베이스 방언 별로 DDL이 달라지는 것을 확인하는 예시 코드

 

 

 

H2 예시 코드

  • 프로젝트의 resources/META-INF/persistence.xmlproperty를 다음과 같이 설정한다.
<property name="hibernate.hbm2ddl.auto" value="create" />
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />

 

 

  • String 타입인 name이 H2에서는 쿼리문을 만들 때 varchar로 만들어진다.

 

 

Oracle 예시 코드

  • 프로젝트의 resources/META-INF/persistence.xmlproperty를 다음과 같이 설정한다.
<property name="hibernate.hbm2ddl.auto" value="create" />
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle8Dialect" />

 

 

  • String 타입인 name이 Oracle에서는 쿼리문을 만들 때 varchar2로 만들어진다.

 

 

 

 


 

 

05. 데이터베이스 스키마 자동 생성 시 주의할 점 & 추가 내용

 

 

  • 운영 장비에는 절대 create, create-drop, update를 사용하면 안된다.
  • 개발 초기 단계에서는 create 혹은 update 사용을 권장한다.
  • 테스트 서버는 update 혹은 validate 사용을 권장한다.
  • 스테이징과 운영 서버는 validate 혹은 none 사용을 권장한다.
  • DDL 생성 기능은 DDL을 자동 생성할 때만 사용되고, JPA의 실행 로직에는 영향을 주지 않는다.
728x90