목록분류 전체보기 (279)
HwangHub
엔티티를 조회할 때, 컬렉션 필드의 경우 LAZY Loading을 피하겠다는 의도로 JOIN FETCH를 하면 데이터가 뻥튀기되는 문제가 발생한다. 또한 페이징을 수행하는 것이 (거의) 불가능하다는 것이 문제였다. 이를 해결하기 위해서는 LAZY Loading을 그냥 적용하되, 한 번에 일정 사이즈를 fetch하는 것(==batch)으로 하면 해결된다. 단, XToOne 관계 필드는 JOIN FETCH하여도 문제가 발생하지 않으므로, 가급적 XToOne 필드에 대해서는 JOIN FETCH를 적용하는 것을 적극 권장한다. /** * V3.1 엔티티를 조회해서 DTO로 변환 페이징 고려 * - ToOne 관계만 우선 모두 페치 조인으로 최적화 * - 컬렉션 관계는 hibernate.default_batch_..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cPeGun/btslw7rZd2B/aRl7AyHJstt83PyTsAWKf1/img.png)
장점 만약 어떤 엔티티의 dto를 조회한다고 했을 때, 해당 엔티티의 필드 중 어떤 엔티티가 컬렉션으로 연관관계가 묶여 있을 경우 이 조회 기능에 fetch join을 사용하지 않고 dto로 변환하고자 한다면, 이 과정에서 LAZY인 연관관계를 조회하기 위해 무수히 많은 쿼리문이 발생할 것이다. (1+N 이슈) @GetMapping("/api/v2/orders") public List ordersV2() { List orders = orderRepository.findAll(); List result = orders.stream() .map(o -> new OrderDto(o)) .collect(toList()); return result; } public List findAll() { return em..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/rbsDa/btslDE2vtb7/Vtj0FAAbN6AKV023NykOX0/img.png)
SSH Secure Shell (Protocol)의 줄임말로, 두 컴퓨터 간 통신을 할 수 있게 해주는 하나의 프로토콜입니다. 우리들은 이미 HTTP, HTTPS 등의 프로토콜을 사용하여 다른 컴퓨터에 요청을 보내고 받는 작업을 수없이 하고 있죠. 서로 다른 컴퓨터 간 웹 페이지를 요청하고 받기 위해 브라우저를 사용하여 통신할 때 HTTP 또는 HTTPS를 사용하듯이, 데이터 전송과 원격 제어를 하기 위해 서로 다른 컴퓨터 간 shell을 통해 통신합니다. SSH 통신의 목적 데이터 전송 원격 제어 우리가 가장 일반적으로 마주할 수 있는 SSH 통신은 GitHub 등의 원격 레포지토리에 소스코드 파일을 push와 pull할 때 일어납니다. 또한 AWS와 같은 클라우드 서비스를 이용할 때 EC2와 같은 인..
1920번: 수 찾기 첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들 www.acmicpc.net 이 문제는 시간제한을 봤을 때, O(N^2)으로는 풀 수 없다. 즉, 일반적으로 우리가 떠올릴 수 있는 이중 반복문을 이용할 수 없다는 의미이다. 이렇게 시간복잡도를 고려할 때, 일반적으로 좋은 성능을 보여주는 것이 이진 탐색이다. public class B1920 { static int n, m; static int[] arr; static int[] ans; public static void main(Strin..
2178번: 미로 탐색 첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다. www.acmicpc.net 최단 기간의 경로를 구하고 있으므로 BFS가 적절한 선택일 것이다. public class B2178 { static int[] dx = {0, 1, 0, -1}; static int[] dy = {1, 0, -1, 0}; static boolean [][] visited; static int[][] arr; static int n, m; public static void main(String[] args) throws IOException { BufferedReader br = new Buf..
원래는 파이썬으로 알고리즘을 공부해왔지만, 자바로 언어를 바꿔야 할 것 같아서 풀었던 문제를 언어를 바꿔 다시 풀어보았습니다. 11724번: 연결 요소의 개수 첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주 www.acmicpc.net public class B11724 { static boolean visited[]; static ArrayList[] arr; public static void main(String[] args) throws IOException { BufferedReader br = new..
11921번: 0.1 첫째 줄에 수의 개수 N = 5,000,000 이 주어진다. 둘째 줄부터 N개의 줄에는 자연수가 한 줄에 하나씩 주어진다. 입력으로 주어지는 자연수는 10,000,000보다 작거나 같은 자연수이다. www.acmicpc.net 만점을 받을 수 없다고 한다. (정말 아주 간혹 자바로 풀 수 없는 문제가 있는 거라고 한다.)
1446번: 지름길 문제 해석 위 문제는 DP로 푸는 게 더 일반적인 것으로 보이는데, 다익스트라를 학습하는 단계라서 다익스트라로 풀어 보았다. 지름길 루트는 그래프에 정의해두면 될 것 같고, 모든 거리는 distance 리스트에 저장하면 될 것이다. 또한, 걸어가는 경우를 고려해야 하는데, 해당 케이스 또한 +1을 이용하여 그래프에서 뽑는 것 처럼 적용하면 된다. 풀이 코드 import heapq import sys # 입력 받기 n, d = map(int, input().split()) graph = [[] for _ in range(d+1)] INF = int(1e9) distance = [INF] * (d+1) # 간선 정보 입력 받기 for _ in range(n): start, end, cos..
1753번: 최단경로 첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가 www.acmicpc.net 문제 해석 위 문제는 전형적인 다익스트라 문제이다. 시작점을 지정하고, 유향 그래프에서 최단 경로를 찾는 문제이니, 다익스트라 정의를 공부하는 문제라고 봐도 무방하다. 풀이 코드 import sys input = sys.stdin.readline sys.setrecursionlimit(10**5) import heapq # 노드 개수 n, 엣지 갯수 m n, m = map(int,input().split()) # 시작 노드 ..
11724번: 연결 요소의 개수 첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주 www.acmicpc.net 로직 구성: 우선 각 노드의 연결 관계가 무향이므로 간단한 그래프 문제라고 판단하였다. 또한 한번의 순회로 연결된 모든 노드를 방문, 그 이후 다른 노드에서 출발할 때 들르지 않은 노드가 있다는 건 별개로 연결된 그래프임을 이용하여 이를 count하였다. 특이점: 평소에는 sys.setrecursionlimit() 에 들어가는 값을 10**6 정도로 넉넉하게 설정해 왔다. 하지만 이와 같이 설정하면 메..