728x90
320x100
🌱 JPA Repository란?
JPA Entity 객체를 데이터베이스 테이블과 매핑해서, 이를 기반으로 자동으로 DB 쿼리를 처리해주는 인터페이스임!
🧱 기본 구조
public interface UserRepository extends JpaRepository<User, Long> { }
- User : 관리할 엔티티 클래스
- Long : 해당 엔티티의 PK 타입
🧠 사용하는 이유
- 생산성↑: SQL 직접 안 써도 됨
- 가독성↑: 메서드 이름으로 어떤 쿼리인지 직관적으로 알 수 있음
- 유지보수 쉬움: 복잡한 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
'💻 하나씩 차곡차곡 > Back-end' 카테고리의 다른 글
[스프링 시큐리티] 서버 기반 인증 VS 토큰 기반 인증 (Session, JWT 등) (0) | 2025.04.21 |
---|---|
[Spring] 단위 테스트에서 서비스 중심? 레파지토리 중심? (0) | 2025.04.18 |
[Spring Security] BCryptPasswordEncoder란? (정의, 사용하는 이유, 사용법 등) (0) | 2025.04.18 |
[Spring/JPA] Auditing 기능이란? (정의, 사용법, 사용하는 이유 등) (0) | 2025.04.18 |
프로젝트 패키지 구조 : 레이어 중심 VS 도메인 중심 (0) | 2025.04.18 |