로그인 구현 하면서 accesstoken 과 accesstoken 이 만료되었을 때 이를 해결해주는 refreshtoken 이 필요하다라는 것을 나중에 알아 고생했다.
먼저 헷갈리는 부분은
1. Entity 작성법
2. EntityManager 와 트랜잭션
3. Entity 와 EntityManager의 차이는?
4. 영속성 컨텍스트(Persistence context)
- EntityManager 와 트랜잭션
- em 을 통해서 CRUD 를 제공한다.
- 엔티티와 관련된 일을 처리하는 엔티티 관리자이다.
- 엔티티 매니저는 데이터 베이스 커넥션과 밀접한 관계가 있으므로 스레드간에 공유하거나 재사용 X
- 특정 작업을 위해 데이터베이스에 액세스하는 역할을 담당한다.
- 엔티티 매니저 팩토리를 이용해서 생성한다
+ 엔티티 매니저 팩토리 :
- DB를 하나만 사용하는 어츨리케이션이라면 일반적으로 하나만 만든다.
- 스레드 세이프하기 때문에 여러 스레드가 동시 접근해도 안전
- 여러 스레드 동시 접근 X
- 엔티티 생명주기
- new 생성 : 엔티티 인스턴스 초기화된 상태
- managed 관리 : 엔티티 인스턴스가 영속성 컨택스트에 저장된 상태
- detached 분리 : 엔티티 인스턴스가 영속성 컨택스트에서 분리된 상태
- removed 제거 : 엔티티 인스턴스가 영속성 컨택스트에서 제거된 상태
-JPA는 트랜잭션 안에서 작동을 한다.
- 영속성 컨텍스트란?
- 영구 저장 환경
- 엔티티 매니저가 엔티티를 저장하거나 조회하면 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.
- 엔티티 매니저가 persist() 메서드를 사용하면 엔티티를 영속성 컨텍스트에 저장한다.
- 하나의 엔티티 매니저가 하나의 영속성 컨텍스트를 생성 및 접근할 수 O,
여러 엔티티 매니저가 하나의 영속성 컨텍스트를 공유할 수 O
- 엔티티를 식별자 값(@Id annotation)으로 구분하기 때문에 영속 상태는 식별자 값이 반드시필요
JPA 는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트의 엔티티를 데이터베이스에 반영
: 이를 flush 라고 함
- 변경 감지 동작으로 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교해 변경이 있는 엔티티를 찾는다.
- 변경이 있는 엔티티는 수정 쿼리를 만든어 쓰기 지연 SQL 저장소에 등록한다.
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다.
- 영속성 컨텍스트가 엔티티를 관리할 때 생기는 장점
- 1차 캐시
- 동일성 보장
- 트랜잭션을 지원하는 쓰기 지연
- 변경 감지
- 지연 로딩(Lazy Loading)
@Entity
테이블과 매핑할 클래스에 필수로 사용되는 어노테이션으로 해당 어노테이션이 붙은 클래스는 JPA가 관리