본문 바로가기
JPA

Spring Data JPA & QueryDSL

by bloodFinger 2021. 1. 7.

스프링 데이터 JPA ?

  • 지루하게 반복되는 CRUD 문제를 세련된 방법으로 해결 할 수있다.
  • 개발자는 인터페이스만 작성하면 된다.
  • 스프링 데이터 JPA가 구현 객체를 동적으로 생성해서 주입한다.

 

스프링 데이터 JPA 적용 전

public class MemberRepository {
    public void save(Member member) { ... }
    public Member findOne(Long id) {...}
    public List<Member> findAll() {...}
    
    public Member findByUsername(String username) { ... }
}


public class ItemRepository {
    public void save(Member member) { ... }
    public Member findOne(Long id) {...}
    public List<Member> findAll() {...}
}

 

 

스프링 데이터 JPA 적용 후 - 중복 제거(스프링이 애플리케이션 로드 시점에 구현체를 만들어 넣는다)

public interface MemberRepository extends JpaRepository<Member , Long>{
    Member findByUsername(String Username);
}

public interface ItemRepository extends JpaRepository<ITem , Long>{
	//비어있음
}

 

스프링 데이터 JPA 

 

스프링 데이터 JPA 상속

 

 

이름으로 검색  + 정렬 + 페이징

호출메서드

...
PageRequest pageRequest = pageRequest.of(1,10);
return repository.findByName("hello" , pageRequest);

repository

public interface MemberRepository extends JpaReposotory<Member,Long> {
    Page<Member> findByName(String username , Pageable pageable);
}

 

 

@Query를 사용해서 직접 JPQL 지정

public interface MemberRepository extends JpaRepository<Member,Long> {
    @Query("select m from Member m where m.username=?1")
    Member findByUsername(String username , Pagable pagable);
}

 

반환 타입 또한 지정가능하다.

List<Member> findByName(String name); // 다건(컬렉션)

Member findByEmail(Sting email); // 단건

 

Web 도메인 클래스 컨버터 기능 - 사용빈도는 낮다.

- 컨트롤러에서 식별자로 도메인 클래스 찾는다.

@RequestMapping("/members/{memberId}")
Member member(@PathVariable("memberId") Member member) {
    return member;
}

 


QueryDSL ?

  • sql , jpql를 코드로 작성할 수 있도록 도와주는 빌더 API
  • JPA 크리테리아에 비해 편리하고 실용적임
  • 오픈소스

 

SQL , JPQL의 문제점

  • sql , jpql은 문자, Type-check 불가능
  • 해당 로직 실행 전까지 작동여부 확인 불가

 

SELECT * FROM MEMBER WHERE MEMBER_ID = '100'

 

 

QueryDSL 장점

  • 문자가 아닌 코드로 작성
  • 컴파일 시점에 문법 오류 발견
  • 코드 자동완성
  • 단순하고 쉬움: 코드 모양이 JPQL과 거의 비슷
  • 동적 쿼리 작성 가능

 

 

 

 

 

 

'JPA' 카테고리의 다른 글

JPA 내부구조 알아보기  (0) 2020.09.14
JPA 사용시 주의사항 정리  (0) 2020.08.22
연관관계 매핑  (0) 2020.05.25
JPA 매핑 어노테이션  (0) 2020.05.24
이제는 Mybatis 에서 JPA로 넘어가자  (0) 2020.04.17