본문 바로가기
☕️자바 𝗝𝗔𝗩𝗔

[JPA] Entity 매핑 (필드와 칼럼 매핑, 기본키 매핑)

by 비타민찌 2022. 9. 21.
728x90

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;

 

출처

https://www.baeldung.com/hibernate-lob

728x90

댓글