JPA 필드와 컬럼 매핑
데이터베이스 스키마 자동 생성하기
- DDL을 애플리케이션 실행 시점에 자동 생성
- 테이블 중삼 -> 객체 중심
- 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성
- 이렇게 생성된 DDL은 개발 장비에서만 사용
- 생성된 DDL은 운영서버에서는 사용하지 않거나, 적절히 다듬은 후 사용
hibernate.hbm2ddl.auto (어지간해서는 개발단계에서만 사용. 운영단계 사용 x)
- create : 기존테이블 삭제 후 다시 생성
- create-drop : create와 같으나 종료시점에 테이블 DROP
- update : 변경분만 반영 (운영DB에는 사용하면 안된다.)
- validate : 엔티티와 테이블이 정상 매핑되었는지만 확인
- none : auto 기능을 사용하지 않음.
<property name="hibernate.hbm2ddl.auto" value="create" />
위와 같은 property를 추가해주면 DTO에 맞춰 테이블을 자동 생성해준다.
주의
- 운영장비에는 create, create-drop, update 사용하지 않기.
- 개발 초기 단계는 create 또는 update
- 테스트 서버는 update 또는 validate
- 스테이징과 운영 서버는 validate 또는 none
매핑 어노테이션
- @Column
- @Temporal
- @Enumerated
- @Lob
- @Transient
@Column
가장 많이 사용된다.
name : 필드와 매핑할 테이블의 컬럼 이름
@Column(name="USERNAME") public String name;
insertable, updatable : 읽기 전용
nullable : null 허용 여부 결정, DDL 생성시 사용
@Column(nullable = false) // not null
unique : 유니크 제약 조건, DDL 생성시 사용
columnDefinition, length, precision, scale(DDL)
@Temporal
날짜 타입 매핑
@Temporal(TemporalType.DATE) private Date date; // 날짜 @Temporal(TemporalType.TIME) private Date time; // 시간 @Temporal(TemporalType.TIMESTAMP) private Date timestamp; // 날짜와 시간
@Enumerated
열거형 매핑
EnumType.ORDINAL : 순서를 저장(Default)
EnumType.STRING : 열거형 이름을 그대로 저장
ORDINAL 사용 시 enum 클래스에 저장된 순서대로 번호가 매겨지는 데 순서가 바뀔경우 큰 오류가 생길 수 있으므로 가급적 STRING을 사용.
@Enumerated(EnumType.STRING) private RoleType roleType;
@Lob
CLOB, BLOB 매핑 => 필드에 따라 알아서 매핑된다.
CLOB : String, char[], java.sql.CLOB
BLOB : byte[], java.sql.BLOB
@Lob private String lobString; @Lob private byte[] lobByte;
@Transient
- 이 필드는 매핑하지 않는다.
- 애플리케이션에서 DB에 저장하지 않는 필드에 사용.
식별자 매핑 어노테이션
- @Id
- @GeneratedValue
식별자 매핑 방법
- @Id : 직접 매핑
- IDENTITY : 데이터베이스에 위임, MYSQL
- SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용, ORACLE (@SequenceGenerator 필요)
- TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용 (@TableGenerator 필요)
- AUTO : 방언에 따라 자동 지정, 기본값
권장하는 식별자 전략
- 기본 키 제약 조건 : null 아님, 유일, 불변해야한다.
- *미래까지 *이 조건을 만족하는 자연키는 찾기 어렵다. 대리키(대체키)를 사용하자.
- 예를 들어 주민등록번호도 기본 키로 적절하지 않다.
- 권장 : Long + 대체키 + 키 생성전략 사용
참고 자료 : TAcademy youtube
'Study > JPA' 카테고리의 다른 글
[JPA] JPA 내부 구조 (0) | 2022.01.12 |
---|---|
[JPA] 양방향 매핑 (0) | 2022.01.12 |
[JPA] 연관관계 매핑 (0) | 2022.01.11 |
[JPA] JPA 기본과 매핑 (0) | 2022.01.10 |
[JPA] JPA를 사용하는 이유 (0) | 2022.01.10 |