728x90
01. 데이터베이스 스키마 자동 생성
데이터베이스 스키마 자동 생성
- DDL(Data Definition Language)을 애플리케이션 실행 시점에 자동으로 생성한다는 뜻이다.
- 테이블 중심보다는 객체 중심이다.
- 데이터베이스 방언을 활용하여 데이터베이스에 맞는 적절한 DDL이 생성된다.
- 생성된 DDL은 개발 장비에서만 활용해야 한다. 운영서버에서는 사용하지 않기를 적극 권장하고, 적절히 다듬은 후 사용해야 한다.
02. 데이터베이스 스키마 자동 생성의 속성
속성은 다음과 같다.
옵션 | 설명 |
create | 기존테이블 삭제 후 다시 생성 (drop + create) |
create-drop | create와 동일하지만 종료 시 테이블 drop |
update | 변경된 내용만 반영 |
validate | 엔티티와 테이블이 정상 매핑되었는지만 확인 |
none | 사용하지 않음 |
속성 적용 방법
- 프로젝트의
resources/META-INF/persistence.xml
의property
를 추가하거나 수정하면 된다. - 예를 들어 다음과 같이 작성할 수 있다.
<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.xml
의property
를 다음과 같이 설정한다.
<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.xml
의property
를 다음과 같이 설정한다. 나머지 코드는 create 예시 코드와 동일하다.
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
프로젝트를 실행하고 실행 로그를 보면, 먼저 테이블을 drop하고 새로 create 하고 종료할 때 다시 테이블을 drop 하는 것을 볼 수 있다.
update 예시 코드
- 필드를 추가하는 것은 가능하지만, 필드를 지우는 것은 안된다.
- 프로젝트의
resources/META-INF/persistence.xml
의property
를 다음과 같이 설정한다.
<property name="hibernate.hbm2ddl.auto" value="update" />
validate 예시 코드
- 프로젝트의
resources/META-INF/persistence.xml
의property
를 다음과 같이 설정한다.
<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.xml
의property
를 다음과 같이 설정한다.
<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.xml
의property
를 다음과 같이 설정한다.
<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