-
[Spring JPA] Spring Data JPA Annotation & JPA EventBack End/Spring Data JPA 2021. 10. 22. 22:17
# Entity level Annotation
@Entity - class scope
- 해당객체가 JPA에서 관리하는 엔티티 객체임을 정의
@Id - field scope
- 해당멤버변수가 PK임을 선언
- 직접 할당
@GeneratedValue - field scope
- @Id 와 함께 사용하여 PK가 자동생성되도록 함
@GeneratedValue(strategy=Auto)
- JPA가 알아서 DB맞게 넣어줌
@GeneratedValue(strategy=TABLE)
- id를 테이블로 관리 (조회는 빠르나, 데이터수가많을수록 힘들겠지?)
@GeneratedValue(strategy=IDENTITY)
- 테이블마다 해당 id 값을 auto-increment로 지정하여 지속적으로 값을 증가시켜줌
- em.persist(sql insert) 시점에 즉시 SQL INSERT 문 실행하여 DB에서 auto-incresement 된 key 값을 조회한다.
- JPA는 보통 트랜잭션 commit 시점에 관리된 영속성들을 dirty check 하여, SQL INSERT 문을 실행한다.
@GeneratedValue(strategy=SEQUENCE)
- DB Sequence는 유일한 값을 순서대로 생성하는 DB 용 오브젝트
- IDENTITY와는 다르게 테이블마다 id 값을 고유하게 increment 시키는게 아닌 공용으로 쓰는 듯 하다.
@Table - class scope
- 테이블 생성할떄 name, cataloge, schema 등을 커스텀설정
- 디폴트로는 클래스네임으로 생성
- @Index, @UniqueConstraint => ddl 쿼리 (근데 DB자체에 설정안되어있으면 무용지물임)
- 직접 ddl 쿼리를 날리는 일은 거의 없다... 알아두기만 하자
@Column - field scope
- name="" : 필드네임은 가독성좋게 쓰고, 실제 db에 있는 칼럼과 매핑
- nullable= false : 테이블자동생성시 not null field 를 만들어주기 위함 (ddl Query)
- unique= boolean : ddl 쿼리에 추가하는 constraint
- inseratble, updatable= boolean : ddl 이 아닌 일반적인 dml에도 영향을 미침
@Transient - field scope
- 영속성처리에서 제외 (DB 엔티티의 칼럼이 아니게 됨)
- DB 데이터에 반영되지않고, 해당 객체와 생명주기를 같이 함
@Enumerated - field scope
- value=EnumType.ORDINAL : default, 순서대로 숫자로 저장 후 매핑 (이후 유지보수때 중간에 끼워넣다가 데이터전체가 바뀔수도있음)
- value=EnumType.STRING : String 으로 저장, 권장
@DynamicInsert - class, interface scope
- JPA는 기본적으로 Insert 쿼리를 날릴 때, 엔티티의 모든 칼럼들을 기입하는데, 그게 아니라 변경된 부분만 기입하여 성능적 이득을 챙길 수 있다.
@DynamicUpdate - class, interface scope
- 위와 같이, Update 쿼리에 적용된다..!
@EntityListeners(value=MyListener.class) - class scope (Entity에 어떤 리스너를 장착할지 선언)
# Event Annotation
- 너무 이름을 잘지어놔서 할말이 없다.
- 다 method scope 다.
@PrePersist
- Insert 전
- setter 메소드를 보통 선언 (createdAt 같은거)
@PreUpdate
@PreRemove
@PostPersist
@PostUpdate
@PostRemove
@PostLoad
- select 조회 이후 실행
@EntityListeners(value=MyListener.class) - class scope (Entity에 어떤 리스너를 장착할지 선언)
# Relation Annotation
@OneToMany - field scope
- FetchType.Default = LAZY
@ManyToOne - field scope
- FetchType.Default = EAGER
@OneToOne - field scope
- FetchType.Default = EAGER
@ManyToMany - field scope
- FetchType.Default = LAZY
# FetchType ?
# Spring Basic Listener
- main spring Application.java 에 @EnableJpaAuditing 추가
- 각 엔티티에 엔티티리스너(value=AuditingEntityListener.class) 추가
- Auditing 될 field 에 @CreatedDate, @LastModifiedDate 추가하면 자동으로 처리
- @CreatedBy, @LastModifiedBy 는 스프링시큐리티에서 인증정보받아서 누구에 의해 처리됬는지 찍을수도있음
728x90'Back End > Spring Data JPA' 카테고리의 다른 글
[Spring JPA] 쿼리메소드, JPQL, NativeQuery (@Query) (0) 2021.11.01 [Spring JPA] Repository Query Keywords (0) 2021.10.27 [Spring JPA] DB transaction isolation(격리수준) 개념 및 사용방법 (0) 2021.10.27 [Spring JPA] data.sql 동작방식 변경, hibernate_sequence not found 해결법 (2) 2021.10.19 [Spring JPA] JPA, Hibernate, Spring Data, ORM 의 개념 (0) 2021.10.19