[Spring] JPA 엔티티 매핑

엔티티 매핑
- 객체와 테이블 매핑: @Entity, @Table
- 필드와 컬럼 매핑: @Column
- 기본 키 매핑: @Id
- 연관관계 매핑: @ManyToOne, @JoinColumn
객체와 테이블 매핑
@Entity가 붙은 클래스는 JPA가 관리하고 엔티티라고 합니다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity가 필수입니다. 기본 생성자도 public 이나 protected로 반드시 생성하고, final class, enum, interface, inner class에는 사용할 수 없습니다. @Table로 디비 테이블에 저장될 이름을 따로 설정할 수 있습니다.
@Entity
@Table(name = "ORDERS")
public class Order extends BaseEntity{
@Id
private Long id;
}
필드와 컬럼 매핑
객체의 필드와 DB 테이블 매핑시 사용합니다. 필드와 컬럼을 매핑하는 몇 가지 속성이 있는데 알아보겠습니다.
@Column
- name: 필드와 매핑할 테이블의 컬럼 이름
- insertable, updatable: 컬럼을 수정했을 때 디비에 변경을 할지 말지 설정
- nullable: Not Null 제약 조건이 걸린다.
- unique: 컬럼 하나에 유니크 조건을 걸 때 사용. 잘 사용하지 않고 uniqueConstarint를 더 많이 사용
- length: 길이를 조절. String 타입에만 사용
@Enumerated
- enum 타입을 매핑할 때 사용. ORDINARY를 사용하면 안되고 STRING 사용 !
- EnumType.ORDINARY를 사용하면 1, 2, 3과 같이 순서대로 저장되는데, 중간에 하나가 사라진다면...?
@Lob
- Lob: 데이터 베이스 BLOB, CLOB 타입과 매핑, 문자는 CLOB, 나머지는 BLOB
@Transient
- 메모리 상에서만 임시로 값을 보관하고 싶을 때 사용
- 필드 매핑 X, 디비 저장 조회 X
@Entity
@Table(name = "ORDERS")
public class Order extends BaseEntity{
@Id @GeneratedValue
@Column(name = "ORDER_ID")
private Long id;
}
기본 키 매핑
기본 키를 매핑하는 어노테이션을 알아보겠습니다.
@Id
- 직접 아이디로 사용하겠다고 세팅해주는 것.
- PK 조건을 걸어준다고 생각하면 된다.
@GeneratedValue
- 자동으로 키를 생성하기 원할 때 사용하면 된다.
- 옵션으로 IDENTITY, SEQUENCE, TABLE, AUTO가 있는데 관계형 데이터베이스를 사용하는 경우 보통 SEQUENCE, AUTO를 많이 사용한다. 디폴트는 AUTO.
권장하는 식별자(PK) 전략
- 기본 키 제약 조건: NULL이 아니여야하고, 유일해야하고, 변하면 안된다 -> Not null, unique, immutable
- 미래까지 이 조건을 만족하는 키는 찾기 어렵기 때문에 대체키를 사용하는 것이 좋다.
- 비즈니스 환경은 언젠가 변한다고 생각.
- 예를 들어 주민등록번호도 기본 키로 적절하지 않다.
- 권장: Long Type + 대체키(sequence or UUID) + 키 생성전략 사용
- auto increment나 sequence 전략 사용 -> Long 타입으로 사용하자.
@Entity
@Table(name = "ORDERS")
public class Order extends BaseEntity{
@Id @GeneratedValue
@Column(name = "ORDER_ID")
private Long id;
}