Programming/JPA

JPA - 엔티티 매핑

잇(IT) 2023. 7. 14. 17:27

- 엔티티 매핑

 

1. 객체와 테이블 매핑 : @Entity, @Table

2. 필드와 컬럼 매핑 : @Column

3. 기본 키 매핑 : @Id

4. 연관관계 매핑 : @ManyToOne, @JoinColumn


- @Entity

1. @Entity가 붙은 클래스는, JPA가 관리, 엔티티라 한다.

2. 기본 생성자는 필수다. (final, enum, interface, inner 클래스 사용 X)

3. @Entity의 속성으로 name을 사용할 수 있다.

3.1. JPA에서 사용할 엔티티 이름을 지정한다.

3.2. 기본값은 클래스 이름을 그대로 사용한다.

@Entity(name = "ooo")

@Table

1. @Table은 엔티티와 매핑할 테이블 지정한다.

2. 실제 DB에 있는 테이블명과 매칭할 때 사용한다.

select from (@Table에서 지정한 이름)

- 위와 같이 직접 지정한 테이블 이름으로 조회한다.


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

1. DDL을 애플리케이션 실행 시점에 자동 생성한다.

2. 테이블 중심 -> 객체 중심

3. 데이터베이스에 맞는 적절한 DDL 생성

4. 이렇게 생성된 DDL은 개발 장비에서만 사용한다.

 

- 데이터베이스 스키마 자동 생성 - 속정

1. create : 기존 테이블 삭제 후 다시 생성 (DROP + CREATE)

2. create-drop : create와 같으나 종료시점에 테이블 DROP

3. update : 변경분만 반영(운영DB에는 사용하면 안된다.)

4. validate : 엔티티와 테이블이 정상 매핑되었는지만 확인

5. none : 사용하지 않음

* 주의 

1. 운영 장비에는 절대 create, create-drop, update 사용하면 안된다.

2. 개발 초기 단계는 create 또는 update

3. 테스트 서버는 update 또는 validate

4. 스테이징과 운영 서버는 validate 또는 none

 

- DDL 생성 기능은 DDL을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않는다.


- 매핑 어노테이션

@Entity 
public class Member { 

 @Id 
 private Long id; 

 @Column(name = "name") 
 private String username; 
 private Integer age; 

 @Enumerated(EnumType.STRING) 
 private RoleType roleType; 

 @Temporal(TemporalType.TIMESTAMP) 
 private Date createdDate; 

 @Temporal(TemporalType.TIMESTAMP) 
 private Date lastModifiedDate; 

 @Lob 
 private String description;

1. @Column : 컬럼 매핑

2. @Temporal : 날짜 타입 매핑

3. @Enumerated : enum 타입 매핑

4. @Lob : BLOB, CLOB 매핑

5. @Transient : 특정 필드를 컬럼에 매핑하지 않음(매핑 무시)


- @Enumerated

1. @Enumerated 어노테이션은 EnumType으로 2가지를 가질 수 있다.

1.1. EnumType.ORDINAL : enum 순서를 데이터베이스에 저장

1.2. EnumType.STRING : enum 이름을 데이터베이스에 저장

 

- @Enumerated 어노테이션은 STRING 사용한다!


- 기본 키 매핑 어노테이션

 

1. @Id

2. @GeneratedValue

@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

 

- 직접 할당

1. @Id만 사용

 

- 자동 생성(@GeneratedValue)

1. IDENTITY: 데이터베이스에 위임, MYSQL

2. SEQUENCE: 데이터베이스 시퀀스 오브젝트 사용, ORACLE

   2.1. @SequenceGenerator 필요

3. TABLE: 키 생성용 테이블 사용, 모든 DB에서 사용

   3.1. @TableGenerator 필요

4. AUTO: 방언에 따라 자동 지정, 기본값


- IDENTITY 전략

1. 기본 키 생성을 데이터베이스에 위임

2. 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용

3. JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL 실행

4. AUTO_ INCREMENT는 데이터베이스에 INSERT SQL을 실행 한 이후에 ID 값을 알 수 있다.

5. IDENTITY 전략은 em.persist() 시점에 즉시 INSERT SQL 실행 하고 DB에서 식별자를 조회한다.

@Entity 
public class Member { 
 @Id 
 @GeneratedValue(strategy = GenerationType.IDENTITY) 
 private Long id;

- SEQUENCE 전략

1. 데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트(예: 오라클 시퀀스)

2. 오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용

@Entity 
@SequenceGenerator( 
 name = “MEMBER_SEQ_GENERATOR", 
 sequenceName = “MEMBER_SEQ", //매핑할 데이터베이스 시퀀스 이름
 initialValue = 1, allocationSize = 1) 
public class Member { 
 @Id 
 @GeneratedValue(strategy = GenerationType.SEQUENCE, 
 generator = "MEMBER_SEQ_GENERATOR") 
 private Long id;

- allocationSize : 시퀀스 한 번 호출에 증가하는 수(성능 최적화에 사용됨 데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면 이 값 을 반드시 1로 설정해야 한다

- SEQUENCE 전략에서 JPA는 DB에 있는 sequence에서 값을 하나씩 가져다가 사용한다.

- allocationSize를 설정하면 해당 값만큼 DB에 있는 sequence에서 값을 해당 값만큼 메모리에 가져와 사용한다.

- 설정한 값만큼 한번에 가져오기 때문에 DB에서 매번 sequence 값을 가져오지 않아도 된다는 장점이 있다.


- 권장하는 식별자 전략

1. 기본 키 제약 조건: null 아님, 유일, 변하면 안된다.

2. 미래까지 이 조건을 만족하는 자연키는 찾기 어렵다. 대리키(대 체키)를 사용하자.

3. 예를 들어 주민등록번호도 기본 키로 적절하기 않다.

* 4. 권장: Long형 + 대체키 + 키 생성전략 사용

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

출처 : 인프런 - 우아한 형제들 기술이사 김영한의 스프링 완전 정복 (자바 ORM 표준 JPA 프로그래밍 - 기본편)

728x90

'Programming > JPA' 카테고리의 다른 글

JPA - 고급 매핑  (0) 2023.07.14
JPA - 다양한 연관관계 매핑  (0) 2023.07.14
JPA - 연관관계 매핑 기초  (0) 2023.07.14
JPA - 영속성 관리  (0) 2023.07.14
JPA - JPA 시작하기  (0) 2023.07.12