JpaRepository<Entity, PK>

coding S's avatar
Mar 20, 2024
JpaRepository<Entity, PK>

JPA란? (정의)

JPA가 제공하는 인터페이스 중 하나로 CRUD 작업을 처리하는 메서드들을 이미 내장하고 있어서 내가 CRUD를 더 편하게 만들어 줌!
 

JpaRepository 인터페이스

Spring Data JPA가 제공하는 인터페이스로, 기본적인 CRUD(Create, Read, Update, Delete) 연산과 페이징 처리, 정렬(Sort) 등을 위한 메서드를 포함한다. 이를 상속받음으로써, 복잡한 JPA 관련 코드를 직접 작성하지 않고도 필요한 데이터 접근 기능을 구현할 수 있게 됨!!
JPA를 사용할 때는, JpaRepository를 상속받는 인터페이스를 만들기만 하면 스프링이 알아서 해당 인터페이스에 대한 구현체를 생성하고 IoC 컨테이너에 띄워줌. 이 과정에서 개발자가 직접 구현체를 만들거나, import 구문을 추가할 필요는 없다
 

JpaRepository<엔티티, PK>

notion image
제네릭의 첫 번째 파라미터 User는 엔티티 클래스를 의미하고, 두 번째 파라미터 Integer는 해당 엔티티의 기본 키 타입을 의미!
💡
제네릭 타입을 통해 엔티티 클래스와 그 엔티티의 기본 키(PK)의 타입을 명시해줘야 함!
 

JpaRepository의 save메소드

notion image
S가 강아지고 T가 동물이라면, S는 T인가? Yes, T는 S인가? No! User 클래스의 인스턴스를 save 메소드에 전달한다면, save 메소드는 User 타입의 객체를 저장(또는 업데이트)한 후, 저장된 User 객체를 리턴. -> 이 save라는 메소드는 User를 리턴한다고 봐도 된다. -> User 클래스를 save 메소드에 넣으면, 내부적으로 적절한 처리(예: em.persist)를 거쳐 User 객체가 데이터베이스에 저장되고, 저장된 User 객체가 리턴 됨 -> save 메소드에 무엇을 주든간에, 그것을 저장하고, 저장된 것을 다시 돌려준다고 생각! 어려우면 그냥 User클래스를 집어넣으면 알아서 해줌. (em.persist 하면 됨) 이라고 이해 하자!
notion image
💡
이런 식으로!
 

왜 id도 받을까? → 한 건 찾기 위함

notion image
notion image
💡
우리가 <Entity, PK> 이렇게만 넣으면 이런 식으로 자기가 자동화해서 만들어준다!
 

JpaRepository는 자동 컴퍼넌트 스캔이 된다

notion image
스프링 입장에서 애를 new하려고 했더니, JpaRepository는 인터페이스이기 때문에 직접 new를 사용하여 인스턴스를 생성할 수 없다. 때문에 스프링은 프록시 패턴을 사용하여 해당 인터페이스의 구현체를 자기가 만들어서 구현! JpaRepository에 정의된 메소드들(내부)를 스프링이 다 구현하여 Ioc에 띄워준다. (부모 이름으로 DI하기 때문에 구현체의 이름은 중요하지 않음)
 

 
notion image
💡
저 검은.. @Repository를 만들어줌
 
Share article

codingb