전체 글 681

[QueryDSL] QueryDSL 동작원리(2) - 메타데이터 설정하기

[QueryDSL] QueryDSL 동작원리(1) - 빌더패턴 JPA에서 개발자가 원하는 엔티티를 얻으려면, JPQL을 작성하고 이를 EntityManager로 실행해야 한다. 이때 한 가지가 문제가 있는데, JPQL이 문자열이라는 점이다. JPQL이 문자열이기에 타입안정성 체크 lordofkangs.tistory.com 지난 포스팅에서 QueryDSL이 빌더패턴 구조로 이루어진 이유에 대해서 다루어 보았다 . 이번 포스팅에서는 빌더패턴이 어떤 방식으로 구현되어 있는지 알아보겠다. 개발자가 문자열로 JPQL을 작성하면 타입 안정성 체크가 어렵고 동적 쿼리 생성이 직관적이지 못하다. 이를 위해, QueryDSL은 JPQL 생성및실행 권한을 자신에게 위임하고 개발자는 JPQL 생성에 필요한 데이터 설정만 하..

Dev/JPA 2023.08.01

[PS] BOJ2250 트리의 높이와 너비 ( TreeTraversal ) with JAVA

https://www.acmicpc.net/problem/2250 2250번: 트리의 높이와 너비 첫째 줄에 노드의 개수를 나타내는 정수 N(1 ≤ N ≤ 10,000)이 주어진다. 다음 N개의 줄에는 각 줄마다 노드 번호와 해당 노드의 왼쪽 자식 노드와 오른쪽 자식 노드의 번호가 순서대로 주어진다. www.acmicpc.net ◎ 문제풀이 트리에서 너비가 가장 넓은 레벨과 레벨의 너비를 구하는 문제이다. 위 그림에 힌트가 있다. 세로축은 레벨을 의미한다. 가로축을 보면 좌측부터 노드의 번호가 매겨진다. 8번 노드는 1, 4번 노드는 2, 2번 노드는 3, 14번 노드는 4이다. 가로축을 이용하면 너비를 쉽게 구할 수 있다. 레벨2의 2번노드의 가로축 숫자는 3이고 3번 노드의 가로축 숫자는 15이다. ..

문제풀이 2023.08.01

[QueryDSL] QueryDSL 동작원리(1) - 빌더패턴

JPA에서 개발자가 원하는 엔티티를 얻으려면, JPQL을 작성하고 EntityManager에 전달하여 실행하면 된다. 여기서 한 가지가 문제가 있는데, JPQL이 문자열이라는 점이다. JPQL이 문자열이기에 타입안정성 체크도 어렵고 동적쿼리 작성도 직관적이지 못하다. 이런 문제를 해결하기 위해, QueryDSL 프레임워크를 사용한다. 개발자가 직접 JPQL을 작성하지 않고 QueryDSL에게 요청하는 방식이다. 개발자는 QueryDSL이 제공하는 스펙에 따라 JPQL 데이터를 세팅하면 된다. QueryDSL의 프로세스는 개발자가 세팅한 데이터를 토대로 JPQL을 생성하고 EntityManager로 쿼리를 실행하여 결과를 반환한다. 이로써 개발자는 데이터 세팅에만 관여하고, JPQL 생성은 QueryDSL..

Dev/JPA 2023.07.28

[OOP] 빌더 패턴 ( Builder Pattern )

디자인 패턴이란? 객체지향설계 과정에서 발생하는 문제들을 해결하기 위한 패턴(Pattern) 문제 상황 필드변수가 많은 객체는 상황에 따라 세팅이 필요한 변수도 있고 필요하지 않은 변수도 있다. 그러므로 필드변수가 많은 객체는 여러 상황을 지원할 수 있도록 유연한 데이터 세팅이 필요하다. 예를 들어, 문장 객체를 생각해보자. 문장 하나가 만들어지는 데에는 많은 요소가 필요하다. 1. 주어 ( 명사 ) 2. 서술어 ( 동사 ) 3. 목적어 ( 명사 ) 4. 수식어 ( 부사, 형용사 ) 등등 문장은 다양한 형태가 있기에 각 요소가 필요할 수도, 필요 없을 수도 있다. 그러므로 문장 객체는 최대한 유연하게 데이터를 세팅해야 한다. 그러나 기존의 생성자, 수정자 방식의 데이터 세팅은 유연함과는 거리가 멀다. 생..

Dev/OOP 2023.07.27

[PS] BOJ1744 수묶기 ( Greedy ) with JAVA

1744번: 수 묶기 길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에 www.acmicpc.net ◎ 문제풀이 수열의 수는 음수 , 0, 양수가 가능하고 두개의 수를 묶어 곱한 뒤 합하는게 가능하다. 이때의 최대값을 구하는 문제이다. 합이 최대가 나오려면 음수와 양수는 분리되어야 한다. 음수와 양수의 곱은 음수가 나오기 때문이다. - 음수인 경우 1) 절대값이 큰값끼리 곱해야 한다. 2) 곱할 음수가 없는 음수는 0과 곱하여 상쇄되어야 한다. 3) 0도 없으면 그대로 음수를 합해야 한다. - 양수인 경우 1) 절대값이 큰값끼리 곱해야 한다. 2) 1은 곱셈..

문제풀이 2023.07.27

[QueryDSL] QueryDSL 설정하기 ( SpringBoot 2.6이상, SpringBoot 3.x )

QueryDSL 설정은 쉽지않다. 인프런 김영한 강사님의 QueryDSL 강의를 수강하고 있는 학생이라면 QueryDSL 설정에 어려움을 겪고 있을 것이라 예상된다. 아무래도 강사님이 사용하는 버전이 SpringBoot 2.2.2 버전과 QueryDSL 4.4.0 버전을 사용하고 있기에 그렇다. 현재 https://start.spring.io/ 에서 제공하는 SpringBoot 버전은 2.6 이상이거나 3.x 버전이다. - 스프링 부트 3.x 버전 - 스프링 부트 2.6 이상 버전 SpringBoot 2.6 이상, 3.x 버전 모두 QueryDSL 5.0.0 버전에 의존한다. 게다가 3.x 버전의 경우, 지원하는 패키지명이 javax에서 jakarta로 변경되었다. 이런 저런 이유로 현재 인터넷상에는 Q..

Dev/JPA 2023.07.26

[PS] BOJ10815 숫자카드 ( BinarySearch ) with JAVA

10815번: 숫자 카드 첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10, www.acmicpc.net ◎ 문제풀이 N개의 수열에 M개의 수들이 포함되어 있는지를 탐색하려고 한다. N과M은 최대 500,000으로 이중for을 이용한 탐색은 시간복잡도가 O(NM)으로 시간초과가 발생한다. 그러므로 시간복잡도를 O(MlogN)으로 줄일 수 있는 이분탐색을 해야 한다. ◎ 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;..

문제풀이 2023.07.26

[PS] BOJ16929 Two Dots ( DFS ) with JAVA

16929번: Two Dots 첫째 줄에 게임판의 크기 N, M이 주어진다. 둘째 줄부터 N개의 줄에 게임판의 상태가 주어진다. 게임판은 모두 점으로 가득차 있고, 게임판의 상태는 점의 색을 의미한다. 점의 색은 알파벳 대문 www.acmicpc.net ◎ 문제풀이 행렬그래프가 주어지고 싸이클을 찾는 문제이다. 이는 DFS로 접근하면 된다. ◎ 코드 package org.example.dfs; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; //BOJ16929 Two Dots public class Dfs1 { static in..

문제풀이 2023.07.26

[PS] BOJ1753 최단경로 ( ShortestPath ) with JAVA

1753번: 최단경로 첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가 www.acmicpc.net ◎ 문제풀이 노드와 노드를 이동하는데 최단거리를 구하는 문제이다. 비용이 동일하면 BFS 알고리즘이 적절하지만 노드와 노드 사이의 비용이 상이하므로 최단경로를 구하는 알고리즘을 사용해야 한다. 특정한 시작점이 주어지고 모든 간선의 비용이 양수라면 다익스트라 알고리즘으로 최단경로를 계산한다. [Algorithm] 다익스트라 알고리즘(Dijkstra)이란? 다익스트라 알고리즘(Dijkstra) 다익스트라 알고리즘은 특정지점에서 ..

문제풀이 2023.07.25

[PS] BOJ2156 포도주 시식 ( DP ) with JAVA,Python

2156번: 포도주 시식효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규www.acmicpc.net ◎ 문제풀이 일렬로 나열된 와인을 마실 때, 최대 비용으로 마시는 경우를 구하는 문제이다. 단, 연속으로 3잔을 마시지 못한다.  와인의 모든 경우를 따져서 최대 비용을 구하는 문제이니 메모리제이션을 활용한 DP로 풀어주는 것이 좋다. DP로 풀려면 점화식을 구해야 한다.     와인 3잔이 있다. 와인은 마시거나 안 마시거나 2가지 경우를 선택할 수 있다. 그럼 총 8가지 경우의 수가 나온다. 1) O O O2) O O X3) O X O4) X O O5) X X O..

문제풀이 2023.07.24