1 엔티티 매핑
- JPA를 사용할 때 가장 중요한 일은 엔티티와 테이블을 매핑하는 것입니다.
- JPA는 다양한 매핑 어노테이션을 지원하고 객체와 테이블 매핑, 기본 키 매핑, 필드와 컬럼 매핑, 연관관계 매핑 크게 4가지로 분류한 수 있습니다.
- 각각 분류마다 대표하는 어노테이션을 알아보자.
1.1 엔티티 클래스의 필수 조건
- 레퍼런스
- 어노테이션 요구사항
- 클래스는 반드시 jakarta.persistence.Entity 어노테이션으로 annotated 되어야 합니다.
- 생성자 요구사항
- 클래스는 반드시 **public 또는 protected 접근 제한자를 가진 기본 생성자(no-argument constructor)**를 가져야 합니다.
- 다른 생성자들도 추가로 가질 수 있습니다.
- final 제한사항
- 클래스는 final로 선언되어서는 안 됩니다.
- 어떤 메서드나 영속 인스턴스 변수도 final로 선언되어서는 안 됩니다.
- 직렬화 요구사항
- Entity 인스턴스가 분리된 객체(detached object)로 값에 의해 전달되는 경우(예: 세션 빈의 원격 비즈니스 인터페이스를 통해), 클래스는 반드시 Serializable 인터페이스를 구현해야 합니다.
- 상속 관계
- Entity는 Entity 클래스와 non-Entity 클래스 모두를 상속할 수 있습니다.
- non-Entity 클래스도 Entity 클래스를 상속할 수 있습니다.
- 필드 접근 제한
- 영속 인스턴스 변수들은 반드시 private, protected, 또는 package-private으로 선언되어야 합니다.
- 이러한 변수들은 오직 Entity 클래스의 메서드들에 의해서만 직접 접근될 수 있습니다.
- 클라이언트는 반드시 접근자 메서드(accessor methods) 또는 비즈니스 메서드를 통해 Entity의 상태에 접근해야 합니다.
정보
여기서 "영속 인스턴스 변수"란 JPA가 관리하는 엔티티의 필드를 의미합니다. 즉, 데이터베이스에 저장되는 필드를 말합니다. transient 필드나 static 필드는 영속 인스턴스 변수에 포함되지 않습니다.
2 객체와 테이블 매핑
2.1 @Entity
- JPA를 사용해서 테이블과 매핑할 클래스에 해당 어노테이션을 붙이며 이 클래스를 엔티티라고 부릅니다.
- 주의사항
- 기본 생성자 필수(public 또는 protected)
- final클래스, enum, interface, inner에는 사용할 수 없습니다.
- 저장할 필드에 final을 사용하면 안 됩니다.
속성
| 속성 | 설명 | 기본값 |
|---|---|---|
| name | 엔티티 이름을 지정합니다. | 클래스 이름 |
2.2 @Table
- 엔티티와 매핑할 테이블을 지정합니다.
- 생략하면 엔티티 이름을 테이블 이름으로 사용한다.
속성
| 속성 | 설명 | 기본값 |
|---|---|---|
| name | 테이블 이름을 지정합니다. | 엔티티 이름 |
| uniqueConstraints | DDL 생성 시에 유니크 제약 조건 생성 |
2.2.1 uniqueConstraints
- @Column의 unique 속성은 한 컬럼에 간단한 유니크 제약 조건을 걸 때 사용합니다.
- 스키마 자동 생성 기능을 사용해서 DDL을 만들 때만 사용됩니다.
- @Table의 uniqueConstraints 속성은 두 컬럼 이상을 이용해 유니크 제약 조건을 걸 수 있습니다.
- 또한 유니크 제약 조건에 이름을 부여할 수 있습니다.
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "open_banking_accounts", uniqueConstraints = {
@UniqueConstraint(name = "FINTECH_USE_NUM_UNIQUE", columnNames = {"fintech_use_num"})
})
@Entity
public class OpenBankingAccount extends BaseTimeEntity {
@Column(name = "fintech_use_num")
private String fintechUseNum;
}
- 위 예시는
fintech_use_num컬럼에 유니크 제약 조건을 걸고, 이 제약 조건의 이름을FINTECH_USE_NUM_UNIQUE로 지정한 것입니다.
3 기본 키 매핑
- 기본키 매핑 방법은 두가지 방법이 있습니다.
- ID를 직접 할당하는 직접 할당 방법과 ID를 자동으로 할당하는 자동 생성 방법이 있습니다.
- 직접 할당: @Id만 사용합니다.
- 자동 생성: @Id와 @GeneratedValue를 함께 사용합니다.
3.1 @Id
- 엔티티 클래스의 필드를 테이블의 기본 키에 매핑합니다.
- 이 필드를 식별자 필드라고 합니다.
3.2 기본키 직접 할당하는 방식
- @Id만 사용하고 @GeneratedValue 사용하지 않고 기본키를 직접 할당하는 방식입니다.