보통 데이터베이스 테이블마다 그에 상응하는 엔티티 클래스가 존재한다.
Todo테이블 --> TodoEntity 상응
JpaRepository<T,ID>
- 첫 번쨰 매개변수인 T는 테이블에 매핑할 엔티티 클래스
- ID는 이 엔티티의 기본 키 타입이다. TodoEntity의 기본 키인 id의 타입인 String
-@Repository : Component 어노테이션의 특별 케이스이므로 스프링이 관리한다.- JpaRepository는 기본적으로 데이터베이스 오퍼레이션 인터페이스를 제공한다. (save, findById, findAll 등등)
여기서 잠깐!!!!
TodoRepository는 인터페이스인데 어떻게 TodoRepository를 구현하는 클래스가 없이도 동작하는 걸까? 추상 클래스나 인터페이스는 반드시 구현하는 클래스가 있어야 사용 가능한데...?
간단히 설명하면 스프링은 MethodInterceptor라는 AOP 인터페이스를 이용한다. MethodInterceptor는 우리가 JpaRepository의 메서드를 부를 때마다 이 메서드 콜을 가로채 간다. 가로챈 메서드의 메서드 이름을 확인하고, 메서드 이름을 기반으로 쿼리를 작성한다.
그렇다면 기본적인 쿼리가 아닌 쿼리는 어떻게 짤까?
이 메서드를 작성하면 스프링 데이터 JPA가 메서드 이름을 파싱해서 SELECT * FROM Todo WHERE userId='{userId}'와 같은 쿼리를 작성해 실행한다.
결론 :
퍼시스턴스 레이어는 데이터베이스와 통신하며 필요한 쿼리를 날리고, 해석해 엔티티 오브젝트로 변환해 주는 역할을 한다.