엔티티 매핑의 종류
- 객체와 테이블 매핑:
@Entity, @Table
- 필드와 컬럼 매핑:
@Column
- 기본키 매핑:
@Id
- 연관관계 매핑:
@ManyToOne, @JoinColumn, @MappedBy
객체와 테이블 매핑
@Entity
- @Entity가 붙은 클래스는 JPA가 관리하며, 이를 엔티티라 함
- JPA를 사용해서 테이블과 매핑할 클래스는 @Entity를 필수적으로 작성
- 주의
- 기본 생성자 필수 (파라미터가 없는 public 또는 protected 생성자)
- final 클래스, enum, interface, inner 클래스 사용 X
- 저장할 필드에 final 사용 X
- @Entity 속성
- name: JPA에서 사용할 엔티티 이름을 지정 (기본값: 클래스 이름을 그대로 사용)
- 같은 클래스 이름이 없으면 가급적 기본값을 사용
@Table
- @Table은 엔티티와 매핑할 테이블을 지정할 때 사용함
데이터베이스 스키마 자동 생성
- DDL을 애플리케이션 실행 시점에 자동 생성
- 객체만 먼저 구현해도 JPA가 테이블을 생성해줌 (테이블 중심 -> 객체 중심)
- 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성 (H2에서는 VARCHAR, Oracle에서는 VARCHAR2)
- 이렇게 생성된 DDL은 개발 장비에서만 사용하고, 운영 서버에서는 사용하지 않거나 적절히 다듬은 후 사용함
hibernate.hbm2ddl.auto (ddl-auto)
- create: 기존 테이블 삭제 후 다시 생성(DROP + CREATE)
- create-drop: create와 같으나 종료 시점에 테이블 DROP
- update: 변경분만 반영 (운영 DB에는 사용하면 안됨)
- validate: 엔티티와 테이블이 정상 매핑되었는지만 확인
- none: 사용하지 않음
- 주의
- 운영 장비에는 절대 create, create-drop, update 사용하면 안 됨
- 개발 초기 단계는 create 또는 update
- 테스트 서버는 update 또는 validate
- 스테이징과 운영 서버는 validate 또는 none
DDL 생성 기능
- 제약조건 추가: 회원 이름은 필수, 10자 초과 X
- @Column(nullable = true, length = 10)
- 유니크 제약조건 추가
- @Column(unique = true)
- @Table(uniqueConstraints = {@UniqueConstraint( name = "NAME_AGE_UNIQUE", columnNames = {"NAME", "AGE"} )})
DDL 생성 기능은 DDL을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않음
필드와 컬럼 매핑
- 요구사항
- 회원은 일반 회원과 관리자로 구분해야 한다.
- 회원 가입일과 수정일이 있어야 한다.
- 회원을 설명할 수 있는 필드가 있어야 한다. 이 필드는 길이 제한이 없다.
@Entity
public class Member {
@Id
private Long id;
@Column(name = "name")
private String username;
private Integer age;
@Enumerated(EnumType.STRING)
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob
private String description;
}
@Column: 컬럼 매핑
-
name: 필드와 매핑할 테이블의 컬럼 이름 (기본값: 객체의 필드 이름)
-
insertable, updatable: 등록, 변경 가능 여부 (기본값: True)
-
nullable: null 값의 허용 여부를 설정
-
unique: 한 컬럼에 간단히 유니크 제약 조건을 걸 때 사용 (@Table의 uniqueConstraints 속성을 주로 사용)
-
columnDefinition: 데이터베이스 컬럼 정보를 직접 설정 (columnDefinition = "varchar(100) default 'EMPTY'")
-
length: 문자 길이 제약 조건, String 타입에만 사용 (기본값: 255)
@Temporal: 날짜 타입 매핑
- value 속성
- TemporalType.DATE: 날짜, 데이터베이스 data 타입과 매핑
- TemporalType.TIME: 시간, 데이터베이스 time 타입과 매핑
- TemporalType.TIMESTAMP: 날짜와 시간, 데이터베이스 timestamp 타입과 매핑
- 참고
- LocalDate, LocalDateTime을 사용할 경우 생략 가능 (최신 하이버네이트 지원)
- private LocalDate localDate;
- private LocalDateTime localDateTime;
@Enumerated: enum 타입 매핑
- value 속성 (기본값: EnumType.ORDINAL)
- EnumType.ORDINAL: enum 순서를 데이터베이스에 저장
- EnumType.STRING: enum 이름을 데이터베이스에 저장
- 주의
- 기본값인 ORDINAL이 아닌 STRING 사용!
- ORDINAL을 사용할 경우, enum 타입에 데이터가 추가되어도 이것이 테이블에 반영되지 않기 때문에 문제가 발생할 수 있음
@Lob: BLOB, CLOB 매핑
- 매핑하는 필드 타입이 문자이면 CLOB 매핑, 나머지는 BLOB 매핑
CLOB: String, char[], java.sql.CLOB
BLOB: byte[], java.sql.BLOB
@Transient: 특정 필드를 컬럼에 매핑하지 않음
- 데이터베이스에 저장, 조회 X
- 주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용