🔍 JpaRepository란?
- JPA에서 데이터 접근 계층(DAO)을 추상화한 인터페이스
- 기본적인 CRUD 기능을 구현 없이 제공
@Repository 어노테이션 없이도 자동으로 Spring Bean 등록됨
✅ 기본 사용법
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByName(String name);
}
<Entity, ID> 제네릭 타입 지정
findAll(), findById(id), save(entity), delete(entity), count() 등 메서드 기본 제공
✅ 쿼리 메서드 (Query Method)
List<Member> findByAgeGreaterThan(int age);
Member findTop1ByNameOrderByIdDesc(String name);
- 메서드 이름만으로 자동 쿼리 생성
- JPA가 파싱하여 JPQL 생성
| 키워드 | 의미 |
|---|
findBy, readBy, getBy | 조회 |
And, Or | 조건 연결 |
Between, LessThan, GreaterThan | 범위 조건 |
Like, Containing, StartsWith | 문자열 검색 |
OrderBy | 정렬 |
✅ @Query로 직접 JPQL 작성
@Query("SELECT m FROM Member m WHERE m.age >= :age")
List<Member> findCustomQuery(@Param("age") int age);
- 복잡한 조건, 조인 등은 직접 JPQL 작성
- 네이티브 쿼리도 가능
@Query(value = "SELECT * FROM member WHERE age >= :age", nativeQuery = true)
List<Member> findNative(@Param("age") int age);
✅ 실무에서 유용한 확장 기능
페이징
Page<Member> findByAgeGreaterThan(int age, Pageable pageable);
Boolean 반환
boolean existsByEmail(String email);
개수 조회
long countByAge(int age);
✅ 사용자 정의 Repository
1. 사용자 정의 인터페이스
public interface MemberRepositoryCustom {
List<Member> search(String keyword);
}
2. 구현체 클래스
public class MemberRepositoryImpl implements MemberRepositoryCustom {
@PersistenceContext
private EntityManager em;
@Override
public List<Member> search(String keyword) {
return em.createQuery("SELECT m FROM Member m WHERE m.name LIKE :kw", Member.class)
.setParameter("kw", "%" + keyword + "%")
.getResultList();
}
}
3. 메인 Repository에 상속
public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom {
}