1. 객체와 테이블 매핑
@Entity가 붙은 클래스를 JPA가 entity로 관리한다. 여기에는 꼭 파라미터가 없는 생성자가 필수로 있어야 한다.
클래스를 이름이 다른 테이블과 매핑하고 싶다면 @Table안에 name 속성에 적어주면 되고, UNIQUE 조건은 uniqueConstrains에 적어주면 된다. 칼럼 수준에서도 unique 조건을 달아줄 수 있지만 생성되는 이름이 더 복잡해지고 여러 칼럼에 unique 조건을 걸어줄 수 없기 때문에 @Table로 하는 방식을 권장한다. 이 기능은 DDL자동생성시에만 적용된다.
@Entity // JPA가 인식
@Table(name = "table_member",
uniqueConstraints={
@UniqueConstraint(columnNames={"column1","column2"})}
)
public class Member {
....
public Member() {
}
}
2. 필드와 칼럼 매핑
필드 차원에서의 몇 가지 매핑 어노테이션
@Column
- name : 다른 이름의 칼럼과 매핑
- insertable, updatable
- nullable(DDL) : default = true
- unique(DDL) : 간단하게 필드별로 적용 가능
- length(DDL) : string에만 적용
@Enumerated
EnumType.ORDINAL : 순서로 저장
EnumType.STRING : 문자로 저장
** Enumerated 주의점. 순서로 저장되는 ORDINAL로 설정하면.. 개발 중 수정사항으로 데이터 하나가 기존 순서 중간에 들어왔을 때 망함. 순서 다 밀리고 장애남..
@Temporal
- TemporalType.DATE : 날짜
- TemporalType.TIME : 시간
- TemporalType.TIMESTAMP : 날짜와 시간
@Lob (Large Object)
LOB은 TEXT, 그래픽, 이미지, 비디오, 사운드 등 구조화되지 않은 대형 데이터를 저장하는 데 사용한다.
그리고 @Lob에는 지정할 수 있는 속성이 없다. 매핑하는 필드 타입이 문자면 CLOB 매핑, 나머지는 BLOB 매핑..
- CLOB : 문자. 문자 대형 객체.
- BLOB : 이진 대형 객체 (Binary). 이미지, 동영상, MP3 등...
3. 기본키 매핑
기본키 매핑 방식은 크게 직접 할당과 자동할당이 있다.
3-1. 직접 할당
@Id
private Long id;
@Id 사용해서 직접 id를 할당.
3-2. 자동 할당
@GeneratedValue를 사용해 자동할당을 할 수 있다. 전략은 크게 3가지가 있다.
IDENTITY
기본 키 생성을 데이터베이스에 위임. 주로 MySQL, PostgreSQL, SQL Server 등에서 사용한다. (MySQL의 AUTO_ INCREMENT)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
AUTO_ INCREMENT는 insert 쿼리 후에 pk값을 알 수 있기 때문에 JPA에서 persist후에 1차 캐시에 제대로 저장을 할 수 없습니다. 따라서 identity전략은 persist시에 즉시 insert쿼리를 실행하고 DB에서 식별자를 조회해옵니다.
SEQUENCE
시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트다. 주로 오라클, PostgreSQL, DB2, H2에서 사용 가능하다. 이때 @SequenceGenerator를 사용해서 따로 시퀀스를 커스텀해서 생성해줄 수도 있다. 따로 없다면 DB에서 default로 설정된 시퀀스가 적용된다.
@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;
시퀀스 전략으로 DB 시퀀스에 저장되어있는 id값을 persist() 시에 얻어와서 1차 캐시에 넣어준다. 그리고 commit시에 flush 되면서 DB에 들어간다.
persist를 할 때마다 이렇게 시퀀스에서 id값을 가져오면서 쿼리를 날리기 때문에 성능 저하 가능성이 있는데, 이 문제를 최적화하기 위해 메모리를 미리 많이 당겨와서 DB에 쿼리를 날리지 않을 수 있다. 기본값은 50이며, allocationSize 옵션을 조절하면 된다.
TABLE
키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내 내는 전략. 장점은 모든 데이터베이스에서 사용이 가능하지만 따로 테이블을 만들어야 하기 때문에 성능에 영향을 줄 수 있어 권장되지 않는다. (아직 사용해보지 않음..)
@Entity
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnValue = “MEMBER_SEQ", allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "MEMBER_SEQ_GENERATOR")
private Long id;
'☕️자바 𝗝𝗔𝗩𝗔' 카테고리의 다른 글
[JPA] JPA 연관관계 매핑 (다대일, 일대다, 일대일, 다대다) (1) | 2022.09.21 |
---|---|
[JPA] Entity 연관관계 매핑 (연관관계의 주인) (0) | 2022.09.21 |
[JPA] JPA의 구동방식, 영속성 컨텍스트 (영속성 컨텍스트의 장점) (0) | 2022.09.20 |
[JAVA] @Builder 동작 원리, @Builder.Default, @Singular (0) | 2022.09.16 |
[Java] 불변 객체, final을 사용해야 하는 이유 (Immutable Object) (1) | 2022.09.16 |
댓글