스프링 데이터 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
이름으로 검색 + 정렬 + 페이징
호출메서드
...
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 |