본문 바로가기
Spring

Spring JPA / Entity 매핑

by yang sing 2023. 6. 21.

안녕하세요. 

지난 JPA 포스팅에 이어서 이번 포스팅에는 JPA의 Entity 매핑에 대해서 작성을 하려고 합니다.

JPA를 사용하면서 다양한 어노테이션을 사용을 해야하는데 오늘은 JPA에서 사용하는 어노테이션들과 어떻게 java 객체가 DB와 매핑이 되는지 작성을 하겠습니다.

 

@Entity

- Entity(엔티티)란 JPA에서 관리하는 DB와 매핑되는 객체를 뜻합니다.
- JPA에서 DB 테이블과 매핑할 객체의 클래스에는 @Entity 어노테이션 사용
- Entity 클래스에서는 기본 생성자가 반드시 있어야 하며 final, enum, interface, inner 클래스는 사용할 수 없다.
- name 옵션으로 JPA에서 사용할 엔티티 이름을 지정할 수 있다.

@Table

- Entity와 매핑할 테이블을 지정한다.
- name 속성을 통해 DB 테이블과 매핑
- catalog 속성을 통해 DB catalog와 매핑
- schema 속성을 통해 DB schema와 매핑
- uniqueConstraints 속성을 통해 DDL 생성 시에 유니크 제약 조건을 생성한다. -> DDL 자동 생성은 추후에 자세히...

@Id

- Table의 PK에 해당되는 필드에 사용한다.
- PK값을 DB가 아닌 어플리케이션에서 직접 할당할 경우 @Id 어노테이션만 사용하고 해당 필드에 값을 직접 넣어주면된다.

@GeneratedValue

- PK값을 어플리케이션에서 직접 할당하는게 아니라 DB 옵션을 통해서 자동 생성을 할 때 사용한다. ex) mySql - auto_increment
- IDENTITY, SEQUENCE, TABLE, AUTO 4가지 옵션을 사용한다.

@Column

- 필드와 매핑할 테이블의 컬럼을 정의할 수 있다.
- name 옵션으로 테이블의 컬럼명을 지정한다.

 

@Entity
@Table(name="tb_user")
public class User{
	
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long seq;
    @Column(name="user_id")
    String id;
    
    // 기본 생성자
    public User(){
    }
}

@GeneratedValue 의 종류

1. IDENTITY 

  - 기본키 생성을 DB에 위임

  - MySq, PostgreSQL, SQL Server, DB2에서 사용을 한다.

  - IDENTITY 전략은 em.persist() 시점에서 즉시 INSERT 구문을 실행하고 DB에서 식별자를 조회

 

2. SEQUENCE 

  - 데이터베이스 시퀀스라는 데이터베이스 오브젝트를 사용하여 유일한 값을 순서대로 생성한다.

  - 추가적인 @SequenceGenerator 어노테이션이 필요

  - Oracle, PostgreSQL, DB2, H2에서 사용을 한다.

@Entity
@Table(name="tb_user")
@SequenceGenerator(
 name = "식별자 생성기 이름", // @GeneratedValue의 generator에 매핑
 sequenceName = "오라클에서 생성한 시퀀스 이름",
 initialValue = 1, // DDL 생성 시 처음 시작하는 시퀀스 수 지정
 allocationSize = 1 // 시퀀스 한번 호출에 증가하는 수 - DB 시퀀스 증가값과 일치시켜야한다.
 )
public class User{
	
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE,
                 generator = "식별자 생성기 이름")
    Long seq;
    @Column
    String id;
    
    // 기본 생성자
    public User(){
    }
}

3. Table 

  - 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략

  - 모든 데이터베이스에 적용이 가능하지만 성능면에서는 좋지는 않다.

@Entity
@Table(name="tb_user")
@TableGenerator(
 name = "식별자 생성기 이름", // @GeneratedValue의 generator에서 사용
 table = "키생성 테이블명",
 pkColumnValue = "시퀀스 컬럼명",
 initialBalue = 0 // 초기값으로 마지막으로 생성된 값이 기준이 된다.
 allocationSize = 1 // 시퀀스 한번 호출에 증가하는 수
 )
public class User{
	
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE,
                 generator = "식별자 생성기 이름")
    Long seq;
    @Column
    String id;
    
    // 기본 생성자
    public User(){
    }
}

 

 

참고 : 인프런 - 자바 ORM 표준 JPA 프로그래밍 - 기본편 / 김영한 강의

'Spring' 카테고리의 다른 글

Spring JPA / 양방향 연관관계 주의사항  (0) 2023.06.27
Spring JPA / Entity 연관관계  (0) 2023.06.27
Spring JPA / JPA  (0) 2023.06.20
Spring AOP  (0) 2023.06.13
Object Storage 이미지 출력  (0) 2023.06.09