⏰ 2024. 05. 22 수
✔ 스프링 이론 강의를 듣고 정리하면서 작성했습니다.
💡 목차
- Entity의 상태
- Spring Data JPA
Entity의 상태
Entity의 상태
- Entity의 상태는
비영속(Transient)
, 영속(Managed)
, 준영속(Detached)
3가지가 있다.
비영속(Transient) 상태
- new 연산자를 통해 인스턴스화 된 Entity 객체를 의미하고, 아직 영속성 컨텍스트에 저장되지 않았기 때문에 JPA에 의해 관리되지 않는 상태
영속(Managed) 상태
- 비영속 상태의 Entity를 EntityManager를 통해 영속성 컨텍스트에 저장해서 JPA에 관리되고 있는 상태
em.persist(entity)
키워드를 통해 Entity를 비영속 상태에서 영속 상태로 전환
준영속(Detached) 상태
-
영속성 컨텍스트에 저장되어 관리되고 있던 영속 상태에서 분리된 상태
-
1차 캐시에서 제거되기 때문에 JPA의 관리를 받지 못한다.
-
영속 상태 -> 준영속 상태
- em.detach(entity) : 특정 Entity만 준영속 상태로 전환
- em.clear() : 영속성 컨텍스트가 완전 초기화, 모든 Entity를 준영속 상태로 전환
새롭게 Entity 영속 상태로 만들어 계속 영속성 컨텍스트를 이용 가능
- em.close() : 영속성 상태의 모든 Entity를 준영속 상태로 만들 뿐만 아니라 영속성 컨텍스트 종료
-
준영속 상태 -> 영속 상태 ⭐em.merge(entity)
-
전달받은 Entity를 사용하여 새로운 영속 상태의 Entity를 반환
-
merge(entity) 동작
- 전달된 Entity를 영속성 컨텍스트에 조회
- (1) Entity가 영속성 컨텍스트에 없다면, DB에서 조회하고 DB에 있다면, 조회한 Entity를 영속성 컨테스트에 저장하고, 조회한 Entity와 전달받은 Entity의 값이 다르면 값을 병합하고 DB에 Update SQL을 수행한다.
(2) Entity가 영속성 컨텍스트에 없다면, DB에서 조회하고 DB에도 없다면, 새롭게 Entity를 생성하고 영속성 컨텍스트에 저장한 후, DB에 Insert SQL을 수행한다.
-
⚡ 따라서 merge(entity) 메서드는 비영속, 준영속 모든 Entity에 사용가능하며 상황에 따라 저장
하거나 수정
한다.
삭제(DELETED) 상태
- 영속성 컨텍스트에서 삭제하기 위해 조회해온 영속 상태의 Entity를 삭제 상태로 전환, commit되면 완전히 삭제된다.
em.remove(entity)
메서드를 사용해 삭제 상태로 전환
⚡ em.contains(entity)
: 해당 객체가 영속 상태인지 확인하는 메서드, 반환값 boolean 타입
Spring Data JPA
Spring Data JPA
- JPA를 쉽게 사용할수 있게 만들어놓은 하나의 모듈로 JAP를 추상화시킨 Repository 인터페이스를 제공
- Repository 인터페이스는 Hibernate와 같은 JPA 구현체를 사용해서 구현한 클래스를 통해 사용된다.
- JpaRepository 인터페이스를 상속받은 인터페이스가 자동으로 스캔되어
SimpleJpaRepository
클래스를 생성해주고, Bean으로 등록한다.
Spring Data JPA 사용방법 - JpaRepository 등록
JpaRepository<@Entity 클래스, @Id의 데이터타입>
상속받는 인터페이스 선언
JpaRepository 인터페이스 메서드
- save(entity) : Entity를 영속성 컨텍스트에 저장
- findAll() : 해당 테이블의 전체 데이터 조회
- findById(id) : 해당 id의 Entity를 조회, 반환타입이 Optional이라서 orElse나 orElseThrow를 통해 null 예외를 처리해줘야한다.
- update 메서드는 존재하지 않기 때문에, Entity에 Update 메서드를 정의해 객체의 데이터를 수정하고 영속성 컨텍스트(트랜잭션, @Transactional)의
변경감지
를 통해 update 수행
- delete(entity) : 해당 Entity를 테이블에서 삭제
JPA Auditing
- 데이터의 생성 및 수정시간은 다양한 동작에 자주 활용된다. 각각의 Entity의 생성 수정 시간을 매번 작성하는건 매우 비효율적이다.
- 그렇기 때문에 Spring Data JPA에서는 시간에 대해서 자동으로 값을 넣어주는 기능인 JPA Auditing을 제공한다.
Query Methods
- Spring Data JPA에서는 메서드 이름으로 SQL을 생성하는 Query Methods 기능을 제공한다.
- SimpleJpaRepository 클래스가 생성될 때, JpaRepository 인터페이스의 모든 메서드를 자동으로 구현한다.