1. 객체와 테이블 매핑
엔티티 매핑 소개
- 객체와 테이블 매핑: @Table, @Entity
- 필드와 컬럼 매핑: @Column
- 기본 키 매핑: @Id
- 연관관계 매핑: @ManyToOne, @JoinColumn
@Entity
@Entity가 붙은 클래스가 JPA가 관리, 엔티티라한다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity는 필수다.
주의 사항
- 기본 생성자 필수
- final 클래스, enum, interface, inner 클래스 사용불가
- 저장할 필드에 final 사용불가
@Table
@Table은 엔티티와 매핑할 테이블을 지정할 수 있다.
속성 | 기능 | 기본값 |
name | 매핑할 테이블 이름 | 엔티티 이름을 사용 |
catalog | 데이터베이스 catalog 매핑 | |
schema | 데이터베이스 schema 매핑 | |
uniqueConstraints | DDL 생성 시에 유니크 제약 조건 생성 |
2. 데이터베이스 스키마 자동 생성
JPA에서 제공하는 기본 기능중에 DDL을 애플리케이션 실행 시점에 자동 생성해주는 기능이 있다.
application.yml
spring:
jpa:
hibernate:
ddl-auto: create
설정 파일에 ddl-auto: create로 설정을 하면 된다.
이렇게 만들어주는 DDL은 데이터베이스에 맞게 자동으로 생성해준다. (오라클에서는 오라클 문법에 맞게, MySql에서는 MySql문법에 맞게) 이렇게 생성된 DDL은 개발 장비에서만 사용해야 한다.
ddo-auto의 설정 옵션은 다음과 같다.
옵션 | 설명 |
create | 기존테이블에 삭제후 다시 생성 |
create-drop | create와 같으나 종료시점에 drop table |
update | 변경분만 반영 |
validate | 엔티티와 테이블이 정상 매핑되어있는지 확인 |
none | 아무런 동작 X |
DDL 생성할 때 조건도 설정할 수 있다. @Column 어노테이션안에 설정할 수 있다. DDL 생성 기능은 DDL을 자동생성할 때만 사용되고 JPA 실행로직에는 영향을 주지 않는다.
@Column(nullable = false, unique = true, length = 50)
private String username;
옵션 | 설명 | 기본값 |
nullable | 컬럼 NULL을 허용 여부 지정 | true |
unique | 컬럼 UNIQUE 제약 조건 부여 | false |
length | VARCHAR타입 컬럼 최대 길이 지정 | 255 |
precision | BIGDECIMAL타입 소수점 자릿수를 포함한 전체 자릿수 지정 | 0 |
scale | BIGDECIMAL타입 소수 자릿수 지점 | 0 |
name | 데이터베이스에서 사용할 컬럼 이름 지정 | |
insertable | 설정한 컬럼이 INSERT SQL 문에 포함 여부 지정 | true |
updatable | 설정한 컬럼이 UPDATE SQL 문에 포함 여부 지정 | true |
conlumnDefinition | 직접 데이터베이스 컬럼 정의 명시 |
3. 필드와 컬럼 매핑
다음은 JPA에서 엔티티 클래스와 필드를 데이터베이스 컬럼에 매핑할 수 있는 주요 어노테이션이다.
어노테이션 | 설명 | 주요 속성 및 특징 |
@Transient | 해당 필드를 데이터베이스에 매핑하지 않도록 지정 | 영속성 관리에서 제외 |
@Enumerated | enum 타입의 필드를 데이터베이스에 매핑 | 저장 방식(String, Ordinal) |
@Lob | 큰 데이터를 저장하기 위해 사용(BLOB, CLOB) | String 타입: CLOB, byte[] 타입: BLOB |
@Temporal | Date나 Calendar타입을 특정 날짜 시간 형식으로 매핑 | TemporalType: Date, Time, TIMESTAMP 중 선택 |
@Basic | 기본적인 매핑을 제공하며 필드의 로딩 전략 설정 | fetch: 로딩 방식(EAGER, LAZY) |
4. 기본 키 매핑
기본 키 매핑 어노테이션은 다음 두가지가 있다.
- @Id.
- @GeneratedValue
개발자가 ID를 직접 할당을 할려면 @Id 어노테이션만 붙이면 된다.
ID를 자동할당(생성) 할려면 @GenerateValue를 붙이면 된다. 자동 할당 전략은 다음과 같다.
- SEQUENCE: 데이터베이스 시퀀스를 사용하여 기본 키 값 생성
- AUTO: 자동으로 적절한 키 생성 전략 선택
- IDENTITY: 기본 키 생성을 데이터베이스에 위임 (ex: MySql Auto Increment)
- UUID: 키 값을 전역 고유 식별자 형태로 생성
- TABLE: 별도의 키 생성 테이블을 사용하여 기본 키 값을 관리
A. GenerationType.SEQUENCE
- 설명: 데이터베이스 시퀀스를 사용하여 기본 키 값을 생성한다. 주로 Oracle, PostgreSQL과 같은 시퀀스를 지원하는 데이터베이스에서 사용된다.
- 예시:
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private Long id;
@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;
}
B. GenerationType.AUTO
- 설명: 자동으로 적절한 키 생성 전략을 선택한다. JPA 구현체가 사용하는 데이터베이스에 맞는 전략을 자동으로 결정한다.
- 예시:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
C. GenerationType.IDENTITY
- 설명: 데이터베이스의 IDENTITY 컬럼을 사용하여 기본 키 값을 생성한다. 주로 MySQL, SQL Server 등에서 사용된다.
- 특징:
- ID값을 알 수 있는 시점은 데이터베이스에 INSERT를 해야 알 수 있다.
- 하지만 JPA의 영속성 컨텍스트에 관리될려면 PK값이 있어야 한다.
- 그래서 원래는 commit할 때 INSERT 쿼리가 실행됐다면 IDENTITY에서는 persist( )를 호출하자마자 INSERT 쿼리를 실행한다.
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Member member1 = new Member();
member1.setUsername("member1");
member1.setAge(20);
System.out.println("==================");
em.persist(member1);
System.out.println("member1.getId() = " + member1.getId());
System.out.println("==================");
tx.commit();
} // ..이하 생략
- 예시:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
D. UUID
- 설명: UUID(Universally Unique Identifier) 전략은 키 값을 전역 고유 식별자 형태로 생성한다다.
- 특징:
- 데이터베이스가 아닌 애플리케이션에서 UUID 값을 생성하며, 고유성이 보장된다.
- UUID는 매우 긴 문자열이기 때문에 저장 공간이 더 필요할 수 있다.
- 분산 시스템이나 클러스터 환경에서 중복되지 않는 키 값을 보장하는 데 유용
- 사용 방법:
- @GeneratedValue 어노테이션 대신 수동으로 UUID를 생성하거나, Hibernate의 @GenericGenerator를 사용할 수 있습니다.
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "uuid2")
private String id;
E. GenerationType.TABLE
- 설명: 별도의 키 생성 테이블을 사용하여 기본 키 값을 관리하는 전략이다.
- 특징:
- 별도의 테이블을 생성하여 기본 키 값을 관리합니다. 이 테이블에서 고유 키 값을 읽어와 엔티티의 기본 키로 사용한다.
- 특정 데이터베이스에 의존하지 않고, 모든 데이터베이스에서 일관되게 사용할 수 있는 전략이다.
- 성능 면에서 다른 전략들에 비해 느릴 수 있다. 추가적인 테이블 접근이 필요하기 때문이다.
- 예시:
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "table_generator")
@TableGenerator(name = "table_generator", table = "key_gen_table", pkColumnName = "gen_name", valueColumnName = "gen_value", allocationSize = 1)
private Long id;
'JPA' 카테고리의 다른 글
[JPA] JPA의 타입 (임베디드 타입, 값 타입, 컬렉션 타입)이란? (1) | 2024.12.20 |
---|---|
[JPA] 프록시와 지연로딩, 즉시로딩 (0) | 2024.11.26 |
[JPA] 연관관계 매핑 (0) | 2024.11.25 |
[JPA] 영속성 전이 CASCADE, OrphanRemoval = true 이해 및 차이 (0) | 2024.11.19 |
[JPA] JPA와 영속성 컨텍스트란? (1) | 2024.11.18 |