본문 바로가기

반응형

Spring/JPA

(7)
7) QueryDsl InlineView(인라인뷰) 해결하기. 결론부터 애기를 하자면 QueryDsl로 인라인뷰는 쿼리를 현재는 구현 할 수 없다. 그럼 어떻게 인라인뷰쿼리의 효과를 만들어 낼까를 고민해 보자. 아래 간단한 인라인뷰 쿼리가 있다. select * from Product p , ( select sp.name from Product sp group by sp.name ) mp where p.name = mp.name 위와 같은 쿼리는 사실 간단히 인라인뷰를 사용하지 않고 조건절에 넣어서 해결이 된다. select * from Product p where p.name in ( ( select sp.name from Product sp group by sp.name ) 이 쿼리를 간단하게 QueryDsl로 바꿔 보자. query.selectFrom(p) ...
6) QueryDsl DB Function 사용하기 Query Dsl로 작성하다가 보면 DB에서 사용하던 DB Function을 사용해야 할때가 있다. 예를 들어 아래와 같이 order by 해야 하는데 "2021-01-01 10:10:10" 인 컬럼값을 "2021-01-01 10" 와 같이 "%Y-%m-%d %H:%i:%s" 인 형태에서 "%Y-%m-%d %H" 로만 변형으로 해서 날짜와 시간으로 정렬을 하고자 할때는 QueryDsl 기본 문법으로 적용이 안된다. 이럴때 아래와 같이 사용하면 해결이 된다. public List findContentsFunctionTest(){ QContents contents = QContents.contents; List contentsList = queryFactory.selectFrom(contents) .orde..
5) Spring Data JPA 5부 - QueryDSL Paging , Sort QueyDsl 로 Pasing 처리를 하기 위해서는 어떻게 처리를 해야 할까? 간단하게 PageRequest parameter를 이용한 방법을 알아보자 먼저 Controller 부분이다. @GetMapping("/findQueryDslPasingTest") public List findQueryDslPasingTest(String productName , String itemName , Pageable pageable) throws Exception { // PageRequest pageRequest = PageRequest.of(0, 3, Sort.by("productName").descending()); List products = userService.findProductByCustom(produc..
4) Spring Data JPA 4부 - QueryDSL Predicate 활용 앞에서 간단히 QueryDsl 사용법에 대해 알아 봤는데 . 요기서 조금더 실무에서 자주 쓰이는 방법에 공부해 보자. Predicate 를 직역하면 "서술어" 라고 하는데 즉 where 에 들어가는 조건문을 나타낸다고 생각하면 된다. Predicate 는 보통 where 문을 작성할때 Parameter의 Type 및 값 유무에 따라 조건을 다르게 하고 싶을 사용하게 된다. 아래 샘플 Predicate 를 참조. package com.devracoon.jpa.repository; import com.devracoon.jpa.entity.QItem; import com.devracoon.jpa.entity.QProduct; import com.querydsl.core.BooleanBuilder; import..
3) Spring Data JPA 3부 - @Query , QueryDSL 3부에서는 실제 데이터를 조회할때 Query를 어떤 식으로 사용하는지에 대해 공부해 보자. 데이터를 조회 할때 아래 소스와 같이 JpaRepository를 상속 받게 되면 기본적으로 find 함수가 제공된다. 이것은 조회하고자 하는 Entity의 @Id 컬럼의 값으로 조회가 되게 된다. 그러나 실제 Query에서는 여러 컬럼을 값으로 like 조회나 날짜 조회를 사용하게 되는데 이를 하기 위해 3가지 정도의 방법이 사용되는것 같다. 첫째 JpaRepository를 이용한 함수명으로 쿼리하기 둘째 @Query 를 사용하기 셋째 QueryDSL 이용하기 1. JpaRepository를 이용한 함수명으로 쿼리하기 @Repository public interface ProductRepository extends..
2) Spring Data JPA 2부 - @OneToMany ,@ManyToOne , Casecade 앞선 1부에 이어서 2부에서는 cascade 옵션에 대해 알아 보자. #cascade : 영속성전이 Type을 설정 한다고 하는데 .. 뭔가 단어가 어렵다. 정확히 어떤 역활을 하는지 보자. type의 종류는 ALL , PERSIST , MERGE ,REMOVE ,REFRESH,DETACH 가있다. 여기서 ALL을 당연히 모든 Type을 다 넣은것이고 각각에 대해 알아보자. 먼저 cascade 옵션을 빼고 Product를 저장해보자. @OneToMany(mappedBy = "product" , targetEntity = Item.class , fetch = FetchType.EAGER) private List items = new ArrayList(); @Transactional public String..
1) Spring Data JPA 1부 - 설정 및 예제 한 10년전에 하이버네이트를 사용해서 도메인 모델링과 ORM 프로그래밍을 했었고 여러가지 장단점을 많이 느꼈었다. 그떄 당시에는 하이버네이트보다는 iBatis를 많이 사용하는 추세였고 하이버네이트에 좀 부정적인 입장이였는데 최근에 보니 Spring Data JPA 나 하이버네이트 처럼 ORM 프레임워크를 많이 사용하고 있는것을 알게 되어 다시 ORM에 대해 공부해 보려고 한다. 먼저 JPA는 왜 쓰는걸까? 에 대해 궁금하다. 어떤 장점이 있어서 사용할까? 기존의 SQL 중심 개발에 어느정도 벗어날수 있다. 기존의 ibatis의 경우는 SQL를 직접 만들고 해당 SQL이 변화면 해당 SQL의 DTO도 변경해야 되는데 JPA는 이 문제에서 어느정도 벗어나게 해준다. 반대인 경우도 field가 늘어나면 해당되..

반응형