JPA - Entity Mapping

Growing_HJ·2024년 7월 26일

JPA

목록 보기
4/15

JPA에서 제공하는 어노테이션

1. 객체와 테이블 매핑

  • @Entity

    JPA 를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 반드시 붙여줘야 한다.
    @Entity 가 붙은 클래스는 JPA 가 관리하는 것으로 엔티티라 부른다.
    ---- @Entity 속성 종류 -----
    - name 속성
    JPA 에서 사용할 엔터티 이름을 지정한다.
    기본값으로 클래스 이름을 사용.
    ✔️ @Entity 적용시 주의사항
    - 기본 생성자는 필수.
    - final 클래스, enum, interface, inner 클래스에는 사용할 수 없다.
    - 저장할 필드에 final 을 사용하면 안된다

  • @Table

    엔티티와 매핑할 테이블을 지정한다. 생략할 경우 엔터티 이름을 테이블 이름으로 사용한다.

2. 기본 키 (Primary Key)매핑

  • @Id
@Entity 
public class Member {
	@Id // Id 어노테이션만 사용해서 회원의 기본 키를 애플리케이션에서 직접 할당.
    @Column(name= "ID)
    private String id;
}

❗️ 기본 키를 애플리케이션에서 직접 할당하는 대신, 데이터베이스가 생성해주는 값을 할당하는 방법
1. 직접 할당 : 기본 키를 애플리케이션에서 직접 할당한다 .
2. 자동 생성 : 대리 키 사용 방식

1. IDENTITY 전략
- 기본 키 생성을 데이터베이스에 위임한다.
- 데이터베이스에 값을 저장하고 나서야 기본 키 값을 구할 수 있을 때 사용한다.
- 데이터 베이스에 엔터티를 저장해서 식별자 값을 획득한 후 영속성 컨텍스트에 저장한다.
GeneratedValue(strategy = GenerationType.INDENTITY)
2. SEQUENCE 전략
- 데이터베이스에 시퀀스를 사용해서 기본키를 할당한다
- 데이터 베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트다.
- 데이터베이스 시퀀스에서 식별자 값을 획득한 후 영속성 컨텍스트에 저장.
GeneratedValue(strategy = GenerationType.SEQUENCE)
3. TABLE 전략
- 키 생성 테이블을 사용한다.
- TABLE 전략은 키 생성 전용 테이블을 하나 만들고 여기에 이름과 값으로 사용할 칼럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략.
- 데이터 베이스 시퀀스 생성용 테이블에서 식별자 값을 획득한 후, 영속성 컨텍스트에 저장.
GeneratedValue(strategy = GenerationType.TABLE)
4. AUTO 전략
- 데이터베이스 방언에 따라 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동으로 선택.

장점) 데이터 베이스를 변경해도 코드를 수정할 필요가 없다는 것. 
     특히 키 생성 전략이 아직 확정되지 않은 개발 초기 단계나,
     프로토 타입 개발시 편리하게 사용할 수 있다.

+ IDENTITY 전략 VS SEQUENCE 전략

A. IDENTITY 전략 동작과정

// IDENTITY 매핑 코드
@Entity 
public class Board {
	@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
}
// IDENTITY 사용 코드
private static void logic(EntityManager em) {
	Board board = new Board();
    em.persist(board);
    System.out.println("board.id = " + board.getId());
}

em.persist() 를 호출해서 엔터티를 저작한 직후에 할당된 식별자 값을 출력했다.
출력된 값 1은 저장 시점에 데이터베이스가 생성한 값을 JPA 가 조회한 것.

IDENTITY 식별자 생성 전략은 엔터티를 데이터베이스에 저장해야 식별자를 구할 수 있으므로 em.persist() 를 호출하는 즉시 INSERT SQL 이 데이터베이스에 전달된다.
따라서 이 전략은 트랜잭션을 지원하는 쓰기 지연이 동작하지 않는다.
먼저 엔터티를 데이터베이스에 저장한 후에 식별자를 조회해서 엔터티의 식별자에 할당한다.

B. SEQUENCE 전략 동작과정

// 시퀀스 매핑 코드
@Entity
@SequenceGenerator(
	name = "BOARD_SEQ_GENERATOR",
    sequenceName = "BOARD_SEQ" // 매핑할 데이터의 시퀀스 이름
    initialValue = 1, allocationSize = 1 )
public class Board {
	@Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE ,
    				generator = "BOARD_SEQ_GENERATOR")
        private Long id;
	}
// 시퀀스 사용 코드
private static void logic(EntityManager em) {
	Board board = new Board();
    em.persist(board);
    System.out.println("board.id = " + board.getId());
}

SEQUENCE 전략은 em.persist() 를 호출할 때 먼저 데이터베이스 시퀀스를 사용해서 식별자를 조회한다. 그리고 조회한 식별자를 엔터티에 할당한 후에 엔터티를 영속성 컨텍스트에 저장한다. 이후 트랜잭션을 커밋해서 플러시가 일어나면 엔터티를 데이터 베이스에 저장한한다.

3. 필드와 컬럼 매핑 : 레퍼런스
@Column - 컬럼을 매핑

@Column 은 객체 필드를 테이블 컬럼에 매핑한다.

4. 연관관계 매핑
@Many To One
@JoinColumn

0개의 댓글