24.08.20

윤지현·2024년 8월 20일

TIL

목록 보기
45/75

오늘의 루틴

  • Spring 강의 최소 4개는 듣기 (O)
  • 공부한 내용 다시 보기 (O)

Entity의 상태


🔻 비영속(Transient)

Memo memo = new Memo(); // 비영속 상태
memo.setId(1L);
memo.setUsername("Robbie");
memo.setContents("비영속과 영속 상태");
  • new 연산자를 통해 인스턴스화 된 Entity 객체
  • 영속성 컨테스트 저장 X => JPA 관리 X

🔻 영속(Managed)

em.persist(memo);
  • persist(entity) : 비영속 Entity를 EntityManager를 통해 영속성 컨텍스트에 저장하여 관리되고 있는 상태로 만듬

🔻 준영속(Detached)

  • 영속 상태에서 준영속 상태로 바꾸는 방법
    • detach : 특정 entity를 영속성에서 준영속성으로 변경(영속성 컨테이너에 저장되어 있는 entity를 분리)
    • clear : 영속성 컨테이너에 저장되어 있는 entity를 전부 비우기, 영속성 컨테이너는 비우는 것이므로 다시 사용가능
    • close : 완전히 종료하므로 영속성 컨테이너는 비우는 것이므로 다시 사용 불가능
  • 준영속 상태에서 다시 영속 상태로 바꾸는 방법
    • merge(entity) : 전달받은 Entity를 사용하여 새로운 영속 상태의 Entity를 반환

🔻 삭제(Removed)

em.remove(memo);
  • remove(entity) : 삭제하기 위해 조회해온 영속 상태의 Entity를 파라미터로 전달받아 삭제 상태로 전환

SpringBoot의 JPA


🔻 SpringBoot 환경에서의 JPA

  • SpringBoot 환경에서는 EntityManagerFactory와 EntityManager를 자동으로 생성
  • @PersistenceConext 애너테이션을 사용하면 자동으로 생성된 EntityManager를 주입받아 사용
@PersistenceContext
EntityManager em;

🔻 @Transactional

  • 클래스에 선언한 @Transactional은 해당 클래스 내부의 모든 메서드에 트랜잭션 기능을 부여
@Test
@Transactional 
@Rollback(value = false) // 테스트 코드에서 @Transactional 를 사용하면 테스트가 완료된 후 롤백하기 때문에 false 옵션 추가
@DisplayName("메모 생성 성공")
void test1() {
    Memo memo = new Memo();
    memo.setUsername("Robbert");
    memo.setContents("@Transactional 테스트 중!");

    em.persist(memo);  // 영속성 컨텍스트에 메모 Entity 객체를 저장합니다.
}

Spring Data JPA란 무엇일까?


🔻 Spring Data JPA란?

  • JPA를 쉽게 사용할 수 있게 만들어놓은 하나의 모듈
    • JPA를 추상화시킨 Repository 인터페이스를 제공
    • JpaRepository 인터페이스를 구현하는 클래스를 자동으로 생성

🔻 Spring Data JPA 사용방법

  • JpaRepository<"@Entity 클래스", "@Id 의 데이터 타입">를 상속받는 interface 로 선언
    • Spring Data JPA에 의해 자동으로 Bean 등록

JPA Auditing 적용하기


🔻 Timestamped

  • 시간에 대해서 자동으로 값을 넣어주는 기능
    • JPA를 추상화시킨 Repository 인터페이스를 제공
    • JpaRepository 인터페이스를 구현하는 클래스를 자동으로 생성

🔻 Spring Data JPA 사용방법

  • JpaRepository<"@Entity 클래스", "@Id 의 데이터 타입">를 상속받는 interface 로 선언
@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;
}

📌 @SpringBootApplication 이 있는 class에 @EnableJpaAuditing 추가!


Query Methods란 무엇일까?


🔻 Query Methods란?

  • pring Data JPA에서는 메서드 이름으로 SQL을 생성할 수 있는 Query Methods 기능을 제공
    - JpaRepository 인터페이스에서 해당 인터페이스와 매핑되어있는 테이블에 요청하고자하는 SQL을 메서드 이름을 사용하여 선언

profile
첫 시작

0개의 댓글