해결된 질문
작성
·
238
1
기본적인 java 개념 부족일수도 있습니다만
강의 내용중에
사용자 정의레포지를 만들땐 Impl을 뒤에 꼭 붙여야 한다고 나와있고, 최신화된 강의내용을 봐도 그렇게 알고있는데요,
그런데 이게 왜 Spring Data JPA에서 제공해야하는 기능인지 이해가 잘 안갑니다. Spring Data JPA가 지원을 안해주면 왜 오류를 뱉어야 하는지가 궁금합니다.
예를들어
public interface RepositoryAInterface 와
이를 구현한
public class RepositoryA implements RepsitoryAInterface가 있다고 했을때,
그리고 RepositoryA를 JPA을 이용하여 구현할때,
EntityManager를 DI해서 직접 구현 하잖아요?
그럼 끝난거 아닌가요?
Spring Data JPA를 사용하는
public interface RepositoryBInterface extends JPARepository<>
가있다고 하면요.
여기서 extends RepositoryA를 하나 추가했다고 해서 왜 에러가 나는 것인가요?
그냥 이게 Spring Data JPA가 아니라 일반적인 java라고 생각해봤을때
RepositoryBInterface가 있고, 이 인터페이스는
RepositoryAinterface를 extends하였고,
RepositoryAinterface는 Repository가 구현하고있으니
RepositoryBInterface만 구현하면 되는거 아닌가요?
그리고 이것은 SpringDataJpa가 해주고요
Spring Data Jpa가 RepositoryAinterface에 대해 근본적으로 왜 알아야하는 궁금합니다.
근데 알아야 하니까 Impl을 붙어야 작동하겠죠?
만약에 Impl이 없으면 어떠한 동작과정중에 에러가 생겨 동작을 제대로 하지 않는 것일까요..?
답변 1
2
안녕하세요. 조성락님
설명을 위해 예시를 하나 들겠습니다.
public interface BookRepository extends JpaRepository<Book, Long>, BookRepositoryCustom {
List<Book> findByAuthor(String author);
List<Book> findCustomMethod();
}
위 인터페이스에서 findByAuthor
는 Spring Data JPA의 명명 규칙에 따라 자동으로 쿼리를 생성합니다. 반면, findCustomMethod
는 우리가 직접 구현해야 하는 메서드입니다.
이런 사용자 정의 메서드를 구현하려면 구현체를 만들어야 합니다. 그리고 Spring Data JPA는 'Impl' 접미사를 사용하여 해당 구현체를 찾습니다.
public class BookRepositoryCustomImpl implements BookRepositoryCustom {
@PersistenceContext
private EntityManager em;
@Override
public List<Book> findCustomMethod() {
// 여기에 사용자 정의 쿼리 및 로직을 구현
}
}
여기서 주목해야 할 것은, BookRepositoryCustomImpl
클래스가 BookRepositoryCustom
인터페이스를 구현하고 있다는 것입니다. 이렇게 함으로써, Spring Data JPA는 'Impl' 접미사를 사용하여 사용자 정의 구현체를 찾아냅니다.
'Impl' 접미사 없이 다른 이름을 사용하면 Spring Data JPA는 사용자 정의 구현체를 찾을 수 없습니다. 따라서, 해당 메서드에 대한 구현을 찾지 못해 오류를 발생시킵니다.
요약하면, Spring Data JPA는 'Impl' 접미사 규칙을 사용하여 사용자 정의 구현체를 찾습니다. 이 규칙을 따르지 않으면 Spring Data JPA는 사용자 정의 메서드의 구현체를 찾지 못해 오류를 발생시킵니다.
그러면 왜 Impl 같은 접미사가 필요할까요?
다음과 같은 이유가 있습니다.
BookRepositoryCustomImpl 클래스를 사용하려면 객체를 생성하고 의존관계를 주입해야 합니다. 스프링 데이터 JPA가 이 부분을 자동으로 처리해줍니다.
여기서는 bookRepository를 통해서 findByAuthor()와 사용자가 정의한 findCustomMethod()를 모두 사용할 수 있습니다. bookRepository.findByAuthor()를 호출하게 되면 스프링 데이터 JPA가 자동으로 만들어준 구현체의 기능을 호출해야 합니다. 반면에 .
bookRepository.findCustomMethod()을 호출하게 되면 사용자 정의 메서드의 구현체를 호출해야 합니다. 순수 자바에서는 이렇게 하나의 인터페이스에서 구현체가 서로 달라지는 경우를 분리할 수 없습니다. 이런 부분을 스프링 데이터 JPA가 처리해줍니다.
감사합니다.
findCustomMethod을 BookRepository 인터페이스에 선언하지 않았어도
BookRepositoryCustom 인터페이스를 확장하고있으니,
BookRepository 를 구현을 해야한다는 사실을 간과하고있었네요.
그럼 결국 코드를 뜯어보면
Spring Data JPA가 생성한 findCustomMethod코드는
BookRepositoryCustomImpl에 생성된 findCustomMethod코드를 호출하는 내용이겠군요!
기본적인 자바 내용이였는데 상세하게 답변해주셔서 감사합니다!!