(Spring) JpaRepository는 인터페이스인데 어떻게 동작할까?

2023. 8. 31. 02:15Spring

반응형

Java의 인터페이스

Java의 인터페이스는 추상 메서드를 정의할 수 있습니다.

 

public interface Person {
	
    void walk();
    
    void run();
 
 }

 

이제는 너무나 잘 아시겠지만, Java 8버전 이후로는 기본 메서드를 작성할 수 있습니다.

 

public interface Person {
	
    void walk();
    
    void run();
 	
    default void sayHello() {
    	System.out.println("Hello");
    }
 }

 

 

또한 인터페이스의 추상메서드를 사용하기 위해서는 반드시 구현이 필요합니다.

왜냐하면 껍데기만 제공해주는 '인터페이스'이기 때문이죠.

 

public class User implements Person {
	
    void walk() {
    	System.out.println("User can walk");
    }
    
    void run() {
    	System.out.println("User can not run");
    }
    
 }

 

그리고 JpaRepository를 봅시다.

 

 

JpaRepository

JpaRepo를 상속하는 class를 하나 만들었습니다.

public interface UserRepository extends JpaRepository<User, UUID> {

}

 

인터페이스에 어떠한 메서드도 정의되어 있지 않습니다.

 

 

 

그렇지만 이렇게 메서드가 존재하고 사용가능합니다.

 

저 save() 메서드는 JpaRepository에 정의되어 있지 않습니다.

 

 

 

 

이렇게 상속의 트리를 타고 올라가면 CrudRepository가 존재하고, 여기에 save 추상 메서드가 정의되어 있습니다.

 

모두 인터페이스이기 때문에 '상속'이 가능헀죠.

 

 

 

그럼 인터페이스로 돌아와서, 인터페이스의 메서드는 추상 메서드이기 때문에 구현이 필요하다고 앞서 말했습니다.

그런데 JpaRepo를 상속한 인터페이스에는 그 어디에도 메서드가 정의되어 있지 않습니다.

심지어 JpaRepo, 상위 인터페이스인 PagingAndSoringRepo, CrudRepo 모두 인터페이스입니다.

 

그런데 어떻게 동작하는 걸까요?

왜 구현하라는 에러가 발생하지 않는걸까요?

 

 

 

SimpleJpaRepository

왼쪽 Fx 버튼을 눌러 우리는 구현체를 찾을 수 있습니다.

 

 

 

바로 SimpleJpaRepo를요.

 

 

여기에 JpaRepo의 상위 인터페이스에 대한 추상메서드의 구현체가 담겨 있습니다.

 

save()는 어떻게 동작할까요?

 

EntityManager를 통해서 Persist한다.

 

Hibernate 날것의 코드와 차이가 없습니다.

 

 

 

여기서 혼동하지 말아야하는 것은 JPA와 SpringDataJpa, Hibernate의 관계입니다.

 

 

JPA는 인터페이스이고, SpringDataJPA는 이 인터페이스를 쉽게 사용하기 위해 존재하는 모듈이며,

이 두 인터페이스의 구현을 Hibernate가 하는 것입니다.

 

 

결론

  • 인터페이스는 구현이 필요하다.
  • SpringDataJpa의 구현은 Hibernate로 작성되어 있다.
  • 상속관계를 잘 확인하자
  • JPA, SpringDataJpa, Hibernate 관계를 잘 알자.

 

 

반응형