본문 바로가기

SPRING/Spring

[스프링| 스프링 입문 | 코드로 배우는 스프링] 스프링 데이터 JPA

package hello.hellospring.repository;

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

import java.util.Optional;

public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository{

    @Override
    Optional<Member> findByName(String name);
}

 

package hello.hellospring;

import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.service.MemberService;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringConfig {

    private final MemberRepository memberRepository;

    @Autowired
    public SpringConfig(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

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

Spring Data JPA의 주요 특징

  1. 리포지토리 추상화: 스프링 데이터 JPA는 인터페이스 기반 프로그래밍을 통해 데이터 액세스 레이어를 추상화합니다. 개발자는 인터페이스만 정의하고, 스프링 데이터 JPA가 런타임에 이를 구현한 프록시 객체를 자동으로 생성합니다.
  2. 쿼리 메소드 자동 구현: 메소드 이름만으로 쿼리를 유추하여 구현하는 기능을 제공합니다. 예를 들어, findByName 메소드는 메소드 이름에서 'find By Name'이라는 패턴을 분석하여, 해당 이름을 가진 Member 객체를 조회하는 쿼리를 자동으로 생성하고 실행합니다.
  3. 편리한 페이징과 정렬: JpaRepository 인터페이스는 페이징과 정렬 기능을 위한 메소드를 제공합니다. 이를 통해 복잡한 페이징 로직을 쉽게 구현할 수 있습니다.
  4. JPA 표준에 기반한 API: JpaRepository는 JPA의 EntityManager를 활용하여 구현되므로, JPA 표준을 따르는 일관된 방식으로 데이터를 처리할 수 있습니다.
  • SpringDataJpaMemberRepository 인터페이스는 JpaRepository를 확장하고 있습니다. 여기서 JpaRepository는 제네릭 타입으로 Member 엔티티와 그 엔티티의 ID 필드 타입인 Long을 받습니다. 이로써 Member 엔티티에 대한 기본적인 CRUD 연산과 페이징, 정렬 기능이 자동으로 제공됩니다.
  • 추가적으로 MemberRepository 인터페이스를 확장함으로써, Member 엔티티에 특화된 사용자 정의 메소드를 더욱 쉽게 추가할 수 있습니다. 이 예제에서는 findByName 메소드를 오버라이드하여 명시적으로 정의하고 있습니다. 이 메소드는 주어진 이름에 해당하는 Member 객체를 찾아 Optional<Member> 타입으로 반환합니다.

스프링 데이터 JPA를 사용함으로써 데이터 액세스 코드의 양을 크게 줄이고, 보다 선언적이고 직관적인 방식으로 데이터베이스와의 상호작용을 구현할 수 있습니다. 이는 개발 속도와 유지 보수성을 향상시키는 중요한 이점을 제공합니다.