스프링 데이터 JPA

스프링 데이터 JPA 제공 기능

  • 인터페이스를 통한 기본적인 CRUD

  • findByName(), findByEmail() 처럼 메서드 이름만으로 조회

  • 페이징 기능

스프링과 JPA만으로 개발생산성이 향상되었다. 여기에 스프링 데이터 JPA를 더하면 마법 같은 일이 일어난다. 이게 된다고? 하는 일도 이루어진다.

리포지토리에 구현 클래스 없이 인터페이스만으로 개발을 할 수 있다. 그리고 개발해온 기본 CRUD 기능도 스프링 데이터 JPA가 모두 제공한다.

스프링 부트와 JPA 기반 위에 스프링 데이터 JPA라는 환상적인 프레임워크를 더하면 개발이 정말 즐거워진다! 지금까지 조금이라도 단순하고 반복이라고 생각했던 개발 코드들이 확연하게 줄어들고, 개발자들은 핵심 비즈니스 로직을 개발하는데 집중할 수 있다.

실무에서 관계형 데이터베이스를 사용한다면 스프링 데이터 JPA는 선택이 아니라 필수이다. 스프링 데이터 JPA는 JPA를 편리하게 사용하도록 도와주는 기술이다. 따라서 JPA를 먼저 학습한 후에 스프링 데이터 JPA 학습해야한다.

메서드 이름, 반환 타입, 매개변수들을 reflection 기술로 읽어들여서 풀어낸다.

SprinigConfig.java 스프링 데이터 JPA가 SpringDataMemberRepository(인터페이스)를 스프링 빈으로 자동 등록해준다! JpaRepository를 까보면 기본적인 CRUD와 단순조회 기능 같은 공통적인 기능들이 지원되는 것을 알 수 있다.

package hello.hellospring.service;

import hello.hellospring.repository.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//memberService, memberRepository 생성해서 스프링빈에 등록하고, 후자를 전자에 연결시켜준다~!
@Configuration
public class SpringConfig {
    //이렇게 하면 스프링 데이터 JPA가 등록한 구현체가 등록된다!그리고 MemberService에 의존관계 연결하기 위해 MemberService에 매개변수로 넣어준다!
    private final MemberRepository memberRepository;
    @Autowired
    public SpringConfig(MemberRepository memberRepository) {//스프링 컨테이너에서 memberRepository 찾는다. 그런데 등록된 게 없다.
        //근데 등록된 게 하나 있다!
        //SpringDataMemberRepository에서 인터페이스 만들고, 스프링데이터가 제공하는 JpaRepository을 extends하면
        //스프링데이터가 인터페이스 구현체를 어떤 기술을 가지고 만들어낸다.그리고 스프링 빈에 등록한다.
        //그래서 이것을 injection으로 받을 수 있다.
        this.memberRepository = memberRepository;
    }

    @Bean
    public MemberService memberService(){
        return new MemberService(memberRepository);
    }
}

SpringDataMemberRepository.java(인터페이스)

package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

//인터페이스가 인터페이스 받을 땐 extends!
//인터페이스는 다중상속 가능!
public interface SpringDataMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
    @Override
    Optional<Member> findByName(String name);
}

Last updated