Spring Data JPA - Entity Mapping
Spring Data JPA
백기선님의 강의인 Spring Data JPA 강의를 듣고 공부한 내용을 정리한 글
Entity Mapping
도메인 모델을 만들고 릴레이션에 매핑할지에 대한 정보를 하이버네이트에게 줘야한다.
이를 알려줄 수 있는 방법은 두 가지이다.
Annotation
XML
그러나 요즘엔 맵핑에 거-의 XML은 안쓴다. (안녕~ 구시대의 XML…)
그래서 이번 시간에는 Entity Mapping에 필요한 Annotation들을 살펴보고자 한다.
@Entity
이 도메인 클래스가 Entity야~ 라고 알려주는 애노테이션.
이 애노테이션이 붙은 클래스는 자동으로 테이블에 맵핑된다.
기본적으로는 클래스의 이름과 동일한 이름을 사용하지만 이름을 지정할 수도 있다.
그러나 여기서 말하는 Entity의 이름은 JPA나 하이버네이트같은 객체의 세상에서 부르는 이름이고 실제 Table의 이름으로 맵핑되는 것은 아니다.
@Table
릴레이션 세상에서 부르는 이름이다.
@Entity의 이름이 기본값이나 역시 이름을 설정할 수 있다.
여기서 이름을 설정하면 실제 테이블에 이름이 반영되고 SQL에 사용된다.
@id
엔티티의 primary key를 맵핑할 때 사용한다.
자바의 모든 primitive 타입과 그 래퍼타입을 사용할 수 있음.
심지어 BigDecimal, BigInteger도 가능하다!
복합키를 만들어서 맵핑하는 방법도 있다. (예전에 써봤는데 꽤나 귀찮)
@GeneratedValue
주키의 생성 방법을 맵핑하는 애노테이션
생성 전략과 생성기를 설정할 수 있다.
기본 전략은 AUTO이고, TABLE, SEQUENCE, IDENTITY가 있다.
이 전략은 하이버네이트가 DB에 따라 적절하게 전략을 선택한다.
@Column
모든 Entity에 존재하는 멤버 변수들에는 @Column이 존재하나 생략되어있다.
릴레이션에 매핑할 수 있는 옵션으로는 unique,nullable, length, columnDefinition … 등이 존재한다.
하나 특이한 녀석이 있는데, columnDefinition에 대해서 조금 알아보자.
columnDefinition은 나는 컬럼을 아주 특수한 SQL 문법을 적용시키고 싶다!라는 경우 사용할 수 있다.
@Temporal
날짜, 시간, 날짜+시간을 적용할 수 있다.
JPA 2.2부터는 LocalDateTime, ZonnedDateTime 등을 적용할 수 있다.
@Transient
이 멤버 변수는 컬럼이 아니라고 하이버네이트에게 알려주기 위해 사용한다.
Reference
인프런 백기선님의 스프링 Data JPA