✅ @ Entity ✅ @ Table ✅ @Column ✅ @Enumerated ✅ @Temporal ✅ @Lob ✅ @Transient
1. 객체와 테이블 매핑
@ Entity
@Entity가 붙은 클래스는 JPA가 관리하는 엔티티가 되며, JPA를 사용해서 테이브과 매핑할 클래스라면 @Entity를 꼭 붙여줘야 한다.
- 기본 생성자를 필수로 만들어야 함
- 사용 불가 클래스 : final, enum, interface, inner
@ Table
엔티티와 매핑할 테이블을 지정한다.
속성
- name : 매핑할 테이블 이름
- catalog : 데이터베이스 catalog 매핑
- schema : 데이터베이스 schema 매핑
- uniqueConstraints (DDL) : DDL 생성 시에 유니크 제약 조건 생성
2. 데이터베이스 스키마 자동 생성
DDL을 애플리케이션 실행 시점에 자동 생성
(운영에서는 사용하면 안되고, 개발 과정에서만 사용 해야함)
persistence.xml
<property name="hibernate.hbm2ddl.auto" value="create" />
속성
- create : 기존테이블 삭제 후 다시 생성 (DROP + CREATE)
- create-drop : create와 같으나 종료시점에 테이블 DROP
- update : 변경분만 반영(운영DB에는 사용하면 안됨)
- validate : 엔티티와 테이블이 정상 매핑되었는지만 확인
- none : 사용하지 않음 (주석처리하는 것과 동일)
단계
- 개발 초기 단계 : create / update
- 테스트 서버 : update / validate
- 스테이징과 운영 서버 : validate / none
🔥 운영 장비에는 절대 create, create-drop, update 사용하면 안됨
3. 필드와 컬럼 매핑
@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;
@Transient
private int temp;
public Member(){
}
}
@Column
컬럼 매핑
- (name = "name") : db에는 "name" 이름의 컬럼으로 들어감
@Enumerated
enum 타입 매핑
- db에는 기본적으로 enum 타입이 없기 때문에 enum 타입을 넣기 위해서는 명시를 해줘야 한다.
- (EnumType.STRING) : enum 이름을 저장
- (EnumType.ORDINAL) : enum 순서를 저장
- 실무에서 사용하지 않는 속성이다. 왜냐하면 enum이 추가되면 순서가 꼬여 db에 예상하지 못한 순서대로 들어갈 수 있음
@Temporal
날짜 타입 매핑
- (TemporalType.TIMESTAMP) or DATE or TIME
- LocalDate, LocalDateTime을 사용할 때는 생략 가능
@Lob
큰값을 넣고 싶을 때
- CLOB(매핑하는 필드 타입이 문자), BLOB(나머지) 타입과 매핑
- 지정할 수 있는 속성이 없다.
@Transient
특정 필드를 컬럼에 매핑하지 않음 (매핑 무시)
- 메모리에서만 사용할 필드만 생성할 때 사용 (캐시 계산 등)
4. 기본 키 매핑
@Id
@Id
@GeneratedValue
권장 식별자 전략
기본 키는 null이 아니고, 변하면 안되는 값이다.
대리키(대체키), long형 사용
- 나중까지 위 조건을 만족하는 자연키는 흔치 않으므로 대리키(대체키)를 사용하는 것을 권장
- int는 0이 없으므로 integer를 더 권장하고, integer는 long에 비해 범위가 작으므로 long형을 더 권장한다.
- long 형이 integer에 비해 용량도 더 크긴 하지만 전체로 따져보면 그리 큰 수준은 아니고, 나중에 키가 많아져 integer로는 범위가 부족할 때 long으로 변경하는 것이 더 큰일이므로 처음부터 long을 쓰는 것이 낫다.