해당 클래스에 @Entity를 추가하면 해당 객체와 DB 테이블이 매핑된다.
우리는 이를 엔티티 클래스라고 한다.
@Entity와 @MappedSuperClass 가 있는데 두 가지에 대해서 간단히 알아보겠다.
@MappedSuperClass
- 가장 중요한 점은 @MappedSuperClass가 선언되어 있는 클래스는 엔티티가 아니다.
- 부모 클래스임을 지정하며 자식 클래스가 테이블로 생성할 때 부모 클래스의 변수는 자동적으로 자식 클래스의 필드에 생성된다.
- 상속 관계 매핑이 아니다.
- 직접 생성해서 사용할 일이 없으므로 추상 클래스로 만드는 것을 권장한다.
- 테이블과 관계가 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할을 한다.
- 주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용한다.
- @CreatedDate : 작성일
- @LastModifyDate : 수정일
@Entity
- 객체를 테이블과 매핑할 엔티티라고 JPA에게 알려주는 역할을 한다.
- 즉, 엔티티 매핑을 한다고 알리는 애노테이션이다.
- JPA에서 @Entity 클래스는 @Entity나 @MappedSuperclass로 지정한 클래스를 상속할 수 있다.
- 기본 생성자가 존재해야 한다.
- final class, inner class, enum, interface에는 사용할 수 없다.
- 필드에 final을 사용하면 안 된다.
- 기본 값으로 클래스 이름을 엔티티 이름으로 사용한다.
- name : 다른 패키지에 이름이 같은 엔티티 클래스가 있다면 이름을 지정해서 충돌하지 않도록 해야 한다.
@Table
- 엔티티 클래스에 매핑할 테이블명을 선언하기 위함이다.
@Id : PK를 설정하는 애노테이션이다.
@GenerateValue : 데이터 자동으로 증가
@Column
- name : 필드와 매핑할 테이블의 컬럼 이름(기본값은 필드 이름)
- nullable : null 값 허용 여부를 설정한다. 기본 값은 true이며, false인 경우 테이블 정의 시 필드에 Not Null 제약 조건이 붙는다.
- length : 문자 제약 조건으로 기본 값을 255이며, String 타입에만 적용 가능하다.
@Temporal
- TemporalType.DATE : 년-월-일의 date 타입
- TemporalType.TIME : 시:분:초의 time 타입
- TemporalType.TIMESTAMP : date + time의 timestamp(datetime) 타입 -> 방언에 의해 자동으로 작성
@Transient
- @Transient 애노테이션이 있는 필드는 매핑이 이루어지지 않는다.
- 즉, DB에 저장하지 않고 조회하지도 않는다.
- 객체에 임시로 어떤 값을 보관하고 싶을 때 사용할 수 있다.
@Enumerated
- 자바의 enum 타입을 매핑할 때 사용한다.
- EnumType.ORDINAL : 기본 값이며, enum의 순서를 DB에 저장(순서는 순서 변경에 따라 문제가 생길 수 있다.)
- EnumType.STRING : 이름을 DB에 저장(권장)
임베디드 타입
- @Embeddable : 값 타입을 정의하는 곳에 표시
- @Embedded : 값 타입을 사용하는 곳에 표시
- 임베디드 타입은 엔티티의 값일 뿐이다.
- 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같다.
- 객체와 테이블을 아주 세밀하게 매핑하는 것이 가능하다.
- 임베디드 타입을 포함한 모든 값 타입은 값 타입을 소유한 엔티티에 생명주기를 의존함
연관관계 매핑
- @ManyToOne : 테이블 매핑 시 N:1임을 명시
- @ManyToMany : 테이블 매핑 시 N:N임을 명시
- @OneToMany : 테이블 매핑 시 1:N임을 명시
@JoinTable : 애노테이션은 M:N 관계에서 생성할 테이블 명을 정의하는 애노테이션
@JoinColumn : 외래키를 매핑할 때 사용한다. name 속성에는 매핑할 외래키 이름을 지정한다.
'백엔드 > JPA' 카테고리의 다른 글
[JPA] EntityManager와 EntityManagerFactory (0) | 2021.12.08 |
---|---|
Spring Data JPA(Repository 간단히 만들기) (0) | 2021.09.11 |
JPQL을 Querydsl로 교체해보기 (0) | 2021.09.11 |
JPA(Java Persistence API)와 JPQL(Java Persistence Query Language) 간단 정리 (0) | 2021.09.11 |
JpaRepository의 주요 메소드를 이해해보자. (0) | 2021.09.09 |
최근댓글