• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

JpaRepository나 CrudRepository 같은 인터페이스에 @Repository 어노테이션이 안붙는 이유에 대해서 궁금합니다.

20.12.24 14:52 작성 조회수 722

0

안녕하세요 김영한님!

요즘은 인턴이니 취업 준비니 바빠서 강의를 미뤄두고 못 보는 것 같습니다.

다시 초심으로 돌아와서 열심히 들어야하는데 ㅠㅠ 그래도 예전에 인터넷 강의를 하시면서 추천해주셨던 오브젝트라는 명서를 알게 되서 지금은 JPA보다는 약간 객체지향쪽을 열심히 공부중인거같아요. TDD나 BDD나 객체지향 원리를 적용하고 디자인 패턴도 고민해보고 그러고 있는 것 같습니다.

서론이 길었는데 제가 이번에 질문을 하게된 계기는 스터디원 중에서 `@Repository` 어노테이션에 관련해서 질문이 들어왔습니다. 제가 알기로는 Spring Data가 지원하는 `JpaRepository` 나 `CrudRepository` 인터페이스같은 경우에는 `@NoRepositoryBean`으로 등록되어 있는 것으로 알고 있습니다.

제가 여기저기 찾아보면서 답변을 했는데 이게 맞는 답변일지 궁금해서 질문을 드리게됐습니다.

`@Repository`가 쓰이는 가장 큰 장점은 바로 `DataAccessExceptions` 핸들링 때문이라고 생각이 듭니다.

하지만, Spring Boot와 JPA를 사용하는 환경에서는 `@EnableAutoConfigure`을 통해서 DB 연동을 하기 때문에 `DataAccessExceptions` 같은 경우에는 액세스 오류가 예상되지 않은 케이스가 많고 익셉션이 발생해도 용도가 알 수 없는 부분이 있다고 생각합니다.

그래서 JPA의 경우에는 `PersistenceExcpetions`를 통해서 명확한 예외처리를 보여준다는 장점이 있다고 생각이 들었습니다. 그렇기에 `@Repository` 사용이 불필요하다고 생각이 들었으며, 인터페이스를 특정 Repository로 등록하는 것을 방지하기 위해서 `@NoRepositoryBean`을 통해서 관리된다고 생각합니다. 이렇게 함으로써 확장이 가능하도록 하기 위해서라고 생각이 듭니다.

그 대신 이러한 인터페이스를 구현해서 사용하는 인터페이스들을 컴포넌트 스캔단에서 빈으로 주입해주는 것으로 보입니다.

즉, `DataAccessExceptions`을 더 이상 사용하지 않는 문제와 인터페이스가 `@Repository`로 빈등록이 되면 확장의 어려움때문에 `@Repository`를 사용하지않는다 답변했는데 맞는 답이 될 수 있을까요?

아 추가적으로 해당 인터페이스를 상속했을 때 컴포넌트 스캔시 어떤 방식으로 해당 인터페이스에 빈을 주입해주는 지도 궁금합니다. basePackage 스캔하면서 implements 된 인터페이스들을 확인하고 주입해주는 거일까요?

답변 2

·

답변을 작성해보세요.

4

안녕하세요. 신수웅님

스프링 데이터 JPA는 스프링이 만들어서 제공하는 컴포넌트 이기 때문에 @Repository를 생략해도 JPA 관련 예외를 모두 스프링 예외로 변환해서 제공해줍니다. 따라서 @Repository를 통한 예외처리 기능이 이미 포함되어 있다고 이해하시면 됩니다.

추가적으로 질문 주신 부분은 컴포넌트 스캔으로 동작하는게 아니라, 스프링 데이터에서 해당 인터페이스를 구현한 클래스를 찾아서 사용합니다. 실제로는 인터페이스를 구현한 클래스를 바로 사용하는게 아니라, 스프링이 동적으로 임의의 구현 클래스를 만들고, 내가 구현한 클래스를 연결해줍니다.

도움이 되셨길 바래요^^

1

아 그것이 바로 다이나믹 프록시겠군요! 이해가 됐습니다 감사합니다 ^^