DDL 자동 생성
데이터베이스 스키마 자동생성은 객체에 정의한 정보를 바탕으로 테이블을 만들어주는 기능이다. JPA가 DDL(Data Definition Language, 데이터 베이스의 스키마(테이블명, 열 이름 등)를 만들어주는 SQL문 집합)을 자동으로 생성해 준다.
특징 및 사용
- 애플리케이션 실행 시점에 객체에 지정한 정보를 바탕으로 DDL을 자동으로 생성한다.
- 데이터베이스 테이블 중심에서 객체 중심의 개발이 가능해진다.
- 데이터베이스 방언(SQL Dialect)에 맞는 적절한 DDL을 생성한다. 예를 들어 String 값은 일반적으로 varchar타입으로 분류되지만 Oracle 데이터베이스인 경우 varchar2로 해당 데이터베이스 언어에 맞게 생성이 된다.
- 편리하지만 실제 운영 서버에서 사용하기엔 한계점이 있어 생성된 DDL을 바탕으로 적절히 다듬어서 사용해야 한다.
속성 (hibernate.hbm2ddl.auto)
- create: 기존테이블 삭제 후 다시 생성한다.
- 애플리케이션이 수행되고 나서 기존테이블을 삭제하고 @Entity를 보고 다시 생성한다.
- create-drop: create와 같으나 종료시점에 테이블을 DROP 한다. (Drop+Create+Drop)
- update: 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 변경 사항만 수정한다. (칼럼 삭제는 안됨)
- 운영에선 사용하면 안 된다.
- validation: 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션을 실행하지 않는다. (DDL을 수정하는 개념은 아니다.)
- none: 자동 생성 기능을 사용하지 않는다.
주의사항
운영 서버에는 절대 create, create-drop, update 사용하면 안 된다. 오직 개발 서버 또는 개발 단계에서만 사용해야 한다.
개발 환경에 따른 추천전략
- 개발 초기 단계는 create 또는 update
- 테스트 서버는 update 또는 validate (개발이 어느 정도 진행되면 create 사용하면 안 된다.)
- 스테이징과 운영 서버는 validate 또는 none
운영서버에서 update가 위험한 이유는 데이터가 수천만 건이 넘어가기 시작하면 ALTER TABLE 실행 시 LOCK이 걸리게 된다. 그렇기 때문에 애플리케이션 로딩 시점에 반영이 되는 update는 매우 위험하다.
그래서 스크립트를 테스트 서버나 개발 서버 쪽에 직접 실행해 보고 적용하는 것이 좋다. 권장사항으로는 로컬환경의 DB에서만 자동 생성을 사용하고, 여러 사람이 사용하는 서버에서는 가급적 직접 스크립트를 실행하는 방식을 추천한다.
DDL 생성 기능
스키마 자동 생성 기능을 이용하면 DDL에 제약조건을 추가할 수 있다.
@Entity
public class Member {
@Id
private String id;
@Column(name = "name", nullable = false, length = 10) // 추가
private String username;
...
}
@Column 어노테이션을 쓰면 nullable 속성 같은 DDL 제약조건을 추가할 수 있다. 그 외에도 @Table에서 설정할 수 있는 uniqueConstraints 속성도 있다.
이런 기능들은 단지 DDL을 자동을 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않는다. 따라서 스키마 자동 생성 기능을 사용하지 않고 직접 선언한다면 사용할 이유가 없다. 그래도 명시적으로 표현해 주면 개발자가 엔티티 객체만 보고도 손쉽게 제약조건을 파악할 수 있는 장점이 있다.
'Framework > JPA' 카테고리의 다른 글
[JPA] 엔티티 매핑 - 기본 키 매핑 (0) | 2024.03.15 |
---|---|
[JPA] 엔티티 매핑 - 필드와 컬럼 매핑 (0) | 2024.03.14 |
[JPA] 엔티티 매핑 - 객체와 테이블 매핑 (0) | 2024.03.14 |
[JPA] 준영속 상태 (0) | 2024.03.13 |
[JPA] 플러시(flush) (0) | 2024.03.13 |