TIL/Spring

TIL 2024-12-12 ( 4주차 - 데이터베이스 다루기 )

myoma 2024. 12. 12. 23:40

1) 오늘 학습한 내용

  • Cascade
  • orphanRemoval
  • Fetch
  • JpaRepository
  • 페이징
  • JPQL

 


  • Cascade (영속성 전이)
    • 사용위치 : 연관관계의 주인 반대편 - 부모 엔티티 (N대1 에서 1), (OneToMany or OneToOne)
    • 양쪽 엔티티의 라이프 사이클이 동일하거나 비슷해야한다.
    • 옵션 종류 
      • ALL : 전체 상태 전이
      • PERSIST : 저장 상태 전이
      • REMOVE : 삭제 상태 전이
      • MERGE : 업데이트 상태 전이
      • REFERESH : 갱신 상태 전이
      • DETACH : 비영속성 상태 전이

 

  • orphanRemoval (고아 객체 제거)
    • 사용위치 : OneToMany or OneToOne에서 사용 - 부모 엔티티
    • Cascade.REMOVE와 비슷한 용도로 삭제를 전파하는데 쓰인다.
    • 부모 객체에서 리스트 요소 삭제를 했을 경우 해당 자식 객체는 매핑 정도가 없어지므로 대신 삭제해준다.
      • 요건 DB에서는 절대 알 수 없는 행동.
    • orphanRemoval = true 는 리스트 요소로써의 영속성 전이도 해준다는 뜻

 

  • Fetch (조회시점)
    • 사용위치 : Entity에 FetchType으로 설정할 수 있다.
    • Query 수행 시 fetch join을 통해서 LAZY인 경우 즉시 불러올 수 있다.
    • 기본 LAZY를 설정한 뒤에 필요할 때만 fetch join을 수행.
    • 항상 같이 쓰는 연관관계일 경우 EAGER을 설정.
    • 옵션
      • EAGER : 즉시 로딩 (부모 조회 시 자식도 같이 조회)
      • LAZY : 지연 로딩 (자식은 필요할 때 따로 조회)

 

  • JpaRepository
    • JpaRepository<Entity, Id> 인터페이스를 인터페이스에 extends 붙인다.
    • @NotRepositoryBean(빈생성 막음) 된 상위 인터페이스들의 기능을 포함한 구현체가 프로그래밍된다.
    • SpringDateJpa에 의해 엔티티의 CRUD, 페이징, 정렬 기능 메소드들을 가진 빈이 등록된다.

 

  • 페이징
    • PageRequest 를 사용하여 Pageable에 페이징 정보를 담아 객체화 한다.
    • Pageable을 JpaRepository가 상속된 인터페이스의 메서드에 T<Entity>와 함께 파라미터로 전달한다.
    • 2번의 메서드의 return 으로 Page<T>가 응답 된다.
    • 응답된 Page<T>에 담겨진 Page 정보를 바탕으로 로직을 처리하면 된다.
    • Pageable
      • 페이징을 제공하는 중요한 인터페이스이다.
      • 페이징의 findAll()의 기본적인 반환 메서드로 여러 반환 타입 중 하나이다.
    • Page<T> 타입
      • 게시판 형태의 페이징에서 사용된다.
      • 전체 요소 갯수도 함께 조회한다.
    • Slice<T> 타입
      • 더보기 형태의 페이징에서 사용된다.
      • 전체 요소 갯수 대신 offset 필드로 조회할 수 있다.
    • List<T> 타입
      • 전체 목록보기 형태의 페이징에서 사용된다.
      • 기본 타입으로 count 조회가 발생하지 않는다.

 

 

  • JPQL
    • Table이 아닌 객체 기준으로 작성하는 쿼리를 JPQL 이라고 한다.
    • SQL : Table 명으로 쿼리짤 때 쓰이는 언어
    • JPQL : Entity 명으로 쿼리 짤 때 쓰이는 언어
    • 쿼리 문자열과 Entity 를 직접 넣어서 쿼리를 작성한다.
    • @Query
      • 인자값으로 간단하게 쿼리를 작성할 수 있다.
        • 쿼리를 작성할 때 테이블명이 아니라 entity 명으로 조회하게 됩니다.