아래 내용은 김영한님의 '자바 ORM 표준 JPA 프로그래밍' 책의 내용을 요약하였습니다.
Chapter 4. 엔티티 매핑
- JPA를 사용하는 데 가장 중요한 일
- 엔티티와 테이블을 정확히 매핑하는 것
- 따라서 매핑 어노테이션을 숙지하고 사용해야 함
- JPA의 대표 매핑 어노테이션
- 객체와 테이블 매핑
- @Entity, @Table
- 기본 키 매핑
- @Id
- 필드와 컬럼 매핑
- @Column
- 연관관계 매핑(chap 5,6,7)
- @ManyToOne, @JoinColumn
- 객체와 테이블 매핑
4.1 @Entity
- JPA를 사용해서 테이블과 매핑할 클래스는 이 어노테이션을 필수로 붙여야 함
- @Entity가 붙은 클래스는 JPA가 관리하는 것
속성 | 기능 | 기본값 |
name | JPA에서 사용할 엔티티 이름을 지정. 보통 기본값인 클래스 이름 사용. 만약 다른 패키지에 이름이 같은 엔티티 클래스가 있다면 이름을 지정해서 충돌하지 않도록 해야 함. |
설정하지 않으면 클래스 이름 그대로 사용 |
주의사항
- 기본 생성자는 필수(파라미터가 없는 public 또는 protected 생성자)
- final, enum, interface, inner 클래스에는 사용할 수 없다
- 저장할 필드에 final을 사용하면 안된다.
- JPA가 엔티티 객체를 생성할 때 기본 생성자를 사용하므로 생성자는 반드시 있어야 한다.
자바는 자동으로 만들지만 생성자를 하나 이상 만들면 그 이후로 자동으로 만들지 않아 기본 생성자를 직접 만들어야 함.
public Member() {} // 기본 생성자
4.2 @Table
- 엔티티와 매핑할 테이블을 지정
- 생략하면 매핑한 엔티티 이름을 테이블 이름으로 사용
- @Table 속성 정리
속성 | 기능 | 기본값 |
name | 매핑할 테이블 이름 | 엔티티 이름 사용 |
catalog | catalog 기능이 있는 DB에서 catalog 매핑 | |
schema | schema 기능이 있는 DB에서 schema 매핑 | |
uniqueConstraints(DDL) | DDL 생성시에 유니크 제약조건을 만든다. 2개 이상의 복합 유니크 제약조건도 만들 수 있다. 참고로 이 기능은 스키마 자동 생성 기능을 사용해서 DDL을 만들 때만 사용된다. |
4.3 다양한 매핑 사용
회원 관리 프로그램 코드
1. 회원은 일반 회원과 관리자로 구분
2. 회원 가입일과 수정일이 있어야 함
3. 회원을 설명할 수 있는 필드가 있어야 함(이 필드는 길이 제한X)
예제 4.1 회원 엔티티
package jpabook.start;
import javax.persistence.*; //**
import java.util.Date;
/**
* User: HolyEyE
* Date: 13. 5. 24. Time: 오후 7:43
*/
@Entity
@Table(name="MEMBER", uniqueConstraints = {@UniqueConstraint( //추가 //**
name = "NAME_AGE_UNIQUE",
columnNames = {"NAME", "AGE"} )})
public class Member {
@Id
@Column(name = "ID")
private String id;
private String username;
private Integer age;
//=== 추가
@Enumerated(EnumType.STRING)
private RoleType roleType; -------------------------------------------------1
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate; -------------------------------------------------2
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate; -------------------------------------------------2
@Lob
private String description; -------------------------------------------------3
@Transient
private String temp;
...
}
public enum RoleType {
ADMIN, USER
}
회원 코드 분석(1,2,3으로 구분)
1. roleType
- 자바의 enum 사용해서 회원 타입 구분
- 일반 회원은 USER, 관리자는 ADMIN
- 자바의 enum을 사용하려면 @Enumerated 어노테이션으로 매핑해야 함
2. createdDate, lastModifiedDate
- 자바의 날짜 타입은 @Temporal을 사용
3. description
- 회원을 설명하는 필드는 길이 제한X
- 따라서, DB의 VARCHAR 타입 대신 CLOB 타입으로 저장
- @Lob을 사용하면 CLOB, BLOB 타입을 매핑할 수 있음
4.4 데이터베이스 스키마 자동 생성
- JPA는 DB 스키마 자동 생성하는 기능 지원
- 클래스의 매핑 정보를 보면 어떤 테이블에 어떤 컬럼을 사용하는지 알 수 있다.
- JPA는 이 매핑 정보와 데이터베이스 방언을 사용해서 데이터베이스 스키마를 생성한다.
- 애플리케이션 실행 시점에 데이터베이스 테이블을 자동으로 생성하기 위해서는
- persistence.xml에 다음 코드 추가하면 됨
<property name="hibernate.hbm2ddl.auto" value="create" />
- 스키마 자동 생성 장점 : 개발자가 테이블을 직접 생성하는 수고를 덜 수 있음
- 이 기능을 사용해서 생성된 DDL을 보면 엔티티와 테이블이 어떻게 매핑되는지 쉽게 이해할 수 있다.
4.5 DDL 생성 기능
아까 위 코드에 회원 이름은 필수로 입력되어야 하고, 10자를 초과하면 안된다는 제약 조건이 추가 된다면?
@Column(name = "NAME", nullable = false, length = 10) //추가 //**
=> @Column의 매핑 정보의 nullable 속성 값을 false로 지정하면 자동 생성되는 DDL에 not null 제약조건
=> length 속성 값은 DDL 문자의 크기
유니크 제약 조건 추가
package jpabook.start;
import javax.persistence.*; //**
import java.util.Date;
/**
* User: HolyEyE
* Date: 13. 5. 24. Time: 오후 7:43
*/
@Entity
@Table(name="MEMBER", uniqueConstraints = {@UniqueConstraint( //추가 //**
name = "NAME_AGE_UNIQUE",
columnNames = {"NAME", "AGE"} )})
public class Member {
...
이러한 기능들은 사실 JPA의 실행 로직에는 영향을 주지 않고 단지 DDL을 자동 생성할 때만 사용된다.
Reference)
자바 ORM 표준 JPA 프로그래밍 - 김영한 지음
'Server' 카테고리의 다른 글
[JPA] Chapter 5. 연관관계 매핑 기초 (0) | 2023.05.25 |
---|---|
[JPA] Chapter 4. 엔티티 매핑 2 (1) | 2023.05.17 |
[JPA] Chapter 3 영속성 관리 (0) | 2023.05.05 |
[JPA] Chapter 2 JPA 시작 (0) | 2023.04.26 |
[JPA] Chapter 1 JPA 소개 (0) | 2023.04.06 |