Spring

Entity Mapping

yougeun 2023. 3. 18. 22:50
728x90

객체와 테이블 매핑(@Entity,@Table)

@Entity

JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수

기본 생성자 필수(파라미터가 없는 public or protected)

속성 name은 JPA에서 사용할 Entity이름을 지정할 수 있다.(기본값: 클래스 이름)

@Table

Entity와 매핑할 테이블을 지정한다.

속성

 

필드와 컬럼 매핑

매핑 어노테이션

@Column 속성

unique를 사용하여 제약조건을 걸 시 제약조건 이름이 랜덤값으로 나와 사용하지 않는 것이 좋다.

@Table의 uniqueConstraints로 이름을 설정하는 것이 오류시 잡아내기 쉬움

 

@Enumerated

ORDINAL 사용 시 Enum 클래스에 새로운 요소를 추가할 때 버그가 생길 수 있으니 STRING을 사용

@Transient

필드 매핑이 이루어지지 않는다.

데이터베이스에 저장되지 않고 조회도 되지 않는다.

메모리상에서 임시로 어떤 값을 보관하고 싶을 때 사용한다.

 

기본키 매핑

직접 할당시:@Id 만 사용

자동 생성(@GeneratedValue)

IDENTITY: 데이터베이스에 위임, MYSQL 
SEQUENCE: 데이터베이스 시퀀스 오브젝트 사용, ORACLE  -> @SequenceGenerator 필요
AUTO: 방언에 따라 자동 지정, 기본값

@IDENTITY

MYSQL,PostgreSQL,SQL server, DB2에서 사용한다.

MY_SQL의 AUTO_INCREASEMENT는 데이터베이스에 INSERT SQL을 실행 한 이후에 ID값을 할 수 있기 때문에 Entity가 영속화될 때 즉시 INSERT SQL을 날려 DB에서 식별자를 조회한다.

@SEQUENCE

오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용한다.

데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트(예: 오라클 시퀀스) 

 

@SequenceGenerator의 속성

allocationSize를 만약 50으로 설정 할 경우 DB에는 sequence를 50으로 올려두고  메모리상에서는 1씩 증가하여 sequence를 불러오는 데이터베이스와의 통신을 줄여서 성능을 최적화할 수 있다. 50개를 다 쓸 경우 데이터베이스와의 통신을 통해 size만큼 DB의 sequence를 올려준다.  하지만 size를 너무 크게 할 경우 웹 서버가 꺼지면 중간에 빈 값이 발생할 수 있으므로 적절한 size를 선택하여야 한다. 

 

 

 

 

 

 

 

 

 

728x90