MySQL, Redis, MongoDB, PostgreSql, hadoop 등등 다양한 db가 존재한다…! 생각해보면 CRUD하는 동작은 비슷한데 DB별로 각각 구현할 필요가 있을까??!?!? → 아니다.

스프링은 Spring Data라는 가장 큰 인터페이스를 제공해서 DB에 맞는 구현체를 우리가 가져다 쓰면 된다!(Spring Data JPA, Spring Data Redis, Spring Data Mongo 등등)

공식문서에 가보면 기본적인 CRUD가 필요한 것들을 Spring Data라는 인터페이스로 설명중이다!

image.png

JpaRepository<엔티티타입, 엔티티ID타입> 인터페이스를 인터페이스 상속 받고, 제네릭에 관리할 <엔티티, 엔티티ID> 를 주면 된다. 그러면 JpaRepository 가 제공하는 기본 CRUD 기능을 모두 사용할 수 있다.

public interface ItemRepository extends JpaRepository<Item, Long> {
}

만약 MongoDB를 쓴다면

@Repository
public interface MemberRepository extends MongoRepository<Member, String> {
}

JpaRepository 인터페이스만 상속받으면 스프링 데이터 JPA가 프록시 기술을 사용해서 구현 클래스를 만들 어준다. 그리고 만든 구현 클래스의 인스턴스를 만들어서 스프링 빈으로 등록한다. 따라서 개발자는 구현 클래스 없이 인터페이스만 만들면 기본 CRUD 기능을 사용할 수 있다.

image.png

스프링 데이터 JPA는 메서드 이름을 분석해서 필요한 JPQL을 만들고 실행해준다. 물론 JPQL은 JPA가 SQL로 번역해서 실행한다.