[Spring Project] 스프링 데이터 JPA 완전 정복: CRUD부터 메서드 자동 생성까지

2025. 4. 30. 18:52·Back end/Spring Project
반응형

💡 스프링 데이터 JPA란?

스프링 부트와 JPA만으로도 개발 생산성을 크게 높일 수 있지만, 여기에 스프링 데이터 JPA를 활용하면 리포지토리 구현체 없이 인터페이스만으로도 데이터 접근 기능을 손쉽게 구현할 수 있어, 개발해야 할 코드가 눈에 띄게 줄어듭니다. 반복적으로 작성해오던 CRUD 기능도 스프링 데이터 JPA가 기본적으로 제공하므로, 개발자는 핵심 비즈니스 로직에만 집중할 수 있습니다.

관계형 데이터베이스를 사용하는 실무 환경이라면, 스프링 데이터 JPA는 이제 선택이 아닌 사실상 필수적인 기술입니다.


📌 스프링 데이터 JPA 주요 기능

  • 기본적인 CRUD 기능 자동 제공 (save, findById, delete, findAll 등)
  • 메서드 이름만으로 조회 기능 구현 (findByName, findByEmail, 등)
  • 페이징, 정렬 기능 자동 지원
  • @Query 어노테이션을 통한 직접 JPQL 작성
  • 실무에서는 Querydsl과 함께 사용하면 복잡한 동적 쿼리도 해결 가능

🛠️ 스프링 데이터 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 {
    Optional<Member> findByName(String name);
}

JpaRepository를 상속하기만 해도, 스프링 데이터 JPA가 해당 인터페이스의 구현체를 자동으로 생성해 Spring 빈으로 등록합니다.


📌 JpaRepository란?

JpaRepository를 상속하면 DAO 구현 없이도 데이터 접근이 가능하며, 스프링 데이터 JPA가 CRUD를 비롯한 다양한 기능을 자동으로 제공합니다


🛠️ JpaRepository의 기본 제공 메서드 (CRUD)

JpaRepository<T, ID>에서 제공하는 주요 메서드는 다음과 같습니다.

메서드 설명
save(T entity) 엔티티 저장 (insert 또는 update)
findById(ID id) ID로 엔티티 조회 (Optional<T> 반환)
findAll() 모든 엔티티 조회
findAllById(Iterable<ID> ids) 여러 ID로 엔티티 조회
existsById(ID id) 해당 ID가 존재하는지 여부 확인
count() 전체 레코드 수 반환
deleteById(ID id) ID로 삭제
delete(T entity) 특정 엔티티 삭제
deleteAll() 모든 엔티티 삭제

🧩 메서드 이름 기반 쿼리 생성

스프링 데이터 JPA는 메서드 이름을 분석하여 자동으로 JPQL을 생성합니다.
예를 들어, 아래와 같이 작성하면

Optional<Member> findByName(String name);

다음과 같은 JPQL이 자동으로 실행됩니다.

 

select m from Member m where m.name = :name

※ 실제 SQL은 다음과 유사합니다.

select * from member m where m.name = ?

이처럼 findBy 뒤에 오는 필드명을 조합하여 조건을 추가할 수 있습니다.

🔧 다양한 쿼리 메서드 예시

다양한 조건을 조합한 커스텀 조회 메서드도 메서드 이름만으로 만들 수 있습니다.

List<Member> findByNameAndAge(String name, int age);
List<Member> findByAgeGreaterThan(int age);
List<Member> findByNameContaining(String keyword);
List<Member> findByNameOrderByAgeDesc(String name);

자동으로 다음과 같은 JPQL이 생성됩니다.

  • select m from Member m where m.name = :name and m.age = :age
  • select m from Member m where m.age > :age
  • select m from Member m where m.name like %:keyword%
  • select m from Member m where m.name = :name order by m.age desc

이처럼 간단한 메서드 정의만으로도 강력한 데이터 접근 기능을 제공받을 수 있습니다.


⚙️ 스프링 설정 예제

package hello.hellospring;

import hello.hellospring.repository.MemberRepository;
import hello.hellospring.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringConfig {

    private final MemberRepository memberRepository;

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

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

 

  • SpringDataJpaMemberRepository는 JpaRepository를 상속한 인터페이스로, 스프링 부트 실행 시 구현체가 자동 생성됩니다.
  • 생성된 구현체는 MemberRepository 타입으로 스프링 컨테이너에 등록되어, 설정 클래스에서 주입받아 사용할 수 있습니다.
  • 위처럼 설정 클래스에서 생성자 주입을 통해 MemberService → MemberRepository → JPA 구현체 흐름이 자연스럽게 이어집니다.

 


✨ 실무에서의 확장

실무에서는 JPA와 스프링 데이터 JPA를 기본으로 사용하고, 복잡한 동적 쿼리가 필요할 경우 다음 기술들과 함께 사용합니다.

  • ✅ Querydsl: 자바 코드로 안전하게 쿼리 작성 (자동완성, 컴파일 타임 오류 확인 가능)
  • ✅ Native Query: 성능이 중요한 복잡 쿼리 처리
  • ✅ JdbcTemplate: SQL 기반의 정밀 제어가 필요한 경우

스프링 데이터 JPA는 복잡한 DAO나 리포지토리 구현 없이도, 간단한 메서드 정의만으로 강력한 데이터 접근 기능을 제공하는 프레임워크입니다. 단순 CRUD는 물론, 페이징, 정렬, 조건 검색 등 다양한 기능을 안정적으로 제공하며, Querydsl과 결합하면 동적 쿼리까지 손쉽게 처리할 수 있습니다. JPA와 스프링 데이터 JPA를 제대로 이해하고 활용하면, 개발 생산성과 유지보수성 모두에서 큰 이점을 얻을 수 있습니다.

 

반응형

'Back end > Spring Project' 카테고리의 다른 글

[Spring Project] 겨울을 지나 봄으로: 스프링의 등장 배경과 개념  (0) 2025.05.12
[Spring Project] 반복되는 로직? AOP로 한 방에 해결하기 (예제 포함)  (0) 2025.05.08
[Spring Project] JPA 핵심: EntityManager와 주요 메서드 정리 (persist, find, createQuery)  (0) 2025.04.29
[Spring Project] JPA(Java Persistence API) - 사용 이유부터 설정 방법까지  (0) 2025.04.25
[Spring Project] 반복되는 JDBC 코드, JdbcTemplate으로 깔끔하게 정리하기  (0) 2025.04.24
'Back end/Spring Project' 카테고리의 다른 글
  • [Spring Project] 겨울을 지나 봄으로: 스프링의 등장 배경과 개념
  • [Spring Project] 반복되는 로직? AOP로 한 방에 해결하기 (예제 포함)
  • [Spring Project] JPA 핵심: EntityManager와 주요 메서드 정리 (persist, find, createQuery)
  • [Spring Project] JPA(Java Persistence API) - 사용 이유부터 설정 방법까지
Kim-SooHyeon
Kim-SooHyeon
개발일기 및 알고리즘, 블로그 운영에 대한 글을 포스팅합니다. :) 목표: 뿌리 깊은 개발자 되기
    반응형
  • Kim-SooHyeon
    soo_vely의 개발로그
    Kim-SooHyeon
  • 전체
    오늘
    어제
    • 분류 전체보기 (258)
      • 알고리즘 (108)
        • 자료구조 (3)
        • Java (104)
        • Python (1)
      • Back end (73)
        • Spring Project (28)
        • Java (23)
        • API (1)
        • Python (0)
        • Django (3)
        • Linux (1)
        • 서버 (2)
        • 에러로그 (11)
        • 부스트 코스 (1)
      • Front end (9)
        • HTML, CSS (4)
        • JavaScript (4)
        • JQuery (0)
      • 기타 프로그래밍 (4)
        • Android Studio (1)
        • Arduino (2)
        • Azure Fundamental(AZ-900) (1)
      • 개발도구 (24)
        • IntelliJ (2)
        • Git (12)
        • SVN (0)
        • Eclipse (2)
        • 기타 Tool (8)
      • Database (17)
        • Oracle (11)
        • MySQL (0)
        • H2 Database (3)
        • ORM & JPA (1)
      • 자격증 (10)
        • 컴활 1급 (7)
        • 컴활 2급 (2)
        • SQLD (1)
      • 기타 (13)
        • 블로그 운영 (6)
        • 문서 (1)
        • 기타 (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    오라클
    알고리즘
    spring
    문자열
    springboot
    배열
    1차원 배열
    java
    단계별풀기
    구현
    Oracle
    solved.ac
    jpa
    Git
    백준 자바
    github
    백준
    BOJ
    for문
    백준알고리즘
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Kim-SooHyeon
[Spring Project] 스프링 데이터 JPA 완전 정복: CRUD부터 메서드 자동 생성까지
상단으로

티스토리툴바