JpaRepository를 상속한 인터페이스가 구현체가 없이 동작하는 이유

public interface MemberRepository extends JpaRepository<Member, Long> {
}

Spring Data JPA를 사용하면 위 처럼 JpaRepository 인터페이스를 상속받은 인터페이스만 있어도 CRUD 기능을 다 지원한다.

그렇다면 어떻게 인터페이스의 구현체가 없는데도 MemberRepository가 작동하는 걸까?

 

How ?

JpaRepository 인터페이스를 상속 받은 MemberRepository 클래스 타입을 찍어보면 다음과 같이 나온다.

memberRepository.getClass() => class com.sun.proxy.$ProxyXXX

 

Spring Data JPA가 JpaRepository 인터페이스를 상속받은 인터페이스를 보고 구현체를 만들어서 의존성 주입을 해준다.

즉, 우리는 인터페이스만 만들면 Spring Data JPA 애플리케이션 로딩 시점에 구현 클래스를 다 만들어주는 것이다.

 

 @Repository 생략 가능

Spring Data JPA가 자동으로 JpaRepository 인터페이스를 상속받은 인터페이스를 인식컴포넌트 스캔 대상에 추가해준다.