본문 바로가기
TIL

TIL내일배움캠프 12주차 JPA심화 JPA Repository

by 율량동박씨 2024. 7. 5.

오늘의 키워드

  • JPA Repository
  • ORM (Object-Relational Mapping)
  • 영속성 (Persistence)

오늘의 내용

  • JPA Repository 쿼리 코드 작성
  • JPA Repository를 사용하면 데이터베이스와 상호작용하는 코드를 간단하게 작성할 수 있다. Spring Data JPA에서는 다양한 방법으로 쿼리를 정의할 수 있다
  • 파생된 쿼리 메서드 (Derived Query Methods)
    • 메서드 이름을 기반으로 쿼리를 생성한다
public interface TutorialRepository extends JpaRepository<Tutorial, Long> {
List<Tutorial> findByPublished(boolean isPublished);
List<Tutorial> findByTitleContaining(String title);
}

 

  • @Query 어노테이션을 사용한 쿼리
      • JPQL 또는 Native SQL 쿼리를 직접 정의할 수 있다
public interface TutorialRepository extends JpaRepository<Tutorial, Long> {
@Query("SELECT t FROM Tutorial t WHERE t.published = :published")
List<Tutorial> findByPublished(@Param("published") boolean published);
}

 

  • Modifying 어노테이션
    • 데이터 수정 쿼리에 사용된다
@Modifying @Query("UPDATE Tutorial t SET t.title = :title WHERE t.id = :id")
int updateTitle(@Param("id") Long id, @Param("title") String title);
  • ORM의 등장과 그 배경
    • ORM(Object-Relational Mapping)은 DB 의존성과 중복 쿼리 문제를 해결하기 위해 등장했다. ORM은 데이터베이스 테이블을 객체로 매핑하여 객체 지향적으로 데이터베이스를 조작할 수 있게 한다
    • 상속 문제: 객체 간의 상속 관계를 데이터베이스 테이블에 매핑한다
      • JPA 어노테이션: @Inheritance, @DiscriminatorColumn
    • 관계 문제: 객체 간의 참조 관계를 데이터베이스의 외래키로 매핑한다
      • JPA 어노테이션: @OneToMany, @ManyToOne, @JoinColumn
    • 탐색 문제: 객체 간의 탐색을 효율적으로 처리한다
      • JPA 어노테이션: @FetchType, fetchJoin()
    • 밀도 문제: 큰 객체를 분리하여 테이블로 매핑한다
      • JPA 어노테이션: @Embedded
    • 식별성 문제: 객체를 고유하게 식별한다
      • JPA 어노테이션: @Id, @GeneratedValue
  • 영속성 컨텍스트와 쓰기 지연
    • 영속성 컨텍스트는 엔티티를 관리하는 캐시 역할을 한다. 엔티티 매니저를 통해 엔티티의 상태를 전환하며, 1차 캐시를 통해 쓰기 지연을 최적화한다
  • 엔티티 상태 전환:
    • 비영속(new/transient): 영속성 컨텍스트와 무관한 상태
    • 영속(managed): 영속성 컨텍스트에 저장된 상태
    • 준영속(detached): 영속성 컨텍스트에서 분리된 상태
    • 삭제(removed): 영속성 컨텍스트와 DB에서 삭제될 상태
  • 쓰기 지연 효과:
    • 여러 쿼리를 모아서 한번에 전송
    • 트랜잭션 종료 시점에 최적화된 쿼리 전송

오늘의 회고

 QueryDSL테스트를 하다가 계속 모킹이 안 됐다는 오류가 떠서 테스트코드 작성을 완성하지 못했다. 반복되는 오류로 거의 밤을 새웠는데 해결도 못하고~ 지각도 하고~ 최악의 하루였다.....