티스토리 뷰

반응형

JpaRepository

JpaRepository 인터페이스를 상속 받는 것만으로도 웬만한 CRUD는 바로 사용 가능 했다. 아래와 같이 설정 한것 만으로도 save(), findAll(), delete(), exists() 등등의 메소드가 바로 사용가능했다. (굳이 오버라이딩 하듯이 메소드들을 명시할 필요도 없었다.) JpaRepository 인터페이스는 스프링 데이터의 CrudRepository를 상속받았기 때문에  CrudRepositry에 정의되어 있는 기능도 사용가능 했다.

public interface QuestionRepository extends JpaRepository<Question, Long> { 
}

쿼리 메소드

JPA의 Repositoy안에 find와 By 키워드를 적절히 섞은 쿼리 메소드만 선언하면 대부분의 조회문을 만들 수 있었다. 이외에도 다른 키워드들이 많이 있는데 현재는 익숙하지 않아 사용하지 않았다. (JPA의 기능들은 알면 알수록 대단하다고 느껴진다. ㄷㄷ)

public interface QuestionRepository extends JpaRepository<Question, Long> {
    //책 목차 id로 문제 조회하기
    Page<Question> findQuestionByBookContentId(Long bookContentId, Pageable pageable);

    //문제 id로 문제 조회하기
    Question findQuestionById(Long id);
}

@Query, JPQL

쿼리 메소드로 구현하기 힘든 경우는 @Query 애노테이션을 이용해서 JPQL을 직접 사용할 수 있었다. SQL문과의 유사점과 차이점을 정확하게 알지 못해서 조회문을 만드는데 시행착오가 있었다. nativeQuery 옵션을 사용하면 SQL을 직접 사용 할 수 있지만 가능한 사용 하지 않기로 했다.

public interface QuestionRepository extends JpaRepository<Question, Long> {
    . . .

    //책 id로 문제 조회하기
    @Query(value = "SELECT q FROM Question q INNER JOIN q.bookContent bc WHERE book_id =:bookId")
    Page findQuestionByBookId(@Param("bookId") Long bookId, Pageable pageable);
}


☞ 해당 Repository Github

반응형
댓글