스터디일지/PROJECT

[Java Spring] 입문 2 주차 강의 - PART 2

똥쟁이핑크 2023. 8. 30. 20:46

Entity 상태

  • Transient - 비영속 상태로 영속성 컨텍스트에 저장되지 않았기에 JPA의 관리를 받지 않는다.
  • Managed - 영속 상태로 persist(entity)를 사용하면 EntityManager를 통해 영속성 컨텍스트에 저장하고 관리되는 상태로 만들어 준다.
  • Detached - 준영속 상태로 영속성 컨텍스트에서 저장되어 관리되다가 분리된 상태를 말한다.
    • detach(entity) - 특정 Entity만 준영속 상태로 만들어준다. - 준영속 상태가 되면 1차 캐시 즉, 캐시 저장소에서 제거 된다.
    • clear() - 영속성 컨텍스트를 초기화 시키는데 영속성 컨텍스트에 있는 모든 Entity를 준영속 상태로 바꿔준다. - 영속성 컨텍스트 틀은 유지하지만 내용이 비워져 새로 만든 상태 처럼 된다.
    • close() - 영속성 컨텍스트를 종료시킨다. 영속성 컨텍스트에 있는 Entity를 모두 준영속 상태로 바꿔주는데 영속성 컨텍스트가 종료되어서 사용할 수 없다.
    • merge(entity) - 전달 받은 Entity를 사용해서 새로운 영속 상태의 Entity를 반환한다. 상황에 따라 저장과 수정을 할 수 있다.
      • 전달 받은 Entity가 영속성 컨텍스트에 없으면 1) DB에서 조회 2) 조회 후 영속성 컨텍스트에 저장 3) 전달 받은 Entity값을 사용해서 병합 4) Update SQL 이 수행된다.
      • DB에도 없으면 1) 새롭게 생성한 Entity를 영속성 컨텍스트에 저장 2) Insert SQL 수행
  • Removed - 삭제
    • removed(entity) - 삭제하기 위해 조회한 영속 상태의 Entity를 파라미터로 전달 받아 삭제 상태로 만든다.

 

Spring Data JPA

영속성 컨텍스트와 트랜잭션의 생명주기

  • Spring 컨테이너 환경에서 영속성 컨텍스트와 트랜잭션의 생명주기가 일치한다. → 트랜잭션이 유지되는 동안 영속성 컨텍스트도 유지 된다.
  • 트랜잭션 전파 기능도 있다.
    • @Transactional로 선언하고 옵션을 설정할 수 있다.
    • 기본 옵션은 REQUIRED 인데 부모 메서드에 트랜잭션이 존재하면 자식메서드의 트랜잭션은 부모 트랜잭션에 합류하기 된다.

 

Spring Data JPA란?

  • JPA를 쉽게 사용하기 위한 모듈이다.  → JPA를 추상화시킨 Repository 인터페이스를 제공한다.
  • Repository인터페이스는 Hibernate와 같은 JPA 구현체를 사용해서 구현한 클래스를 통해 사용된다 → JPA를 간편하게 사용할 수 있다.
  • Spring Data JPA는 JpaRepository 인터페이스를 구현하는 클래스를 자동으로 생성해준다.
    • 과정 :  Spring 서버 시작 → SimpleJpaRepository 클래스 자동생성 → 클래스를 Bean으로 등록
  • 사용방법
    • JpaRepository<@Entity 클래스, @Id의 데이터 타입>  이렇게 넣어준다.
// 예시 코드
public interface MemoRepository extends JpaRepository<Memo, Long>{

}

 

 

JPA Auditing 적용

  • 시간 값을 자동으로 넣어주는 기능이다.
    • @MappedSuperclass을 선언하면 JPA Entity 클래스들이 해당 클래스를 선언하면 createdAt, modifiedAt처럼 추상 클래스에 선언한 멤버 변수를 컬럼으로 인식 한다.
    • @EntityListeners(AuditingEntityListener.class) 선언하면 Auditing 기능을 포함 시킨다.
// 강의 들으면서 썼던 코드
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class) // 이걸 선언해야 자동으로 시간을 넣어주는 기능이 수행된다.
public abstract class Timestamped { // 추상 클래스가 아니여도 괜찮긴하나, 여기 클래스 자체를 Entity할 일이 없으므로 써도 된다.

    @CreatedDate // 최초생성 시간이 저장된다.
    @Column(updatable = false) // 업데이트를 막는다 시간 수정을 막는다.
    @Temporal(TemporalType.TIMESTAMP)
    private LocalDateTime createdAt;

    @LastModifiedDate // 변경된 시간으로 수정되어 저장된다.
    @Column
    @Temporal(TemporalType.TIMESTAMP) // 날짜나 시간데이터를 매핑 할 때 사용됨
    private LocalDateTime modifiedAt;
}

 

Query Method란?

  • Spring Data JPA에서는 메서드 이름으로 SQL을 생성할 수 있는 메서드를 제공한다. 이것이 Query Method다.
  • 이미 정의되어 있는 규칙에 맞게 메서드를 선언하면 SimpleJpaRepository에서 구현된다.
// 사용 예시
List<Memo> findAllByOrderByModifiedAtDesc();
  • 위의 코드는 Memo 테이블에서 ModifiedAt(수정시간)를 기준으로 전체 데이터를 내림차순으로 가져오라는 SQL를 실행하는 메서드를 생성한 것이다.
  • 위의 코드 처럼 메서드를 선언하게 되면 파라미터를 넣어주어야 하는데 타입과 변수명을 넣어주면 된다.

 

2주차 강의까지 듣고 나서 코드를 보니 1주차 보다 확실히 코드가 간결해 졌고 알아보기 쉬웠다.

이제 실전이나 과제에 적용하려면 역시 많이 써보고 오류내보고 그렇게 공부해서 

손에 많이 익혀둬야 겠다고 생각했다.