모든 글 202

[JPA] API 개발과 성능 최적화 2 (컬렉션 조회 시 성능 최적화)

컬렉션 조회 최적화엔티티 직접 노출@GetMapping("/api/v1/orders")public List orderV1(){ List all = orderRepository.findAllByString(new OrderSearch()); reuturn all;}현재 하이버네이트 버전 5를 bean으로 등록 시켜준 상황이어서 영속성 컨텍스트에 전부 객체가 들어와 있는 상태다. 추가적으로 양방향 관계는 다 @JsonIgnore을 다 만들어주어야 한다. 이 방법은 역시 저번에도 설명했던 것 처럼 엔티티를 직접 노출하기에 단점이 굉장히 많아,사용하면 안 된다. 엔티티를 Dto로 변환@GetMapping("/api/v2/orders")public List orderV2(){ List orders = ord..

spring/JPA 2024.08.10

백준 11724번 연결 요소의 개수 (java)

[Silver II] 연결 요소의 개수 - 11724문제 링크성능 요약메모리: 117132 KB, 시간: 468 ms분류그래프 이론, 그래프 탐색, 너비 우선 탐색, 깊이 우선 탐색제출 일자2024년 8월 9일 16:54:16문제 설명방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.입력첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.출력첫째 줄에 연결 요소의 개수를 출력한다.풀이연결 요소란 간선을 통해 이어진 노드들의 집합을 의미한..

[JAVA] Comparator 인터페이스의 이해

알고리즘을 공부하고, 백준에서 여러 문제들을 풀어보면서 Comparator를 통한 정렬을 많이 사용한다. 잘 알지도 못 하면서 그냥 쓰기만 하니 찝찝해서 이번 기회에 Comparator 인터페이스를 본격적으로 분해해 보려고 한다. Comparator 인터페이스 구성https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#method.summary Comparator (Java Platform SE 8 )Compares its two arguments for order. Returns a negative integer, zero, or a positive integer as the first argument is less than, equal..

Language/Java 2024.08.09

[JPA] API 개발과 성능 최적화 1 (지연 로딩과 조회 성능 최적화)

API를 개발하는 여러가지 방법들과 성능을 최적화 시키는 법을 공부해 보겠다. 엔티티 직접 노출 방식 API @GetMapping("/api/v1/simple-orders") public List ordersV1(){ List all = orderRepository.findAllByString(new OrderSearch()); return all; }우선 위와 같이 엔티티를 그대로 노출하는 api를 하나 만들어 보았다. public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @Jo..

spring/JPA 2024.08.08

백준 1012번 유기농 배추 (java)

[Silver II] 유기농 배추 - 1012문제 링크성능 요약메모리: 16164 KB, 시간: 144 ms분류그래프 이론, 그래프 탐색, 너비 우선 탐색, 깊이 우선 탐색제출 일자2024년 8월 8일 18:30:49문제 설명차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 효과적인 배추흰지렁이를 구입하기로 결심한다. 이 지렁이는 배추근처에 서식하며 해충을 잡아 먹음으로써 배추를 보호한다. 특히, 어떤 배추에 배추흰지렁이가 한 마리라도 살고 있으면 이 지렁이는 인접한 다른 배추로 이동할 수 있어, 그 배추들 역시 해충으로부터 보호받을 수 있다. 한 배추의 상하좌우 네 방향에 ..

백준 1260번 DFS와 BFS (java)

[Silver II] DFS와 BFS - 1260문제 링크성능 요약메모리: 24380 KB, 시간: 284 ms분류그래프 이론, 그래프 탐색, 너비 우선 탐색, 깊이 우선 탐색제출 일자2024년 8월 8일 00:39:10문제 설명그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.입력첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 ..

WebRTC로 화상채팅 구현하기 1 (WebRTC와 용어 정리)

WebRTCwebRTC(Web Real-Time Communications)란, 웹 어플리케이션, Android, IOS 환경에서별도의 소프트웨어 없이 음성, 영상 미디어, 텍스트, 파일 같은 데이터를 피어끼리 주고받을 수 있게 만든오픈소스이다. 비디오, 영상 미디어 등의 데이터가 P2P 방식으로 전송되도록 지원한다. 문제점P2P 방식으로 데이터를 주고받기 위해서는 주고 받는 각 피어의 public IP를 알고 있어야 한다.그러나 public IP 주소는 NAT에 의해 계속 바뀌기 때문에 동일한 public IP로는 통신을 지속할 수 없다는 문제점이 발생한다. 이를 해결하기 위해 STUN 서버와 TURN 서버를 사용해야 한다. STUN SEVERSTUN(Session Traversal Utilities ..

[JPA] 객체 지향 쿼리 언어 JPQL 7 (엔티티 직접 사용, 네임드 쿼리, 벌크 연산)

엔티티 직접 사용 - 기본 키 값JPQL에서 엔티티를 직접 사용하면 SQL에서 해당 엔티티의 기본 키 값을 사용한다.[JPQL]select count(m.id) from Member m // 엔티티의 아이디를 사용select count(m) from Member m //엔티티를 직접 사용[SQL]select count(m.id) as cnt from Member m두 JPQL 다 동일한 SQL이 실행된다.엔티티를 파라미터로 사용해도 똑같이 엔티티는 기본 키 값으로 처리 된다. 엔티티가 데이터베이스에 전달되면 데이터베이스에서는 엔티티를 당연히 기본 식별자로 구분하므로,엔티티가 기본 키 값으로 처리되는 것이다. Named 쿼리 - 정적 쿼리미리 정의해서 이름을 부여해두고 사용하는 JPQL정적 쿼리어노테이션,..

spring/JPA 2024.08.07

백준 16956번 늑대와 양 (java)

[Silver III] 늑대와 양 - 16956문제 링크성능 요약메모리: 31292 KB, 시간: 296 ms분류애드 혹, 해 구성하기제출 일자2024년 8월 6일 23:25:20문제 설명크기가 R×C인 목장이 있고, 목장은 1×1 크기의 칸으로 나누어져 있다. 각각의 칸에는 비어있거나, 양 또는 늑대가 있다. 양은 이동하지 않고 위치를 지키고 있고, 늑대는 인접한 칸을 자유롭게 이동할 수 있다. 두 칸이 인접하다는 것은 두 칸이 변을 공유하는 경우이다.목장에 울타리를 설치해 늑대가 양이 있는 칸으로 갈 수 없게 하려고 한다. 늑대는 울타리가 있는 칸으로는 이동할 수 없다. 울타리를 설치해보자.입력첫째 줄에 목장의 크기 R, C가 주어진다.둘째 줄부터 R개의 줄에 목장의 상태가 주어진다. '.'는 빈 칸..

[JPA] 객체 지향 쿼리 언어 JPQL 6 (fetch join의 한계, 다형성 쿼리)

페치 조인의 한계페치 조인 대상에는 별칭을 줄 수 없다하이버네이트는 가능하나 가급적 사용하지 말 것별칭을 주고 select t from Team t join fetch t.members m where m.age > 10;과 같이 조회하게 되면 멤버의 전체를 가져오는 것이 아닌 멤버의 일부만 가져오게 된다.그러나 JPA는 fetch를 사용하면 모든 객체를 가져오는 것을 기본으로 설계가 돼있기 때문에어디서 예상치 못 한 오류가 발생할지 알 수 없다.둘 이상의 컬렉션은 페치 조인 할 수 없다ONE to MANY 상황에서 페치 조인하고 거기에 또 컬렉션을 페치 조인 하는 상황을 의미한다.ONE to MANY에서도 데이터가 뻥튀기가 되는데 거기에 컬렉션을 한 번 더 페치 조인 시키면데이터가 얼마나 뻥튀기 될 지 ..

spring/JPA 2024.08.06