분류 전체보기
JPA를 사용할 때, QueryDSL을 도입하는 가장 큰 이유는 동적 쿼리 작성에 매우 유연하다는 점이다. 이번 포스팅에서는 동적 쿼리를 작성하는 방법에 대해서 알아보도록 하겠다. 사용할 데이터 1. Author : Book = 1 : N Author(저자)는 여러 개의 Book(책)을 가진다. 2. Author : Organization = N : 1 Author(저자)는 한곳의 Organization(조직)에 속한다. 3. Book : Review = 1 : N Book(책)은 여러 개의 Review(리뷰)를 가진다. @Entity @Table(name = "Organization") @Getter @Setter public class Organization { @Id @GeneratedValue(s..
이전 포스팅들에서 JPQL, Spring Data JPA Repository, QueryDSL 등을 통해서 데이터를 조회하는 방법들에 대해서 다루어 보았었다. 이번에는 쿼리 결과로 나온 Entity 혹은 Tuple들을 DTO로 매칭하는 방법을 알아보려고 한다. 기본적인 DTO 변환 방법 : 스트림 API ToOne 관계, ToMany 관계 조회 매핑 ModelMapper 활용 ToOne 관계, ToMany 관계 조회 매핑 프로젝션 프로젝션 사용 방법들 서브쿼리, Case, ToOne 관계, ToMany 관계 조회 매핑 QueryProjection ToOne 관계, ToMany 관계 조회 매핑 사용할 데이터 1. Author : Book = 1 : N Author(저자)는 여러 개의 Book(책)을 가진다..
이전 포스팅에서 기본적인 QueryDSL의 검색 쿼리 문법에 대해서 살펴보았었다. 이번 포스팅에서는 연관된 다른 릴레이션과의 연산을 수행하는 Join과 Subquery 방법에 대해서 알아보도록 하겠다. 아래 포스팅은 QueryDSL의 기본 검색에 대한 문법을 정리해 둔 것이니 참고하면 좋을 것 같다. https://sjh9708.tistory.com/175 [Spring Boot/JPA] QueryDSL 문법(1) : 기본 검색 (선택, 조건, 정렬, 집계, 그룹화) 이전 포스팅에서 QueryDSL 사용을 Repository에서 할 수 있도록 설정하는 방법에 대해서 다루어 보았었다. 이제 실제로 자주 사용되는 SQL문을 QueryDSL을 통해 작성해보도록 하자. JpaRepository는 인터페이 sjh..
Builder Pattern Builder 패턴은 객체 생성 과정을 분리하여 복잡한 객체를 단순화하는 디자인 패턴이다. 이 패턴은 객체의 생성과 표현을 분리하여, 서로 다른 방식으로 객체를 만들 수 있게 한다. 특히 매개변수가 많고 다양한 조합이 가능한 경우에 효과적이다. Product : Builder 패턴을 통해 생성되는 복잡한 객체Builder : 객체를 생성하기 위한 메서드를 정의하는 인터페이스Concrete Builder : Builder 인터페이스를 구현하여 실제로 객체를 생성하는 클래스Director : Builder 패턴을 사용하는 클라이언트 Builder 패턴 예시 public class NutritionFacts { private final int servingSize; ..
이전 포스팅에서 기본적인 QueryDSL의 검색 쿼리 문법에 대해서 살펴보았었다. 이번 포스팅에서는 연관된 다른 릴레이션과의 연산을 수행하는 Join과 Subquery 방법에 대해서 알아보도록 하겠다. 아래 포스팅은 QueryDSL의 기본 검색에 대한 문법을 정리해 둔 것이니 참고하면 좋을 것 같다. https://sjh9708.tistory.com/175 [Spring Boot/JPA] QueryDSL 문법(1) : 기본 검색 (선택, 조건, 정렬, 집계, 그룹화) 이전 포스팅에서 QueryDSL 사용을 Repository에서 할 수 있도록 설정하는 방법에 대해서 다루어 보았었다. 이제 실제로 자주 사용되는 SQL문을 QueryDSL을 통해 작성해보도록 하자. JpaRepository는 인터페이 sjh..
사용 데이터 Subquery (서브쿼리) SQL문 안에서 또 다른 SQL문을 사용하는 방법을 의미한다.외부 쿼리의 결과에 따라 조건을 동적으로 결정할 수 있다.서브쿼리를 통해 계산된 값을 사용하여 외부 쿼리를 수행할 수 있다.서브쿼리를 사용하여 특정 그룹에 대한 집계 함수를 계산하고 결과를 외부 쿼리에 사용할 수 있다. 단일 행을 반환하는 서브쿼리 서브쿼리가 한 개의 행을 반환하는 경우 일반적으로 비교 연산자와 함께 사용되어 외부 쿼리와 비교하거나 해당 행을 그대로 사용하기도 한다. Select 절에서 서브쿼리 사용 책 이름과 판매량을 구하시오select bookname, (select count(*) from orders where bookid = B.bookid) as salesCountf..
사용 데이터 NATURAL JOIN 두 테이블 간에 동일한 이름을 가진 열을 기준으로 조인하는 방식NATURAL JOIN은 특별한 조인 조건이 필요하지 않으며, 동일한 이름을 가진 모든 열을 기준으로 조인한다.동일한 이름의 모든 열에 대해 Join하기 때문에 의도치 않은 결과가 나올 수 있다. 이 때에는 Natural Join보다 JOIN ON을 통해 조건을 명시적으로 지정하는 것이 좋다. select *from TABLE1natural join TABLE2; Join ExpressionInner Join, Left Join 등의 Join Expression은 Natural Join과 달리 자동으로 같은 행 이름을 기반으로 조인하지 않는다.ON문을 통해서 명시적인 조인 조건을 제공해야 한다. s..
이전 포스팅에서 QueryDSL 사용을 Repository에서 할 수 있도록 설정하는 방법에 대해서 다루어 보았었다. 이제 실제로 자주 사용되는 SQL문을 QueryDSL을 통해 작성해보도록 하자. JpaRepository는 인터페이스 단에서 기본적인 쿼리를 제공해주지만 동적이고 복잡한 쿼리를 작성이 필요할 때에 QueryDSL 사용을 하는 것이 유리할 수 있다. 아래 포스팅은 Spring Boot 3점대 이상에서 QueryDSL을 설정하고, Repository에서 사용하는 방법을 정리한 글이니 만약 설정방법을 알고 싶다면 참조하면 좋을 것 같다. https://sjh9708.tistory.com/174 [Spring Boot/JPA] QueryDSL 설정과 Repository에서의 사용 이번 포스팅에서..
이번 포스팅에서는 Spring Boot에서 이전에 사용했던 JPQL와 JpaRepository 보다 조금 더 객체지향스럽고 유동적인 동적 쿼리를 작성할 수 있도록 QueryDSL 사용을 위한 설정을 해보도록 하자. QueryDSL에 사용에 대한 견해를 미리 말해보자면 유연한 쿼리 작성과 안정적인 코드를 작성하기 위해서 매우 유용할 것이라는 말을 하고 싶다. 개인적으로는 C# .NET 진영에서 사용했던 Entity Framework와 유사하게 Builder 패턴을 이용한 동적 쿼리 작성과 객체지향 코드라는 점이 유사하여 진입하기가 괜찮았기도 했다. 다른 진영의 객체지향 ORM을 사용해보았다면 적응하기 쉬울 것 같다. QueryDSL의 필요성 return em.createQuery("select a, co..