본문 바로가기

Spring/JPA

(48)
[Querydsl] Experimental function 이번 장에서는 Spring Data JPA가 제공하는 Querydsl의 기능에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 올려두었다. 제목이 Experimental Function인 이유는 기능의 제약이 커서 실무에서 사용하기에는 부족하기 때문이다. 물론 필자의 경험은 아니고 필자가 참고한 강의의 강사인 갓영한님의 말씀이다. QuerydslPredicateExecutor 리포지토리에서 Querydsl의 Predicate(검색 조건)을 받아서 별도의 코드 작성없이 바로 조회하는 기능이다. [공식문서 (링크)](https://docs.spring.io/spring-data/jpa/docs/2.2.3..
[Querydsl] Spring Data JPA & Querydsl 이번 장에서는 Spring Data JPA와 Querydsl을 함께 사용하는 방법에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 올려두었다. 리포지토리 구조 Spring Data JPA의 리포지토리는 인터페이스로 이루어져 있으며 개발자가 직접 구현하지 않는다. 하지만 Querydsl을 사용하기 위해서는 조회하기 위한 코드를 직접 작성해야한다. Data JPA 리포지토리에서 Querydsl을 사용하는 것은 불가능하며 아래와 같이 리포지토리 구조를 잡아야한다. JpaRepository: Spring Data JPA에서 기본 CRUD를 제공하는 인터페이스 SoccerPlayerRepository: 기본..
[Querydsl] Bulk 이번 장에서는 Querydsl의 Bulk 연산에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 올려두었다. Update 이름이 "Roy"인 모든 선수들의 키를 10cm 증가시키는 방법이다. 여기서 주의할 점은 업데이트 이후 강제로 flush, clear를 해주었다는 점이다. Querydsl은 JPQL로 변경될 뿐이다. JPQL의 경우 영속성 컨텍스트의 내용을 무시하고 실행되기 때문에 벌크 연산 이후 DB와의 싱크를 맞추기 위해서는 반드시 영속성 컨텍스트를 비워주어야한다. @Transactional @SpringBootTest @TestMethodOrder(value = OrderAnnotation...
[Querydsl] Dynamic Query 이번 장에서는 Querydsl의 동적 쿼리에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 올려두었다. Querydsl에서 동적 쿼리를 사용하는 방법은 BooleanBuilder와 Where 절에 다중 파라미터를 사용하는 방법 두 가지가 있다. BooleanBuilder @Transactional @SpringBootTest @TestMethodOrder(value = OrderAnnotation.class) public class QuerydslBasicGrammarTest { @Autowired private EntityManager entityManager; private JPAQueryFac..
[Querydsl] Projection 이번 장에서는 Querydsl의 프로젝션에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 올려두었다. 프로젝션이란 Select의 조회의 대상을 지정하는 것을 말한다. SELECT SP.name, SP.height, SP.weight FROM soccer_player SP 이러한 SQL문이 있을 때 프로젝션 대상은 이름, 키, 몸무게 총 세 개가 된다. Querydsl에서도 이러한 프로젝션이 가능하다. 프로젝션 대상이 단수인 경우 정확한 타입을 지정할 수 있지만 프로젝션 대상이 복수인 경우 Tuple나 DTO로 조회해야한다. Tuple 프로젝션 대상이 SoccerPlayer의 name과 height이..
[Querydsl] Sub Query 이번 장에서는 Querydsl의 서브 쿼리에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 올려두었다. JPA에서 서브 쿼리를 사용하기 위해서는 com.querydsl.jpa.JPAExpressions를 사용해야한다. EQ를 사용하여 키가 가장 큰 선수를 조회한다. 서브 쿼리에 사용될 선수(alias)가 필요하기 때문에 새로운 Q 객체를 생성해야 한다. @Transactional @SpringBootTest @TestMethodOrder(value = OrderAnnotation.class) public class QuerydslBasicGrammarTest { @Autowired private E..
[Querydsl] Join 이번 장에서는 Querydsl의 조인에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 올려두었다. Default Join 첫 번째 파라미터로 조인 대상을 지정한다. 두 번째 파라미터로 별칭(alias)로 사용할 Q 타입을 지정한다. 이번에는 Q 클래스 파일에 기본으로 있는 static 인스턴스를 사용하였다. 만약 같은 테이블에 두번의 조인이 필요하다면 두 개의 별칭(alias)이 필요하게 되고 new QSoccerPlayer("alias") 와 같이 새로운 별칭을 생성하여 사용해야한다. @Transactional @SpringBootTest @TestMethodOrder(value = OrderAn..
[Querydsl] Basic Grammar 이번 장에서는 Querydsl의 기본 문법에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 올려두었다. 두 개의 Entity인 축구선수(SoccerPlayer)와 선수들이 속해있는 팀(Team)을 가지고 예를 들어본다. SoccerPlayer @Entity @Getter @Setter @ToString(of = {"id", "name", "height", "weight"}) @NoArgsConstructor(access = PROTECTED) public class SoccerPlayer { @Id @GeneratedValue @Column(name = "soccer_player_id") priva..