코딩못하는사람

Spring Data JPA(1) 본문

JPA

Spring Data JPA(1)

공부절대안함 2021. 6. 5. 05:44

Spring Data JPA란?

스프링에서 JPA를 쉽게 사용할 수 있도록 지원해주는 모듈이다.

CRUD 쿼리를 짜려면 하나의 도메인마다 반복되는 코드를 JPQL로 짜주어야했다.

하지만 Spring Data JPA를 의존성으로 주입받아 사용하게 된다면 우리가 일반적으로 사용하는 모든 메서드(쿼리)를 직접 작성하지 않아도 인터페이스만 만들어 놓는다면 대신 만들어준다.

 

인터페이스에서 공통으로 제공되는 메서드의 예시는

count, delete, deleteAll, deleteAll, deleteById, existsById, findById, findAll,save ..등이 있다.

 

Spring Data JPA의 동작과정을 보자.

 

김영한스프링 Data JPA 강의 자료

Spring Data JPA가 JpaRepository를 확장한 Repository Interface를 스캔해서 자체적으로 같은 이름의 프록시 구현 클래스를 만들어서 제공해준다. 우리는 인터페이스만 만들어두면 된다.

 

jpql로 CRUD를 만들었던 코드와 Spring Data JPA로 인터페이스를 만든 코드를 비교해보자.

1.JPQL

@Repository
@RequiredArgsConstructor
public class MemberRepository {
    @PersistenceContext
    private final EntityManager em;
    //저장
    public void save(Member member) {
        em.persist(member);
    }
    //id로 하나찾기
    public Member findOne(Long id) {
        return em.find(Member.class, id);
    }
    //모든리스트 반환
    public List<Member> findAll() {
        return em.createQuery("select m from Member m", Member.class)
                .getResultList();
    }
    //이름으로 찾기
    public List<Member> findByName(String name) {
        return em.createQuery("select m from Member m where m.name=:name", Member.class)
                .setParameter("name", name)
                .getResultList();
    }
}

EntityManager의 메서드를 통해서 직접 쿼리를 짜주어야 했다. (비생산적)

 

2.Spring Data JPA 인터페이스 제작

public interface MemberRepository extends JpaRepository<Member,Long> {
    List<Member> findByName(String name);
    Optional<Member> findByNickname(String name);
    Optional<Member> findByLoginid(String loginid);
}

원하는 이름의 repository 명으로 인터페이스를 만들고 JpaRepository<Entity,PK타입>를 extends 해주면 끝이다. 그렇게 되면 공통적으로 사용되는 모든 메서드들이 알아서 만들어진다.

 

하지만 위에서 정의한 findByName같은 특별한 메서드들은 당연히 공통적으로 정의되어있지 않다.(PK를 받는것도 아니고 모든 사람이 정의한 엔티티 구성이 다르기 때문에) Spring Data JPA는 메서드 이름을 분석해서 자신이 JPQL을 만들어낸다.

 

  • 조회: find…By ,read…By ,query…By get…By,
  • COUNT: count…By 반환타입 long
  • EXISTS: exists…By 반환타입 boolean
  • 삭제: delete…By, remove…By 반환타입 long
  • DISTINCT: findDistinct, findMemberDistinctBy
  • LIMIT: findFirst3, findFirst, findTop, findTop3

이러한 형식을 지켜서 내 엔티티의 필드명과 조합해서 다양한 기능을 메서드 명+변수만으로 정의할 수 있다.  당연히 내 Member 엔티티에는 name,nickname,loginid 필드가 존재한다.

 

 

프로젝트를 진행하게 되면 많은 Entity가 생기고 그에 따라서 Repository도 자연스럽게 늘어나게 되는데

Spring Data JPA를 사용하면 생산성이 어마어마하게 증가하는 것을 JPQL로 쿼리를 짜는 프로젝트를 한번 진행해보았더니 크게 체감이 된다.(소중하다)

 

 

공부 및 출처

스프링 Data JPA 김영한님 강의

'JPA' 카테고리의 다른 글

JPA 동시성 문제  (0) 2021.12.31
JPA란?  (0) 2021.04.19
Comments