Be ready to study forever - 개발자 꿈나무
[JPA] 엔티티매핑 본문
앤티티를 매핑하는 방법
엔티티를 매핑할 때에는 어노테이션을 사용해서 매핑한다.
엔티티를 매핑할 때 사용하는 어노테이션들은:
- 객체와 테이블 매핑: @Entity, @Table
- 필드와 컬럼 매핑: @Column
- 기본키(Primary Key) 매핑: @Id
- 연관관계 매핑:@ManyToOne, @JoinColumn
등이 있다. 좀 더 세세하게 들어가 보자면
객체와 테이블 매핑)
객체와 테이블 매핑 어노테이션은 클래스 위에다 적어준다.
@Entity
@Entity가 붙은 클래스는 JPA가 관리하는 엔티티라고 할수 있다. 즉 이 어노테이션이 붙은 엔티티는 DB의 태이블과 매핑이 된다. 그리고 자동적으로 객체의 이름(camelCase)가 DB의 이름(snake_case)에 매핑 된므로 카멜케이스와 스네이크케이스에 대해서 유념하자.
그 이외에 주의점은:
- 사용하는 객체에 기본생성자는 반드시 있어야됨.
- final 클래스, enum, interface, inner 클래스는 매핑 할 수가 없음
@table
하지만 객체의 이름과 테이블의 이름을 다르게 쓸 경우에는? ->@table 어노테이션의 속성에 이름을 지정해 줄 수 있다. 예를들어 @Table(name=”table_name’)으로 하면 해당 객체와 table_name이라는 DB의 테이블과 매핑이 된다. name 외에도 다양한 속성들을 추가할 수 있는데
위에 테이블에서 보다 싶이 JPA는 설정에 따라서는 객체로 DB의 스키마를 정의하는 DDL을 생설할 수 있다. 그럼 그 설정은 어디서?? 바로, persistence.xml에서 정의할 수 있다.
<properties>
// DBMS별 다른 설정 여기는 HSQL 설정.
<property name="hibernate.hbm2ddl.auto" value="설정할 옵션"/>
</properties>
persistence.xml에 설정하면 된다.
표에는 해당 옵션들…
** 언듯 보면 편리해 보이지만 실무에서는 절대 쓰면 안된다… 잘못하다가 데이터가 모두 날아가나는 수가 생긴다고….
필드와 칼럼 매핑)
필드와 칼럼 매핑은 필드 위에 어노테이션을 적어준다.
필드 어노테이션에는:
@Column
@Enumerated
@Temporal
@Lob
@Tansient
@Id
@GeneratedValue
등이 있다. 그럼 하나 하나 알아 보도록 하자!
@Column
말그대로 칼럼을 정의하고 여러가지 속성을 넣을 수 있다.
name의 경우 default로 테이블과 마찬가지로 필드 이름(camelCase)이 칼럼 이름(snake_case)로 연결해 주지만 다른 이름을 쓸 경우에는 name속성에 칼럼이름을 지정해주면 된다. 예를 들어 @Column(name=”column_name”)으로 적어주면 “column_name”이란 칼럼과 매핑이 된다.
@Enumerated
자바 enum타입과 매핑할 때 사용한다.
**default value는 EnumType.ORDINAL 이지만 절대 사용해선 안되고 @Enumerated(value=EnumType.STRING) 으로 바꿔줘야 한다. 이유는 ordnal은 enum의 순서를 DB에 저장하기 때문에 Enum을 수정할 경우 시스템 장애로 돌아 올 수 있기 때문이다.
@Temporal
날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용한다. 하지만 LocalDate, LocalDateTime에는 붙여주지 않아도 된다.
@Lob
데이터베이스 BLOB. CLOB 타입과 매핑 된다. @Lob에는 지정할 수 있는 속성이 없다. 다만, 매필할때 문자형 타입이면 CLOB으로 매핑 나머지는 BLOB으로 매핑된다.
- CLOB: String타입, char[]타입, java.sql.CLOB타입
- BLOB: byte[]타입, java.sql.BLOB타입
@Transient
@Transient는 해당 필드는 칼럼과 매핑하지 않는다는 표시이다. 즉 @Transient가 있는 어노테이션은 DB에 저장하지 않고 자바 어플리케이션에서만 사용한다는 의미이다.
기본키 매핑)
기본키 매핑은 @Id, @GeneratedValue 어노테이션을 사용한다. @Id만 사용한다면 기본키를 직접 매핑하고 @GeneratedValue와 @Id를 함께 매핑하면 자동으로 생성된다.
이때 자동생성 전략을 설정할 수 있는데:
- IDENTITY
데이터베이스에 위임함(MySQL의 경우)
- SEQUENCE
데이터베이스의 시퀀스 오브젝트 사용(Oracle의 경우), 이때는 @SequenceGenerator가 필요하다.
- TABLE
키생성용 테이블을 사용한다, Sequence같은건 오라클 DB에서만 사용하지만, 이경우에는 모든 DB에서 사용 가능하다. @tableGenerator가 필요하다.
- AUTO
해당 DB의 방식에 맞긴다. 즉, 오라클일 경우 Sequence를 사용하고 MySQL의 경우 DB가 관장한다.
예제 코드를 보면,
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
처럼 사용할 수 있다.
Sequence전략의 경우 예제 코드를 보면,
@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;
}
와 같이 사용한다.
@SequenceGenerator의 속성을 보면
특히 여기서 allocationSize는 한번에 가져올 sequence의 사이즈를 의미하며 최적화를 위해 사용된다.(보통의 경우 영속성 컨택스트가 id값을 알수가 없기 때문에 꼭, 쿼리를 미리 날려야 하지만 이 경우에는 미리 50개를 땡겨 오고 할당하기 때문에 쿼리를 매번 날릴 필요가 없이 커밋시에 한번에 날린다. 따라서, 성능 향상에 도움이 됨)
table전략은 키 자동생성용 테이블을 하나 만들어서 시퀀스 처럼 이용하는 것으로 sqeunce가 없는 DB에도 시퀀스 처럼 사용할 수있으므로 모든 DB에 적용 할 수있다.
그렇치만 성능상의 이슈가 이따…
table전략의 예제 코드를 보면
//DB의 DDL
create table MY_SEQUENCES (
sequence_name varchar(255) not null,
next_val bigint, primary key ( sequence_name )
)
@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;
}
@TableGenerator의 속성을 보면
등등 설정할 수 있는게 많다.
'Programming > JPA' 카테고리의 다른 글
[JPA] JPQL (0) | 2021.01.24 |
---|---|
[JPA] 값 타입 (0) | 2021.01.24 |
[JPA] 고급 매핑 - 3 (0) | 2021.01.23 |
[JPA] 다양한 연관관계 매핑-2 (0) | 2021.01.23 |
[JPA] 연관관계 매핑 기초 - 1 (0) | 2021.01.23 |