💡 스프링 데이터 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 |