[TIL] Spring Data JPA

phdljr·2023년 11월 6일
0

TIL

목록 보기
25/70

Spring에서의 JPA

  • Spring Data JPA는 JpaRepository 인터페이스를 구현하는 클래스를 자동으로 생성해준다.
    • 그것이 SimpleJpaRepository이다. 이를 만들어서 Bean으로 등록시킨다.

QueryMethod

  • 메소드 이름으로 쿼리를 작성할 수 있는 기능이 존재
  • 반환값으로 Optional을 받게 되면, 다음과 같이 코드를 짤 수 있다.
private Memo findMemo(Long id) {
    return memoRepository.findById(id).orElseThrow(() ->
            new IllegalArgumentException("선택한 메모는 존재하지 않습니다.")
    );
}

@Transactional(readOnly=true)

  • 읽기 작업에서만 쓰이는 트랜잭션
  • true일 때, 수정하는 작업이 있으면 안된다.
  • 클래스에 걸어놔도 메소드에 다시 오버라이딩이 가능하다.
  • 테스트 클래스에선 @Transcactional이 붙어있으면 테스트가 끝나고 롤백됨
    • 롤백하기 싫으면 @Rollback(value=false)를 설정해주면 됨

      @Test
      @Transactional
      @Rollback(value = false)
      void test1(){...}

변경 감지를 위한 @Transactional

  • 서비스단에서 엔티티의 변경 감지를 적용 하기위해선 트랜잭션 전파를 해야한다.
@Transactional
public Long updateMemo(Long id, MemoRequestDto requestDto) {
    // 해당 메모가 DB에 존재하는지 확인
    Memo memo = findMemo(id);

    // memo 내용 수정
    memo.update(requestDto);

    return id;
}

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

  • 스프링에선 영속성 컨텍스트와 트랜잭션의 생명주기가 일치한다.
    • 트랜잭션이 유지되는동안 영속성 컨텍스트도 유지된다.
  • 부모 메소드에 트랜잭션이 걸려있으면, 자식 트랜잭션이 종료돼도 부모가 종료돼야 커밋된다.
  • 또한, 트랜잭션 전파에 대해 옵션을 설정해줄 수 있다.

@PersistenceContext

  • EntityManager을 주입받는 어노테이션
@PersistenceContext
EntityManager em;

JPA Auditing

  • 생성/수정 시간 데이터를 넣어주는 기능
    @Getter
    @MappedSuperclass // Entity 클래스의 상속 클래스를 의미
    @EntityListeners(AuditingEntityListener.class)
    public abstract class Timestamped {
    
        @CreatedDate
        @Column(updatable = false) // 업데이트 수정 불가
        @Temporal(TemporalType.TIMESTAMP)
        private LocalDateTime createdAt;
    
        @LastModifiedDate
        @Column
        @Temporal(TemporalType.TIMESTAMP)
        private LocalDateTime modifiedAt;
    }
    • @MappedSuperclass
      • JPA Entity 클래스들이 해당 추상 클래스를 상속할 경우 createdAt, modifiedAt 처럼 추상 클래스에 선언한 멤버변수를 컬럼으로 인식
    • @EntityListeners(AuditingEntityListener.class)
      • 해당 클래스에 Auditing 기능을 포함
    • @CreatedDate
      • Entity 객체가 생성되어 저장될 때 시간이 자동으로 저장
      • 최초 생성 시간이 저장되고 그 이후에는 수정되면 안되기 때문에 updatable = false 옵션을 추가
    • @LastModifiedDate
      • 조회한 Entity 객체의 값을 변경할 때 변경된 시간이 자동으로 저장
      • 처음 생성 시간이 저장된 이후 변경이 일어날 때마다 해당 변경시간으로 업데이트
    • @Temporal
      • 날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용
      • DB에는 Date(날짜), Time(시간), Timestamp(날짜와 시간)라는 세 가지 타입이 별도로 존재
        • DATE : ex) 2023-01-01
        • TIME : ex) 20:21:14
        • TIMESTAMP : ex) 2023-01-01 20:22:38.771000
  • @SpringBootApplication 이 있는 class에 @EnableJpaAuditing 추가
    - JPA Auditing 기능을 사용하겠다는 정보를 전달해주기 위해 @EnableJpaAuditing 을 추가해야 함
profile
난 Java도 좋고, 다른 것들도 좋아

0개의 댓글