![[실전! 스프링 데이터 JPA] 1. 공통 인터페이스 기능](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJhEd6%2FbtsC4I2i18I%2FUKF366MR0i6l66tFfbYhj1%2Fimg.png)
인프런 김영한 강사님의 [실전! 스프링 데이터 JPA] 을 수강하고 정리한 글입니다.
실전! 스프링 데이터 JPA 강의 - 인프런
스프링 데이터 JPA는 기존의 한계를 넘어 마치 마법처럼 리포지토리에 구현 클래스 없이 인터페이스만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 모두 제공합니다.
www.inflearn.com
📌 순수 JPA 기반 리포지토리
✅ 순수 JPA 기반 리포지토리 만들기
기본적으로 JPA에서의 CRUD는 아래와 같다.
- 저장
- 변경 (변경감지 활용)
- 삭제
- 전체 조회
- 단건 조회
- 카운트
이 요소들을 순수 JPA 코드로서 레포지토리를 작성하면 아래와 같다.
package study.datajpa.repository;
import org.springframework.stereotype.Repository;
import study.datajpa.entity.Member;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.List;
import java.util.Optional;
@Repository
public class MemberJpaRepository {
@PersistenceContext
private EntityManager em;
public Member save(Member member) {
em.persist(member);
return member;
}
public void delete(Member member) {
em.remove(member);
}
public List<Member> findAll() {
return em.createQuery("select m from Member m", Member.class)
.getResultList();
}
public Optional<Member> findById(Long id) {
Member member = em.find(Member.class, id);
return Optional.ofNullable(member);
}
public long count() {
return em.createQuery("select count(m) from Member m", Long.class)
.getSingleResult();
}
public Member find(Long id) {
return em.find(Member.class, id);
}
}
일일히 이러한 공통적인 메서드를 매번 작성하는 것은 확실히 귀찮다.
이를 Spring Data JPA가 해결해준다.
📌 공통 인터페이스
✅ 공통 인터페이스 설정
JavaConfig 설정 (SpringBoot 사용 시 생략 가능하다.)
@Configuration
@EnableJpaRepositories(basePackages = "jpabook.jpashop.repository")
public class AppConfig {}
사실 SpringBoot에서는 @SpringBootApplication 어노테이션에서 위치를 직접 지정하기에 생략해도 된다.
만약 위치가 달라진다면 @EnableJpaRepositories가 별도로 필요하긴 하다.
✅ Spring Data JPA가 구현 클래스 대신 생성
repository 인터페이스를 구현한 클래스는 자동적으로 Spring Data JPA가 컴포넌트 스캔으로 대상화 하며, 자동 처리한다.
실제로 xxxRepository.getClass()의 형태로 출력을 해보면 Proxy 객체가 출력되는 것을 확인할 수 있다.
따라서 @Repository가 생략 가능하다.
✅ Spring Data JPA 기반 Repository 예시
public interface MemberRepository extends JpaRepository<Member, Long> {
}
위 선언 한번으로, Spring Data JPA가 미리 설정해둔 기본적인 CRUD를 모두 내장하여 개발자가 별도로 메서드를 만들 필요가 없다.
정말 간편하다..
JpaRepository<T, ID> 에서 T의 경우 엔티티 타입을 의미하고, ID는 식별자 타입을 의미한다.
대부분 PK는 long 형태를 사용할 것이다.
(위 사진에서 T findOne(ID)는 Optional<T> findById(ID)로, boolean exists(ID)는 boolean existsById(ID)로 변경해야 한다. 다소 옛날 자료인듯)
✅ 주요 메서드
save(S) : 새로운 엔티티는 저장하고 이미 존재하는 엔티티는 병합한다.
delete(T) : 엔티티를 하나 삭제한다.
내부에서 EntityManager.remove()를 호출한다.
findById(ID) : 특정 엔티티 하나를 조회한다.
내부에서 EntityManager.find()가 호출된다.
getOne(ID) : 엔티티를 프록시로 조회한다.
내부에서 EntityManager.getReference()를 호출한다.
findAll(...) : 모든 엔티티 조회
정렬이나 페이지 조건을 파라미터로 제공할 수도 있다.
'Backend > JPA' 카테고리의 다른 글
[실전! 스프링 데이터 JPA] 3. 확장 기능 (1) | 2024.01.10 |
---|---|
[실전! 스프링 데이터 JPA] 2. 쿼리 메소드 기능 (1) | 2024.01.10 |
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 11. 객체지향 쿼리 언어 2 (1) | 2024.01.05 |
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 10. 객체 지향 쿼리 언어 1 (0) | 2024.01.05 |
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 9. 값 타입 (0) | 2024.01.05 |
개발자가 되고 싶어요.