[스프링 입문] Section07. 스프링 DB 접근 기술[6] - 스프링 데이터 JPA

Euiyeon Park·2025년 6월 17일

갓영한 스프링🍀

목록 보기
10/12
post-thumbnail

스프링 데이터 JPA

  • 리포지토리에 구현 클래스 없이 인터페이스만으로 개발이 완료
  • CRUD, findById, findAll, DB에서 PK로 검색하는 기능이
    모두 만들어져있어 스프링 데이터 JPA가 제공(공통 기능 제공)
    • 개발자는 그냥 가져다 쓰면 됨!
    • findByName(), findByEmail() 등은 비지니스가 다르므로 공통 정의❌
    • 공통으로 할 수 없는건 직접 정의
    • 그럼 JPA가 이걸 기준으로 쿼리를 작성해줌 ..! - JPQL
    • 즉, 인터페이스 이름만으로도 개발 끝 개쩐당
    • Reflection 기술 사용
  • 스프링 데이터 JPA는 JPA를 편리하게 사용하도록 도와주는 기술

📂 SpringDataJpaMemberRepository

  • 스프링 데이터 JPA는 JpaRepository를 상속받고 있으면
    구현체를 자동으로 생성
    하고, 스프링 빈에 자동으로 등록
  • 프록시 기술을 이용해 런타임에 구현체를 동적 생성 및 스프링 빈 등록
public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
    // MemberRepository의 findByName() 오버라이딩
    // 'select m from Member m where m.name = ?' JPQL -> SQL로 변환돼 실행
    @Override
    Optional<Member> findByName(String name);
}

📂 SpringConfig

@Configuration
public class SpringConfig {

    private final MemberRepository memberRepository;

    // DI -> Spring Data JPA가 만든 구현체가 등록됨
    // 스프링 컨테이너에서 MemberRepository를 찾음 -> 근데 등록한게 없잖아? 사실 하나 있음 SpringDataJpaMemberRepository
    // SpringDataJpaMemberRepository는 JpaRepository를 상속, 스프링 데이터JPA 인터페이스에 대한 구현체를 만들어서 스프링 빈에 등록
    @Autowired
    public SpringConfig(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

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

스프링 데이터 JPA는 어떻게 인터페이스만으로 레포지토리 역할이 가능할까?

🍀 스프링과 프록시 객체

스프링 데이터 JPA에서 구현체 없이 인터페이스만으로 개발이 가능한 이유는
스프링이 런타임 시점에 프록시 객체를 자동으로 생성하고,
내부적으로 JPA API를 호출하도록 위임해주기 때문

🍀 핵심 이유 요약

1. 프록시 기반 동적 구현

  • 스프링이 JpaRepository 인터페이스를 기반으로 프록시 객체를 만들어 동작을 위임

2. Query 메서드 자동 분석

  • 메서드 이름을 분석해 JPQL 쿼리를 자동 생성

3. 스프링 컨테이너가 구현체 주입

  • 개발자가 구현하지 않아도 @Autowired로 주입 가능

🍀 스프링의 런타임 시점 수행과정

1. 컴포넌트 스캔

  • 애플리케이션 실행 시 @SpringBootApplication을 통해 자동으로 패키지를 스캔
  • @Component, @Controller, @Service, @Repository 등으로
    등록된 클래스 또는 인터페이스를 스캔해 빈으로 등록

2. 프록시 객체 생성

  • JpaRepository를 상속받는 인터페이스는 실제 구현체가 없으므로,
    Spring이 프록시 객체를 런타임에 생성
  • 프록시 객체는 Spring AOP 기반의 JDK Dynamic Proxy 또는 CGLIB Proxy를 통해 생성

3. 프록시를 빈으로 등록

  • 생성된 프록시 객체는 빈으로 등록되며, 이후 DI로 사용 가능

profile
"개발자는 해결사이자 발견자이다✨" - Michael C. Feathers

0개의 댓글