Spring Data JPA
1. SpringBoot의 JPA
SpringBoot 환경에서의 JPA
- SpringBoot 환경에서는 EntityManagerFactory와 EntityManager를 자동으로 생성
@PersistenceContext
EntityManager em;
- @PersistenceConext 애너테이션을 사용하면, 자동으로 생성된 EntityManager를 주입받아 사용
Spring의 트랜잭션
- @Transactional 애너테이션을 클래스위 또는 메서드위에 추가하면 적용가능
- readOnly = true를 쓰면 읽기작업만 가능. 대신 읽는 작업은 최적화됨
@Transactional
- JPA를 사용하여 DB데이터를 관리하려면 트랜잭션 적용 반드시 필요
영속성 컨텍스트와 트랜잭션의 생명주기
트랜잭션 전파
- 부모메서드에 @Transactional이 존재하고, 자식메서드에도 @Transactional이 존재한다면 자식메서드의 @Transactional은 부모메서드의 @Transactional를 뒤잇는다.
2. Spring Data JPA란 무엇일까?
Spring Data JPA란?
Spring Data JPA 사용방법
- Spring 서버가 뜰 때 JpaRepository 인터페이스를 상속받은 인터페이스가 자동으로 스캔이 되면, 해당 인터페이스의 정보를 토대로 자동으로 SimpleJpaRepository 클래스를 생성해 주고, 이 클래스를 Spring ‘Bean’으로 등록
public interface MemoRepository extends JpaRepository<Memo, Long> {
}
- JpaRepository<"@Entity 클래스", "@Id 의 데이터 타입">를 상속받는 interface 로 선언
- 자동으로 Bean 등록
- 제네릭스의 @Entity 클래스 위치에 Memo Entity를 추가했기 때문에, 해당 MemoRepository는 DB의 memo 테이블과 연결되어 CRUD 작업을 처리하는 인터페이스가 됨.
3. JPA Auditing 적용하기
Timestamped
@Getter
@MappedSuperclass
@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 : Entity 클래스가 해당 추상클래스를 상속할경우, 추상클래스에 선언한 멤버변수를 컬럼으로 인식
- @EntityListeners(AuditingEntityListener.class) : 해당 클래스에 Auditing 기능 포함
- @CreatedDate : 생성될 때 시간 자동저장 (updatable = false로 수정안됨)
- @LastModifiedDate : 수정될때마다 시간 자동저장
- @Temporal : 날짜 타입을 매핑할 때 사용
4. Query Methods란 무엇일까?
Query Methods란?
- 메서드 이름으로 SQL을 생성할 수 있는 기능
- JpaRepository 인터페이스에서 해당 인터페이스와 매핑되어있는 테이블에 요청하고자하는 SQL을 메서드 이름을 사용하여 선언
스프링 개인과제 Growth
- API Mapping URL작성 시, 공통되는부분은 꼭 RequestMapping으로 치환
- 생성자 주입시 @RequiredArgsConstructor 고려하여 코드량 줄이기
- 트랜잭션 개념 더 공부하기(JPA)
- README 까먹지말고 잘 남기기^^..