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

2023. 12. 14. 22:48· Spring Boot/JPA
목차
  1. 1. 객체 - 테이블 매핑
  2. 2. 필드와 컬럼 매핑
  3. 3. 기본 키 매핑

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 쿼리가 전송됨을 확인

 

 

저작자표시 변경금지 (새창열림)

'Spring Boot > JPA' 카테고리의 다른 글

[JPA] 연관관계 매핑 - 상속관계 매핑, @MappedSuperclass  (1) 2023.12.18
[JPA] 연관관계 매핑 - 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M)  (0) 2023.12.18
[JPA] 연관관계 매핑 - 단방향 매핑, 양방향 매핑  (1) 2023.12.18
[JPA] 영속성 컨텍스트, 엔티티 매니저 CRUD  (0) 2023.12.13
[JPA] 엔티티 매니저 팩토리, 엔티티 매니저  (0) 2023.12.13
  1. 1. 객체 - 테이블 매핑
  2. 2. 필드와 컬럼 매핑
  3. 3. 기본 키 매핑
'Spring Boot/JPA' 카테고리의 다른 글
  • [JPA] 연관관계 매핑 - 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M)
  • [JPA] 연관관계 매핑 - 단방향 매핑, 양방향 매핑
  • [JPA] 영속성 컨텍스트, 엔티티 매니저 CRUD
  • [JPA] 엔티티 매니저 팩토리, 엔티티 매니저
공대생안씨
공대생안씨
전자공학과 학부생의 코딩 일기
티스토리
|
로그인
공대생안씨
공대생의 코딩 일기
공대생안씨
글쓰기
|
관리
전체
오늘
어제
  • All Categories (153)
    • Spring Boot (46)
      • JPA (7)
      • Lombok (2)
    • Java (21)
    • DevOps (3)
      • CI,CD (8)
      • Monitoring (2)
    • Database (7)
      • MySQL (5)
      • MongoDB (1)
      • H2 (1)
    • Trouble Shooting (5)
    • FE (4)
    • IntelliJ (3)
    • Git (3)
    • Algorithm (41)

블로그 메뉴

  • 홈
  • 태그
  • Github

공지사항

인기 글

hELLO · Designed By 정상우.v4.2.2
공대생안씨
[JPA] 엔티티 매핑 관련 annotation 정리
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.