본문 바로가기
💻 하나씩 차곡차곡/Back-end

[Spring JPA]JPA Repository란? (정의, 구조, 사용하는 이유, 사용법 등)

by 뚜루리 2025. 4. 18.
728x90
320x100

🌱 JPA Repository란?

JPA Entity 객체를 데이터베이스 테이블과 매핑해서, 이를 기반으로 자동으로 DB 쿼리를 처리해주는 인터페이스임!

 


 

🧱 기본 구조

public interface UserRepository extends JpaRepository<User, Long> { }

 

  • User : 관리할 엔티티 클래스
  • Long : 해당 엔티티의 PK 타입

🧠 사용하는 이유

  1. 생산성↑: SQL 직접 안 써도 됨
  2. 가독성↑: 메서드 이름으로 어떤 쿼리인지 직관적으로 알 수 있음
  3. 유지보수 쉬움: 복잡한 XML 설정 필요 없음

(+) 추가 기능

  • @Query 어노테이션으로 직접 JPQL 작성 가능
  • QueryDSL, Specification 등을 사용해서 더 복잡한 조건 처리 가능

 

🛠 자동으로 제공되는 기본 기능

메서드 이름 기능 설명
findById(id) PK로 조회
findAll() 모든 데이터 조회
save(entity) 새로 저장 또는 수정
delete(entity) 엔티티 삭제
count() 총 개수 조회
existsById(id) 특정 ID 존재 여부 확인

→ 직접 SQL을 안 써도 기본적으로 제공되는 기능!

 

 

✨ 이름 규칙만 지키면 작동하는 메서드 자동 생성 해준다!

Spring Data JPA는 다음 구조로 메서드 이름을 해석함

[동작] + By + [조건 필드명] + [조건 연산자]

예:

  • findBy + Email
  • existsBy + Email
  • findBy + EmailAndStatus
  • deleteBy + NicknameLike

👉 이런 메서드 이름만 지으면, JPA가 알아서 SQL을 생성해준다!

 

🔍 추가로 지원되는 지원되는 키워드들 예시

메서드 이름 생성되는 쿼리
findByEmail(String email) WHERE email = ?
findByNicknameLike(String name) WHERE nickname LIKE ?
findByStatusIn(List<UserStatus> statuses) WHERE status IN (?, ?, ?)
findByCreatedAtBetween(start, end) WHERE created_at BETWEEN ? AND ?
existsByEmail(String email) SELECT COUNT(*) > 0 WHERE email = ?
deleteByStatus(UserStatus status) DELETE FROM ... WHERE status = ?

 

 


JPA Repository에는 따로 @Repository 어노테이션을 붙이지 않아도 되나요?

👉 JPA Repository에는 따로 어노테이션을 붙이지 않아도 됨.

🔍 왜 어노테이션이 없어도 될까?

Spring에서는 @Repository 같은 어노테이션을 붙이면 해당 클래스를 빈(Bean)으로 등록해서 스프링이 자동으로 관리할 수 있게 해줌. 그런데 이 UserRepository는 인터페이스이고, 직접 구현하지 않아도 Spring Data JPA가 자동으로 구현체를 만들어서 빈으로 등록해준다.

즉 내부적으로...

Spring Boot가 실행될 때, @EnableJpaRepositories 설정 덕분에 JpaRepository를 상속한 인터페이스들을 스캔하고, 자동으로 프록시 객체를 만들어서 빈으로 등록함. 그래서 우리가 어노테이션을 붙이지 않아도 아래처럼 쓸 수 있음.

728x90
320x100