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 전용 기능, 배치 삭제, 영속성 컨텍스트 플러시 등의 기능 추가)

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

+ Recent posts