/** * 마치 DAO 랑 비슷한 패턴이다. */ @Slf4j @Repository @Transactional publicclassStudentCustomRepositoryImplimplementsStudentCustomRepository{
@Autowired EntityManager entityManager;
@Override public List<Student> findStudent(){ log.info("custom findStudent"); return entityManager.createQuery("SELECT s FROM Student AS s", Student.class) .getResultList(); }
// Rollback이 수행 되기 때문에 반영이 안된다. delete를 반영하기 위해 flush를 씀 studentRepository.delete(student); studentRepository.flush(); } }
커스텀 리파지토리 만드는 방법 2
이번엔 상황을 예를 들어 보겠습니다. 위 방법데로 커스텀하게 만들어서 잘쓰고 있었는데 A리파지토리 B리파지토리 … 공통적으로 사용되는 기능들이 있는겁니다.
위 방법은 하나의 Entity에 한해서 리파지를 커스텀하게 만든것이고 이번에는 모든 리파지토리에 공통기능을 커스텀 리파지토리를 만들고 싶은 것입니다.
코드를 보죠
1 2 3 4 5 6 7 8 9 10 11
/** * Repository 공통 기능 정의 * * @param <T> Entity * @param <ID> Key */ @NoRepositoryBean// 중간자 repository publicinterfaceMyRepository<T, IDextendsSerializable> extendsJpaRepository<T, ID> {
booleancontains(T entity); }
모든 리파지토리에 공통 기능을 적용시키고 싶을 리파지토리를 정의합니다.
TODO: @NoRepositoryBean에 대해서 설명하기
이제 위 정의한 구현체를 만듭니다.
보시면 SimpleJpaRepository를 상속 받았는데요 SimpleJpaRepository 는 JPA에서 클래스 상속구조에서 제일 밑단에 있는 구현 리파지토리 구현체입니다. 모든 공통기능을 가진 리파지토리를 만들고 있는 중이므로 기능이 많은 놈을 상속 받는게 낫겠죠??