Spring Boot/JPA

[JPA] 엔티티 매핑 관련 annotation 정리

공대생안씨 2023. 12. 14. 22:48

1. 객체 - 테이블 매핑

 

@Entity

JPA가 관리하는 클래스 ( = 엔티티 )

DB의 테이블과 매핑할 클래스는 @Entity 필수

JPA는 내부적으로 동적으로 객체를 생성해야 한다. 따라서 기본 생성자가 반드시 필요함!

@Entity
public class Member{
	
	public Member(){}	// 기본 생성자
}

 

- @Entity(name = " ")

엔티티의 이름을 지정

기본값 : 클래스의 이름과 동일하게

@Entity(name = "USER")	// JPA 에서 해당 엔티티의 이름을 "USER"로 관리
public class Member{

	public Member(){}
}

 

@Table

해당 엔티티 (클래스) 가 DB에서의 어떤 테이블과 매핑할 지를 결정

기본값 : 엔티티 이름과 동일한 테이블

 

- @Table(name = " ")

매핑할 테이블 이름 지정

@Entity
@Table(name = "MBR")    // MBR 테이블과 엔티티를 매핑
public class Member {
}

 

- @Table(uniqueConstraints)

DDL 생성 시에 테이블에 unique 제약 조건 생성

 

 

2. 필드와 컬럼 매핑

 

@Column

 

- @Column(name = " ")

기본값 : 해당 필드의 이름 그대로

@Column(name = "user_name")	// DB 테이블의 "user_name" 컬럼과 매핑
private String name;

 

- @Column(unique)

하나의 컬럼 단위로 unique 제약 조건 걸 때 사용

@Column(unique = true)	// 컬럼에 unique 제약 조건
private String name;

 

- @Column(length)

문자의 길이를 제약, String에서만 사용

기본값 : 255

@Column(length = 20)	// 길이를 20으로 제한
private String name;

 

- @Column(nullable)

null 허용 가능 여부 설정

기본값 : true

@Column(nullable = false)	// null 불가
private String name;

 

- @Column(insertable / updatable)

컬럼 수정(insert/update) 시 DB에 반영 여부 설정

@Column(insertable = true)	// insert시 DB에 반영
private String name;
@Column(updatable = true)	// update시 DB에 반영
private String name;

 

- @Column(columnDefinition)

DB의 컬럼 정보를 직점 줌

사용한 문구가 그대로 DDL 문에 반영됨

@Column(columnDefinition = "varchar(100) default 'EMPTY'")	// 해당 문구가 DDL문에 반영
private String name;

 

@Enumerated

ENUM 타입 매핑 시 사용

 

- @Enumerated(EnumType.STRING)

ENUM 클래스에서의 ENUM 이름을 DB에 저장

@Enumerated(EnumType.STRING)	// enum 이름을 저장
private Status status;
더보기

- @Enumerated(EnumType.ORDINAL)

 

ENUM 클래스에서의 ENUM 순서를 DB에 저장

enum의 순서가 바뀔 수 있으니 사용 X !

 

@Lob

DB의 BLOB, CLOB 타입과 매핑

지정 속성이 없음

@Lob    // String 타입에 대해서는 CLOB으로 기본 생성 (MySQL에서는 longtext로 생성됨)
private String description;

 

@Transient

DB의 컬럼과 매핑 하지 않는 필드

DB와는 관계없이 메모리에서 작업하고 싶을 때 사용

@Transient  // 매핑 관계 없음
private int temp;

 

 

3. 기본 키 매핑

 

@Id

기본 키를 직접 할당하는 경우

@Id		// 기본 키 직접 할당 => 객체 생성할 때 setter 통해서 id를 넣어줘야 함
private Long id;

 

@GeneratedValue

기본 키를 자동으로 생성하는 경우

기본 키임을 나타내는 @Id 와 같이 사용

 

- @GeneratedValue(strategy = GenerationType.AUTO)

DB 방언에 맞춰서 자동으로 생성

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

 

DB 방언에 맞춰서 전송된 쿼리 확인

더보기

MySQL

 

Oracle

 

- @GeneratedValue(strategy = GenerationType.IDENTITY)

기본 키 생성을 DB에 위임, 주로 MySQL에서 사용

예시 : MySQL의 AUTO_INCREMENT 

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

 

더보기

Id는 DB가 생성하기 때문에 insert 쿼리를 실행한 이후에 알 수 있으므로 트랜잭션 커밋 시점에 쿼리를 전송하는 게 아닌 em.persist() 시점에 insert 쿼리를 전송

Member member = new Member();
member.setName("USER1");
em.persist(member);

System.out.println("================");

tx.commit();
트랜잭션 커밋 이전에 쿼리가 전송됨을 확인

 

- @GeneratedValue(strategy = GenerationType.SEQUENCE)

DB 시퀀스 오브젝트 사용, 주로 Oracle에서 사용

@SequenceGenerator 필요

@Entity
@SequenceGenerator(
	name = “MEMBER_SEQ_GENERATOR",	// 식별자 생성기 이름
	sequenceName=“MEMBER_SEQ",		// 매핑할 DB 시퀀스 이름
	initialValue = 1, allocationSize = 1)
    // initialValue : 시퀀스 DDL 생성 시 처음 시작하는 수 (기본값 : 1)
    // allocationSize : 시퀀스 한 번 호출에 증가하는 수 (기본값 : 50)
    // 50일 때는 쉽게 말해서 50개를 메모리에 땡겨오고 매번 시퀀스 사용x, 다 사용하면 시퀀스 호출 => 성능 최적화
public class Member {

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE,
    	genera tor = "MEMBER_SEQ_GENERATOR")
	private Long id;
}

 

- @GeneratedValue(strategy = GenerationType.TABLE)

키 생성 전용 테이블 만들어서 DB 시퀀스를 흉내냄

모든 DB에 적용 가능하지만 성능이 단점

@Entity
@TableGenerator(
	name = "MEMBER_SEQ_GENERATOR",	// 식별자 생성기 이름
	table = "MY_SEQUENCES",			// 키 생성 테이블 이름
	pkColumnValue = “MEMBER_SEQ", allocationSize = 1)
    // pkColumnValue : 시퀀스 컬럼명
    // allocationSize : 시퀀스 한 번 호출에 증가하는 수 (기본값 : 50)
public class Member {
	@Id
	@GeneratedValue(strategy = GenerationType.TABLE,
		generator = "MEMBER_SEQ_GENERATOR")
	private Long id;
}
더보기
create table 쿼리가 전송됨을 확인