티스토리 뷰
개요
자주 쓰이는 매핑 어노테이션에 대해 알아보자
스키마 자동 생성
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의 위치를 기준으로 접근 방식이 설정된다.
'BackEnd > JPA 스터디' 카테고리의 다른 글
[JPA 스터디 3주차] - 프록시와 연관관계 정리 (0) | 2021.07.14 |
---|---|
[JPA 스터디 3주차] - 다양한 연관관계 매핑 (0) | 2021.07.12 |
[JPA 스터디 1주차] - 영속성 관리 (0) | 2021.06.26 |
[JPA 스터디 1주차] - JPA 시작 (0) | 2021.06.24 |
[JPA 스터디 1주차] - JPA 소개 (0) | 2021.06.24 |