- 엔티티 매핑
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 프로그래밍 - 기본편)
'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 |