[Spring]- [JPA] Entity 매핑

Mini_me·2022년 2월 1일
1

공부 [Spring]

목록 보기
14/27
@Getter
@Entity
@NoArgsConstructor
@Table(name = "MEMBER")
public  class Member {
    @Id
    @Column(name="ID")
    private String id;
    @Column(name="NAME")
    private String username;
    private Integer age;

클래스와 테이블 매핑

Entity,table, colum이 매핑 정보이다.

JPA는 매핑 어노테이션을 분석해서 어떤 객체가 어떤 테이블과 관계가 있는지 알아낸다.

@Entity

이 클래스를 테이블이랑 매핑할거야! 라고 JPA에게 알림

  • name : 엔티티 이름 지정 / 설정하지 않을 경우 클래스 이름 그대로 사용
  • 주의 사항
    1. 기본 생성자 필수 (public / protected 생성자)
    2. final class/ enum / interface / inner 클래스에는 사용할 수 없다.
    3. 저장할 필드에 final 사용금지

@ Table

엔티티는 내가 지금 이 클래스를 이 테이블이랑 매핑할거야라고 알려준다면

테이블은 매핑할 테이블에 대한 정보를 알려준다.

이 어노테이션을 생략하면 클래스이름을 테이블 이름으로 매핑한다.

  • name : 매핑할 테이블 이름
  • catalog : catalog 기능이 있는 데이터 베이스에서 catalog를 매핑한다.
  • schema : 스키마 기능이 있는 데이터베이스에서 스키마를 매핑한다.

@Id

엔티티 클래스의 필드를 테이블의 기본 키에 매핑한다.

⚠️ 기본키 매핑시

  • LONG + 대체 키 + 키 생성전략
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
- LONG
	- 아이디는 데이터 범위 넒게
	- Wrapper(Long) 타입 쓰는 이유 
	-> nullable 하기 때문에 값이 없으면 null
	0은 키값 0을 의미

@Colum

필드를 컬럼에 매핑한다.

데이터 베이스 스키마 자동 생성

JPA는 데이터베이스 스키마를 자동으로 생성하는 기능을 지원한다.

데이터 베이스 스키마 자동생성을 사용해서 엔티티만 만들고, 테이블은 자동 생성이 되도록 해본다

@Id 어노테이션을 사용해서 기본키를 직접 할당했다.

그러면 직접 할당하지 않고 데이터베이스가 생성해주는 값을 사용하려면 어떻게 매핑해야 할까?

JPA에서 제공하는 데이터 베이스 기본 키 생성전략

1. 직접 할당 : @Id 사용

2. 자동 생성 : 대리 키 사용 방식

@Id에 @GenratedValue을 추가하고 원하는 키 생성 전략 선택하면된다.

    - IDENTITY : 기본 키 생성 → 데베에 위임
    - SEQUENCE : 데베 시퀀스를 사용해서 기본 키 할당
    - TABLE : 키 생성 테이블 사용

뭐야 종류가 왜이렇게 많아? 오라클,MYSQL 같은 데이터베이스 벤더마다 지원하는 방식이 다르기 때문이다.

직접 할당 전략

@Id로 매핑하기

  • @Id 적용 가능 자바 타입은 기본형 / Wrapper / String / Date / java.sql.Date/ BigDecimal / BigInteger
  • em.persist()로 엔티티 저장 전에! 애플리케이션에서 기본 키를 직접 할당한다.
    Board board = new Board();
    borad.setId("id1") // 기본키를 직접할당하였다.
    em.persist(board);

IDENTITY 전략

기본 키 칼럼인 ID에 AUTO_INCREMENT를 추가하면 데이터 베이스에 값을 저장할 때, ID 컬럼을 비워두면 데베가 순서대로 값을 채워준다.

이 전략은 데이터베이스에 값을 저장하고 난 후에 기본 키 값을 구할 수 있을 때 사용한다.

이 전략을 사용하려면 GenerationType.IDENTITY로 지정하면 된다.

SEQUENCE 전략

유일한 값을 순서대로 생성하는 특별한 데베 OBJECT 이다.

시퀀스를 사용해서 기본 키를 생성한다.

@ENTITY
@SequenceGenerator(
name="BOARD_SEQ_GENERATOR",
// 식별자 생성기 이름 
sequenceName="BOARD_SEQ",
// 데베에 등록되어 있는 시퀀스 이름
initialValue=1, allocationSize=1)
public class Board{
@Id
@GeneratedValue(strategey=GenerationType.SEQUENCE,
generator="BOARD_SEQ_GENERATOR")
private Long id;

1. 사용할 데베 시퀀스를 매핑

@SequenceGenerator를 사용하여 BOARD_SEQ_GENERATOR라는 시퀀스 생서기 등록

JPA는 이 생성기를 실제 데베의 BOARD_SEQ 시퀀스랑 매핑한다.

2.키 생성 전략 설정 및 생성기 선택

GenerationType.SEQUENCE로 생성 전략 설정

generator="BOARD_SEQ_GENERATOR"로 생성기 선택

id 식별자 값 ->위의 생성기가 할당

이 전략은 em.persist()를 호출 시,
1. 데베 시퀀스 사용하여 식별자 조회
2. 조회한 식별자 → 엔티티에 할당
3. 엔티티를 영속성 컨텍스트에 저장
4. 트랜잭션 커밋 → 엔티티를 데베에 저장

*IDENTITY 전략은 엔티티를 데베에 먼저저장 → 식별자 조회→식별자에 할당

TABLE 전략

  • 키 생성 전용 테이블만들고 이 테이블에 컬럼을 만들어 데베 시퀀스를 흉내내는 전략
  • 이 전략을 사용하려면 키 생성 용도로 사용할 테이블 생성 필요
  • 시퀀스 대신 테이블 사용한다는 점 제외하고 시퀀스 전략과 동작방식 동일

0개의 댓글