728x90
JpaRepository는 Spring Data JPA에서 제공하는 핵심 인터페이스로, Java 객체(Entity)를 데이터베이스에 쉽게 저장, 수정, 삭제, 조회(CRUD)할 수 있도록 도와주는 마법 같은 도구입니다.
과거에는 데이터베이스에 접근하려면 복잡한 SQL문을 매번 작성하거나, JPA의 EntityManager를 직접 다루며 지루한 반복 코드를 짜야 했습니다. JpaRepository는 인터페이스를 선언하는 것만으로 이 모든 반복 작업을 프레임워크가 대신 처리해 줍니다.
1. 기본 개념과 구조
JpaRepository는 Spring Data JPA의 상위 인터페이스들을 상속받아, 단순 CRUD뿐만 아니라 페이징(Paging) 및 정렬(Sorting) 기능까지 기본으로 포함하고 있습니다.
인터페이스 상속 구조
- Repository (마커 인터페이스)
- CrudRepository (기본적인 CRUD 기능 제공)
- PagingAndSortingRepository (페이징 및 정렬 기능 추가)
- JpaRepository (JPA 전용 기능, 배치 삭제, 영속성 컨텍스트 플러시 등의 기능 추가)
- PagingAndSortingRepository (페이징 및 정렬 기능 추가)
- CrudRepository (기본적인 CRUD 기능 제공)
2. 어떻게 사용하나요?
사용법은 정말 간단합니다. 내가 만든 Entity 클래스와 해당 Entity의 PK(Primary Key) 타입을 지정하여 인터페이스를 상속받기만 하면 됩니다.
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
// 아무런 코드를 작성하지 않아도 기본적인 CRUD 메서드를 바로 사용할 수 있습니다!
}
- User: 대상이 되는 엔티티 클래스
- Long: User 엔티티의 @Id (기본키) 타입
3. 주요 제공 메서드
JpaRepository를 상속받으면 아래와 같은 메서드들을 별도의 구현 없이 즉시 호출할 수 있습니다.
| 메서드 | 역할 | 비고 |
| save(S entity) | 새로운 엔티티는 저장(Insert), 기존 엔티티는 수정(Update) | 내부적으로 persist 또는 merge 수행 |
| findById(ID id) | ID(PK) 값으로 특정 엔티티 하나를 조회 | Optional<T> 반환 |
| findAll() | 테이블의 모든 데이터 조회 | List<T> 반환 |
| deleteById(ID id) | ID(PK) 값으로 데이터 삭제 | |
| delete(T entity) | 특정 엔티티 객체를 넘겨 데이터 삭제 | |
| count() | 전체 데이터 개수 반환 | long 반환 |
4. JpaRepository의 강력한 무기: 쿼리 메소드 (Query Methods)
기본 제공 메서드 외에 특정 조건으로 조회를 하고 싶다면, 메서드 이름만 규칙에 맞게 잘 지어주면 Spring이 자동으로 SQL(JPQL)을 생성해 줍니다. 이를 '쿼리 메소드'라고 합니다.
Java
public interface UserRepository extends JpaRepository<User, Long> {
// 1. 이메일로 유저 찾기 (WHERE email = ?)
Optional<User> findByEmail(String email);
// 2. 이름과 가입일로 유저 찾기 (WHERE name = ? AND created_at > ?)
List<User> findByNameAndCreatedAtAfter(String name, LocalDateTime date);
// 3. 특정 단어가 포함된 이름 찾기 (WHERE name LIKE '%...%')
List<User> findByNameContaining(String keyword);
}
만약 조건이 너무 복잡해서 메서드 이름이 길어진다면, @Query 어노테이션을 사용해 직접 JPQL이나 Native SQL을 작성할 수도 있습니다.
@Query("SELECT u FROM User u WHERE u.status = 'ACTIVE' AND u.email LIKE %:email%")
List<User> findActiveUsersByEmail(@Param("email") String email);
요약
- JpaRepository는 Spring Data JPA가 제공하는 데이터 접근용 인터페이스입니다.
- 개발자가 SQL을 직접 짜지 않아도 기본적인 CRUD, 페이징, 정렬 기능을 자동으로 제공합니다.
- 인터페이스에 규칙에 맞는 메서드 이름만 적어주면 알아서 쿼리를 만들어 날려주는 아주 편리한 친구입니다.
전자정부 사용 예시.
private final EgovLoginPolicyRepository loginPolicyRepository; // 로그인정책관리
LoginPolicy loginPolicy = loginPolicyRepository.findById(loginPolicyVO.getEmployerId()).orElse(null);
@Repository("uiaEgovLoginPolicyRepository")
public interface EgovLoginPolicyRepository extends JpaRepository<LoginPolicy, String> {
}
package egovframework.com.uat.uia.entity;
import lombok.Getter;
import lombok.Setter;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import java.time.LocalDateTime;
@Entity(name="uiaLoginPolicy")
@Getter
@Setter
@Table(name="COMTNLOGINPOLICY")
public class LoginPolicy {
@Id
@Column(name="EMPLYR_ID")
private String employerId;
@Column(name="IP_INFO")
private String ipInfo;
@Column(name="DPLCT_PERM_AT")
private String dplctPermAt;
@Column(name="LMTT_AT")
private String lmttAt;
@Column(name="FRST_REGISTER_ID")
private String frstRegisterId;
@Column(name="FRST_REGIST_PNTTM")
private LocalDateTime frstRegisterPnttm;
@Column(name="LAST_UPDUSR_ID")
private String lastUpdusrId;
@Column(name="LAST_UPDT_PNTTM")
private LocalDateTime lastUpdtPnttm;
}728x90
'Spring boot' 카테고리의 다른 글
| Spring Data JPA VS MyBatis 장단점 (0) | 2026.06.27 |
|---|