Spring

[Spring Boot] JpaRepository

codi-3 2024. 8. 20. 20:25

JpaRepository는 Spring Data JPA에서 제공하는 인터페이스로, Spring Boot 애플리케이션에서 데이터베이스와 상호작용하기 위해 사용된다. JpaRepository는 기본적인 CRUD(Create, Read, Update, Delete) 작업과 더불어 페이징 및 정렬 기능을 간편하게 구현할 수 있는 메서드들을 제공한다.

 

✏️주요 특징 및 개념 

Repository 인터페이스 계층 구조:

  • JpaRepositoryCrudRepositoryPagingAndSortingRepository하위 인터페이스이다. 각 계층은 다양한 데이터 액세스 기능을 제공한다:
    • CrudRepository: 기본적인 CRUD 작업을 위한 메서드를 제공한다.
    • PagingAndSortingRepository: 페이징 및 정렬 기능을 추가로 제공한다.
    • JpaRepository: JPA와 관련된 추가적인 기능(예: 배치 삭제, 플러시 등)을 포함한다.

제네릭 타입:

  • JpaRepository는 제네릭 인터페이스로, 사용하는 엔티티 클래스와 그 ID 타입을 지정해야 한다.
public interface MyEntityRepository extends JpaRepository<MyEntity, Long> {
}

여기서 MyEntity는 엔티티 Class이고, Long은 MyEntity의 ID 필드의 데이터 타입이다.

 

자동으로 제공되는 메서드들: JpaRepository는 다양한 기본 메서드를 제공한다:

  • save(S entity): 엔티티를 저장하거나 업데이트한다.
  • findById(ID id): 주어진 ID로 엔티티를 조회한다.
  • findAll(): 모든 엔티티를 조회한다.
  • deleteById(ID id): 주어진 ID의 엔티티를 삭제한다.
  • count(): 총 엔티티 개수를 반환한다.
  • existsById(ID id): 주어진 ID의 엔티티가 존재하는지 확인한다.

 

커스텀 쿼리 메서드:

  • JpaRepository를 확장하는 인터페이스에 메서드를 정의하면, 메서드 이름에 따라 쿼리가 자동으로 생성됩니다. Spring Data JPA가 메서드 이름을 분석해 쿼리를 만든다.
List<MyEntity> findByName(String name);
List<MyEntity> findByAgeGreaterThan(int age);

위 메서드는 각각 name 필드가 일치하는 엔티티를 조회하고, age 필드가 주어진 값보다 큰 엔티티를 조회하는 쿼리를 자동으로 생성한다.

 

JPQL 및 네이티브 쿼리:

  • 복잡한 쿼리나 특정 요구사항이 있는 경우, @Query 애너테이션을 사용해 JPQL(Java Persistence Query Language) 또는 네이티브 SQL 쿼리직접 작성할 수 있다.
@Query("SELECT e FROM MyEntity e WHERE e.name = :name")
List<MyEntity> findByNameCustom(@Param("name") String name);

@Query(value = "SELECT * FROM my_entity WHERE name = ?1", nativeQuery = true)
List<MyEntity> findByNameNative(String name);

🚀JpaRepository의 장점

  1. 생산성: 반복적인 CRUD 작업을 위한 코드 작성이 줄어든다.
  2. 유연성: 커스텀 쿼리 메서드와 @Query 애너테이션을 통해 복잡한 쿼리도 쉽게 작성할 수 있다.
  3. 통합: 페이징, 정렬, 트랜잭션 관리 등 다양한 JPA 기능이 Spring Boot와 원활하게 통합된다.

🔡 예시

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface MyEntityRepository extends JpaRepository<MyEntity, Long> {
    // 커스텀 쿼리 메서드
    List<MyEntity> findByName(String name);
}

Spring Boot 애플리케이션에서 JpaRepository를 사용하려면 위와 같이 인터페이스를 정의한다.

 

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class MyEntityService {

    @Autowired
    private MyEntityRepository repository;

    public List<MyEntity> getEntitiesByName(String name) {
        return repository.findByName(name);
    }

    public void saveEntity(MyEntity entity) {
        repository.save(entity);
    }

    public void deleteEntity(Long id) {
        repository.deleteById(id);
    }
}
 

서비스 계층에서 이를 활용하여 위예시 코드처럼 데이터를 조작할 수 있다. JpaRepository는 Spring Boot와 JPA를 사용하여 데이터 액세스 레이어를 효율적이고 쉽게 관리할 수 있게 해주는 강력한 도구이다.