티스토리 뷰

BackEnd/JPA 스터디

[JPA 스터디 2주차] - 엔티티 매핑

영지는 달리는중 2021. 7. 5. 14:09

개요

자주 쓰이는 매핑 어노테이션에 대해 알아보자 

 

스키마 자동 생성

JPA는 데이터베이스 스키마를 자동으로 생성하는 기능을 지원한다. persistence.xml에 다음 속성을 추가하면

<property name="hibernate.hbm2ddl.auto" value="create" />

애플리케이션 실행 시점에 데이터베이스 테이블을 자동으로 생성한다. 해당 속성에 대한 옵션은 아래와 같다

옵션 설명
create 기존 테이블을 삭제하고 새로 생성한다. DROP + CREATE
create-drop create 속성에 추가로 애플리케이션을 종료할 때 생성한 DDL을 제거한다
update  데이터베이스 테이블과 엔티티 매핑정보를 비교해서 변경 사항만 수정한다
validate 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션을 실행하지 않는다. DDL을 수정하지 않는다
none 자동 생성 기능을 사용하지 않을 때 사용한다

운영 서버에서는 DDL을 수정하는 옵션을 절대 사용하면 안된다. 오직 개발 서버나 개발 단계에서만 사용하도록 한다.

 

객체와 테이블 매핑

@Entity

속성 기능 기본값
name JPA에서 사용할 엔티티 이름을 지정 설정하지 않으면 클래스 이름을 그대로 사용

JPA가 엔티티 객체를 생성할 때 기본 생성자를 사용하므로 기본 생성자가 반드시 있어야한다. @NoArgConstructor 어노테이션이 함께 자주 쓰이는 이유이기도 하다. 

 

@Table

속성 기능 기본값
name 매핑할 테이블 이름 엔티티 이름을 사용한다
catalog catalog 기능이 있는 디비에서 catalog를 매핑  
schema schema 기능이 있는 디비에서 schema를 매핑  
uniqueConstraints DDL 생성 시 유니크 제약조건을 만든다. 이 기능은 스키마 자동 생성 기능을 사용해서 DDL을 만들 떄만 사용된다  

*유니크 제약조건이란 ? 설정된 칼럼에는 중복된 값이 들어가지 못하게 설정하는 제약조건

 

기본  키  매핑

기본키를 직접 할당하려면 @Id만 사용하면 되고, 자동 생성 전략을 사용하려면 @Id에 @GeneratedValue를 추가하고 원하는 키 생성 전략을 선택하면 된다. 

 

1) IDENTITY 전략

기본 키 생성을 데이터베이스에 위임하는 전략이다. MySQL의 AUTO_INCREAMENT와 같은 기능을 사용하기 위한 전략이라고 볼 수 있다.이 전략을 사용하면 JPA는 기본 키 값을 얻어오기 위해 데이터베이스를 추가로 조회한다. 

@Entity
public class Board {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; 
...

}

엔티티를 데이터베이스에 저장후에 식별자를 조회해서 엔티티의 식별자에 할당한다. em.persist()를 호출하는 즉시 insert문이 데이터베이스에 전달되기 떄문에 쓰기지연이 동작하지 않는다. 

 

2) SEQUENCE 전략

유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트이다. 해당 전략은 이 시퀀스를 사용해서 기본 키를 생성한다. 이 전략은 시퀀스를 지원하는 오라클, PostgreSQL,DB2,H2 데이터베이스에서 사용할 수 있다. 

@Entity
@SequenceGenerator(
		name= "BOARD_SEQ_GENERATOR",
   		sequenceName = "BOARD_SEQ", //매핑할 데이터베이스 시퀀스 이름
   		initialValue = 1, allocationSize=1)
public class Board {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
		generator = "BOARD_SEQ_GENERATOR")
 private Log id
....
}

em.persist()를 호출할 때 먼저 데이터베이스 시퀀스를 사용하여 식별자 조회 후 엔티티에 할당한 후에 엔티티를 영속성 컨텍스트에 저장한다. 그 후 트랜잭션을 커밋해서 플러시가 일어나면 엔티티를 데이터베이스에 저장한다.

 

3) TABLE 전략

키 생성 전용 테이블을 하나 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략이다. 해당 전략을 사용하려면 키 생성 용도로 사용할 테이블을 만들어야 한다. 

@Entity
@TableGenerator(
name="BOARD_SEQ_GENERTOR",
table="MY_SEQUENCES",
pkColumnValue="BOARD_SEQ", allocationsize = 1)
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "BOARD_SEQ_GENERATOR")
private Long id;
...
}

해당 전략은 시퀀스 대신에 테이블을 사용한다는 것만 제외하면 시퀀스 전략과 내부 동작방식이 같다. 

 

필드와 컬럼 매핑

@Column

객체 필드를 테이블 컬럼에 매핑한다. 가장 많이 사용되고 기능도 많다. 속성중에 name, nullable이 주로 사용되고 나머지는 잘 사용되지 않는 편이다. 

속성 기능 기본값
name 필드와 매핑할 테이블의 컬럼 이름 객체의 필드 이름
insertable 엔티티 저장 시 이 필드도 같이 저장한다. false로 설정하면 이 필드는 데이터베이스에 저장하지 않는다. false 옵션은 읽기 전용일 때 사용한다.  true
updatable 엔티티 수정 시 이 필드도 같이 수정한다. false로 설정하면 데이터베이스에 수정하지 않는다. false 옵션은 읽기 전용일 때 사용한다  true
table 하나의 엔티티를 두 개 이상의 테이블에 매핑할 때 사용 현재 클래스가 매핑된 테이블
nullable null값의 허용 여부를 설정 true
unique 한 칼럼에 간단히 유니크 제약조건을 걸 때 사용한다. 두 칼럼 이상을 사용해서 유니크 제약조건을 사용하려면 클래스 레벨에서 @Table.uniqueConstraints를 사용해야 한다  
columnDefinition 디비 컬럼 정보를 직접 줄 수 있다 필드의 자바 타입과 방언 정보를 사용햐서 적절한 칼럼 타입을 생성
length 문자 길이 제약조건, String 타입에서만 사용한다. 255
precision, scale BigDecimal 타입에서 사용한다. precision은 소수점을 포함한 전체 자릿수를, scale은 소수의 자릿수이다.  precision = 19,
scale = 2

 

@Enumerated

자바의 enum 타입을 매핑할 때 사용한다.

속성 기능 기본값
value - EnumType.ORDINAL : enum 순서를 저장 -> 0,1,2 ...
- EnumType.STRING : enum 이름을 저장
EnumType.ORDINAL

 

@Temporal

날짜 타입을 매핑할 때 사용한다.

속성 기능 기본값
value - TemporalType.DATE: 날짜, date 타입과 매핑
- TempralType.TIME : 시간, time 타입과 매핑
- TemporalType.TIMESTAMP : 날짜와 시간, timestamp 타입과 매핑
필수로 지정해야 한다

 

@Lob

대형의 데이터를 저장시에 사용한다.  해당 어노테이션은 속성이 없고 매핑하는 필드 타입이 문자면 CLOB으로 매핑하고 나머지는 BLOB으로 매핑한다. 

 

@Transient

해당 어노테이션을 적용한 필드는 매핑하지 않는다. 객체에 임시로 어떤 값을 보관하고 싶을 때 사용한다.

 

@Access

JPA가 엔티티 데이터에 접근하는 방식을 지정한다. 

- 필드 접근 : AccessType.FIED로 지정한다. 필드에 직접 접근한다. 필드 접근 권한이 private 이어도 접근할 수 있다.

- 프로퍼티 접근 : AccessType.PROPERTY로 지정한다. 접근자 getter를 사용하여 접근할 수 있다.

@Access를 설정하지 않으면 @Id의 위치를 기준으로 접근 방식이 설정된다. 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함