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;
}
'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 |