1. Spring Data JPA Repository란?
Spring Data JPA의 Repository는 데이터 액세스 계층을 구성하는 인터페이스로, 데이터베이스와의 상호작용을 쉽게 할 수 있도록 추상화된 구조를 제공합니다. JPA와 Hibernate를 기반으로 하며, 기본적인 CRUD(Create, Read, Update, Delete) 기능을 자동으로 제공합니다.
2. Repository의 기본 개념
Spring Data JPA에서는 기본적으로 아래와 같은 3가지 인터페이스를 제공하여 Repository를 구성할 수 있습니다.
1) CrudRepository<T, ID>
- 기본적인 CRUD 기능을 제공합니다.
- findById, save, deleteById, existsById 등의 메서드가 포함됩니다.
public interface UserRepository extends CrudRepository<User, Long> {
}
2) PagingAndSortingRepository<T, ID>
- CrudRepository 기능에 더하여, 페이징 및 정렬 기능을 제공합니다.
- findAll(Pageable pageable), findAll(Sort sort) 등의 메서드를 사용할 수 있습니다.
public interface UserRepository extends PagingAndSortingRepository<User, Long> {
}
3) JpaRepository<T, ID>
- CrudRepository와 PagingAndSortingRepository의 기능을 모두 포함하며, JPA에 특화된 추가 기능을 제공합니다.
- flush(), saveAndFlush(), deleteInBatch() 등의 메서드를 제공합니다.
public interface UserRepository extends JpaRepository<User, Long> {
}
3. Repository의 주요 기능
Spring Data JPA의 Repository를 활용하면 SQL을 직접 작성하지 않고도 다양한 데이터를 쉽게 조회할 수 있습니다.
1) 기본 CRUD 메서드 사용
User user = new User("John Doe");
userRepository.save(user);
Optional<User> foundUser = userRepository.findById(1L);
userRepository.deleteById(1L);
2) 페이징 및 정렬
Page<User> users = userRepository.findAll(PageRequest.of(0, 10, Sort.by("name")));
4. 쿼리 메서드 (Query Method) - 전문화
쿼리 메서드는 Spring Data JPA에서 메서드 명을 기반으로 자동으로 SQL을 생성하는 기능을 제공합니다. 복잡한 조건을 포함하는 메서드도 작성할 수 있으며, 다양한 연산자를 조합하여 활용할 수 있습니다.
1) 기본적인 조회 메서드
List<User> findByName(String name);
List<User> findByAgeGreaterThan(int age);
List<User> findByCreatedAtBetween(LocalDateTime start, LocalDateTime end);
2) 복합 조건을 활용한 조회 (AND, OR 조합)
List<User> findByNameAndAge(String name, int age);
List<User> findByNameOrAge(String name, int age);
3) 다양한 연산자 활용 (LIKE, IN, BETWEEN, ORDER BY)
List<User> findByNameLike(String pattern);
List<User> findByAgeIn(List<Integer> ages);
List<User> findByAgeBetween(int start, int end);
List<User> findByAgeGreaterThanOrderByCreatedAtDesc(int age);
4) 복합적인 검색 기능 (Containing, StartsWith, EndsWith)
List<User> findByNameContaining(String keyword);
List<User> findByNameStartingWith(String prefix);
List<User> findByNameEndingWith(String suffix);
5) Boolean 조건을 활용한 검색
List<User> findByActiveTrue();
List<User> findByVerifiedFalse();
6) 날짜 조건을 활용한 검색
List<User> findByCreatedAtAfter(LocalDateTime date);
List<User> findByCreatedAtBefore(LocalDateTime date);
5. @Query 어노테이션 활용
@Query 어노테이션을 활용하면 JPQL(Java Persistence Query Language)이나 네이티브 SQL을 직접 사용할 수 있습니다.
1) JPQL을 사용한 쿼리 작성
@Query("SELECT u FROM User u WHERE u.name = :name")
List<User> findByCustomQuery(@Param("name") String name);
2) 네이티브 쿼리 사용
@Query(value = "SELECT * FROM users WHERE name = :name", nativeQuery = true)
List<User> findByNativeQuery(@Param("name") String name);
3) 동적 정렬 적용
@Query("SELECT u FROM User u WHERE u.age > :age")
List<User> findByAgeWithSorting(@Param("age") int age, Sort sort);
6. 연관 관계 엔티티를 이용한 JOIN 쿼리 실행
연관된 엔티티와 함께 데이터를 조회할 때는 JOIN을 사용할 수 있습니다.
1) Fetch Join 사용
@Query("SELECT o FROM Order o JOIN FETCH o.user WHERE o.id = :orderId")
Order findOrderWithUser(@Param("orderId") Long orderId);
2) EntityGraph 사용
@EntityGraph(attributePaths = {"user"})
@Query("SELECT o FROM Order o")
List<Order> findAllWithUserGraph();
7. QueryDSL을 활용한 동적 쿼리 작성
QueryDSL은 타입 안전한 동적 쿼리를 작성할 수 있도록 도와줍니다.
1) QueryDSL을 활용한 기본 조회
JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
QUser qUser = QUser.user;
List<User> users = queryFactory.selectFrom(qUser)
.where(qUser.name.eq("John"))
.fetch();
2) 동적 조건 적용
public List<User> searchUsers(String name, Integer minAge, Integer maxAge) {
QUser user = QUser.user;
BooleanBuilder builder = new BooleanBuilder();
if (name != null) {
builder.and(user.name.contains(name));
}
if (minAge != null) {
builder.and(user.age.goe(minAge));
}
if (maxAge != null) {
builder.and(user.age.loe(maxAge));
}
return queryFactory.selectFrom(user)
.where(builder)
.fetch();
}
이제 Spring Data JPA의 쿼리 메서드를 활용하여 더욱 강력한 검색 기능을 구현할 수 있습니다.
'개발 이론 > JPA' 카테고리의 다른 글
| 정적 / MVC + 템플릿 엔진 / API (0) | 2025.03.02 |
|---|---|
| 엔티티 (0) | 2025.02.02 |
| JPA 정의 (1) | 2025.02.02 |