Entity: 테이블에 대응하는 하나의 클래스이다.

Entity Manager : 관리하는 엔티티 객체들을 영속 컨텍스트에 넣어두고 객체들을 관리한다.

영속 컨텍스트: JPA가 엔티티 객체들을 모아두는 공간

 

영속 컨텍스트 상태

new(비영속) Java영역에만 존재하고, DB에 연동된 적 없는 상태이다. 
순수한 Java객체로 엔티티 매니저가 관리하지 않는다.
Managed(영속) DB에 저장되고, 메모리 상에서도 같은 상태로 존재하는 상태이다
PK값을 통해 필요한 엔티티 객체를 꺼내 사용할 수 있게 됩니다.
Removed(삭제) DB상에서 삭제된 상태이다.
객체는 영속 컨텍스트에 존재하지 않는다.
Detached(준영속) 영속 컨텍스트에서 엔티티 객체를 꺼내 사용하는 상태이다.
아직 DB와 동기화가 이루어 지지 않는 상태이다.
영속성 켄텍스트가 제공하는 기능을 사용하지 못한다.

준영속 상태로 만드는 방법

  1. em.detach(entity): 특정 엔티티만 준영속 상태로 전환
  2. em.clear() : 영속성 컨텍스트를 완전히 초기화
  3. em.close() : 영속성 컨텍스트를 종료

 

 

JPA는 자동으로 테이블을 생성할 수 있는 기능이 있다. 다음은 2가지 방식이다.

  1. SQL을 이용해서 테이블을 먼저 생성하고 엔티티 클래스를 만드는방식
  2. JPA를 이용해서 클래스만 설계하고 자동으로 테이블 생성하는 방식

엔티티 설계시 주의점

1.엔티티에는 가급적 Setter를 사용하지 말자!

Setter가 모두 열려있다. 변경 포인트가 너무 많아서 유지보수가 어렵다. 나중에 리펙토링으로 Setter제거한다.

 

2.모든 연관관계는 지연로딩으로 설정!

즉시로딩(EAGER)은 예측이 어렵고, 어떤 SQL이 실행될 지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1의 문제가 자주 발생한다. 그러므로 실무에서 모든 연관관계는 지연로딩(LAZY)방식으로 설계해야한다.

연관된 엔티티를 함께 DB조회시 fetch join 또는 엔티티 그래프 기능을 사용한다.

@OneToOne, @ManyToOne 관계는 기본값이 즉시로딩이므로 지연로딩으로 설정 해야 한다.

 

3.컬렉션은 필드에서 초기화 하자

컬렉션은 필드에서 바로 초기화 하는 것이 null문제에서 안전하다.

임의의 메서드에서 컬렉션을 잘못 생성하면 하이버네이트 내부 메커니즘에 문제가 발생할 수 있다. 

따라서 필드 레벨에서 생성하는 것이 가장 안전하고 코드도 간결하다.

 

 

 

스프링 부트 신규 설정 (엔티티(필드) 테이블(컬럼))

  1. 카멜 케이스 -> 언더 스코어(memberPoint -> member_point)
  2. .(점) -> _(언더 스코어)
  3. 대문자 -> 소문자

 

 

플러시: 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다.

  1. 영속성 컨텍스트를 비우지 않는다
  2. 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화시킨다.
  3. 트랜잭션이라는 작업 단위가 중요하다( 커밋 직전에만 동기화 하면된다.)

 

 

플러시 발생

  1. 변경 감지
  2. 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
  3. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송(등록, 수정, 삭제 쿼리)

 

 

영속성 컨텍스트를 플러시하는 방법

  1. em.flush() - 직접호출
  2. 트랜잭션 커밋 - 플러시 자동 호출
  3. JPQL 쿼리 실행 - 플러시 자동 호출

 

 

플러시 모드 옵션

em.setFlushMode(FlushModeType.AUTO)
커밋이나 쿼리를 실행할 때 플러시(기본값)
em.setFlushMode(FlushModeType.COMMIT)
커밋할 때만 플러시

 

 

 

 

 

 

 

 

 

출처: https://velog.io/@jayjay28/%EC%97%94%ED%8B%B0%ED%8B%B0Entity

 

엔티티(Entity)

엔티티? JPA에서는 엔티티는 테이블에 대응하는 하나의 클래스라고 생각하시면 편합니다.엄청나게 간단한 코드와 함께 같이 보겠습니다. 엔티티 클래스 데이터베이스의 테이블 |username|passoword| |

velog.io

https://www.inflearn.com/course/ORM-JPA-Basic

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

+ Recent posts