Be ready to study forever - 개발자 꿈나무

[JPA] 엔티티매핑 본문

Programming/JPA

[JPA] 엔티티매핑

루눌룹 2021. 1. 24. 10:59

앤티티를 매핑하는 방법

엔티티를 매핑할 때에는 어노테이션을 사용해서 매핑한다.

엔티티를 매핑할 때 사용하는 어노테이션들은:

-      객체와 테이블 매핑: @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 valueEnumType.ORDINAL 이지만 절대 사용해선 안되고 @Enumerated(value=EnumType.STRING) 으로 바꿔줘야 한다. 이유는 ordnalenum의 순서를 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
Comments