분류 전체보기 378

[Spring] N+1 문제를 해결하기 위한 방안 (fetch join, @EntityGraph)

코드를 보면서 N+1 문제와 이를 해결하기 위한 방안에 대해서 설명드리겠습니다. @Test public void findMemberLazy() throws Exception { //given //member1 -> teamA //member2 -> teamB Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamRepository.save(teamA); teamRepository.save(teamB); memberRepository.save(new Member("member1", 10, teamA)); memberRepository.save(new Member("member2", 20, teamB)); em.flush(); em.clea..

Java/Spring 2023.03.18

[Spring] Spring Data JPA Paging, Sort 기능

Spring Data JPA는 기본적으로 페이징 기능과 정렬 기능을 제공하고 있습니다. 이들을 사용하기 위해서는 Pageable, Sort 객체가 필요합니다. org.springframework.data.domain.Sort : 정렬 기능 org.springframework.data.domain.Pageable : 페이징 기능 (내부에 Sort 포함) Pageable 객체에는 페이지 번호, 페이지 크기, 정렬 정보를 가지고 있습니다. @GetMapping("/users") public ResponseEntity getUsers( @RequestParam(defaultValue = "0") Integer pageNo, @RequestParam(defaultValue = "10") Integer pageSi..

Java/Spring 2023.03.18

[Spring] Spring Data JPA 공통 인터페이스

구조적으로 JpaRepository는 공통 CRUD기능을 제공하고 있습니다. 그래서 생성한 Repository 인터페이스를 통해 기본적인 CRUD 기능을 구현하지 않아도 사용할 수 있습니다. 이제 공통 인터페이스에 대해 알아보겠습니다. JpaRepository 공통 기능 인터페이스 public interface JpaRepository extends PagingAndSortingRepository JpaRepository를 사용하는 인터페이스 public interface MemberRepository extends JpaRepository { } @Repository 어노테이션을 생략할 수 있는 이유는 Spring Data JPA가 자동으로 컴포넌트 스캔을 처리하고, JPA 관련 예외도 처리해 주기 때..

Java/Spring 2023.03.18

[Spring] Querydsl

Queryds이란 무엇인가? 백엔드 기술은 주로 스프링 부트, 스프링 데이터 JPA를 조합해서 사용합니다. 하지만, 이러한 기술들로도 해결하지 못한 문제들이 있습니다. 바로 복잡한 쿼리, 동적 쿼리와 같은 문제들을 해결할 수 없습니다. 이러한 문제들을 손쉽게 해결할 수 있는 기술이 Querydsl입니다. Querydsl은 HQL(Hibernate Query Language) 쿼리를 안전하게 생성 및 관리해 주는 프레임워크입니다. 또한 쿼리를 자바 언어의 한계를 넘어서 자바 코드로 작성함과 더불어, 문법 오류를 컴파일 시점에 시점에 잡아줍니다. 문법이 SQL과 유사하기에 쉽게 학습할 수 있고, 복잡한 쿼리도 손쉽게 작성할 수 있게 됩니다. JPQL과의 차이를 통해 장점을 설명드리겠습니다. @Test pub..

Java/Spring 2023.03.12

[Java] 객체지향 사실과 오해 1- 협력하는 객체들의 공동체

"객체지향이란 무엇인가?"라는 질문에 뭐라고 답할 것인가? "실세계를 직접적이고 직관적으로 모델링할 수 있는 패러다임"입니다. 객체지향 프로그래밍이란 실제로 존재하는 사물을 최대한 유사하게 모방해 소프트웨어 내부로 옮겨오는 작업이기 때문에, 객체지향 소프트웨어는 실세계의 투영이며, 객체란 현실 세계에 존재하는 사물에 대한 추상화입니다. 이러한 관점을 잘못됐고, 정작 실세계의 모방이라는 개념이 저도 납득이 잘 가지 않았습니다. 왜냐하면 예시를 들어 붕어빵을 제조하는 과정을 객체지향에 빗대어 설명하는데, 저희가 애플리케이션을 개발할 때 붕어빵을 만들진 않기 때문입니다. 그냥 객체지향을 쉽게 이해하기 위한 방안입니다. 또한 객체지향의 목표는 실세계의 모방이 아닌, 실세계의 창조입니다. 시대가 계속 바뀌면서, ..

Java/Java Concept 2023.03.10

[Spring] OSIV[Open Session In View]를 적절히 사용하여 성능 최적화

OSIV란 무엇인가? 하이버네이트에서 Open Session In View라고 불렀고, 향후 JPA가 생기고 나서는 Open EntityManager In View라고 불렀습니다. 관례상 OSIV라고 합니다. OSIV는 하이버네이트를 뷰까지 열어두는 기능입니다. spring.jpa.open-in-view : true(기본 값) 다음과 같이 애플리케이션을 시작 시점에 warn로그를 뿌립니다. 이제 그 이유에 대해서 알아보겠습니다. OSIV 전략은 최초 데이터베이스 연결 시작 시점부터 API 응답이 끝나기 전 까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지하게 됩니다. 그래서 View 템플릿이나 API 컨트롤러에서 지연로딩이 가능해왔습니다. (지연 로딩(LAZY)가 가능하려면 영속성 컨텍스트가 살아 있어야..

Java/Spring 2023.03.08

[Spring] 변경 감지(Dirty checking)와 병합(merge)

JPA에서 변경 감지와 병합 두 가지 요소를 알기 전에 준영속 엔티티를 알고 있어야 합니다. 준영속 엔티티에 대해 설명드리겠습니다. 준영속 엔티티란 영속성 컨텍스트가 더 이상 관리하지 않은 엔티티입니다. @PostMapping("items/{itemId}/edit") public String updateItem(@PathVariable String itemId, @ModelAttribute("form") BookForm form) { Book book = new Book(); book.setId(form.getId()); book.setName(form.getName()); book.setPrice(form.getPrice()); book.setStockQuantity(form.getStockQuanti..

Java/Spring 2023.03.08

다익스트라(Dijkstra) 최단 경로 알고리즘

다익스트라 알고리즘이란 무엇인가? 음의 가중치가 없는 그래프의 한 정점(V)에서 모든 정점까지의 최단거리를 각각 구하는 알고리즘입니다. 기존에는 O(V^2)의 시간복잡도를 가졌으나, 시간이 지나 우선순위 큐를 이용하여 더욱 개선된 알고리즘이 생겨났으며 O((V+E)logV)(V : 정점의 개수, E : 간선의 개수)의 시간 복잡도를 가질 수 있게 되었습니다. O(VlogV)(각 노드마다 미방문 노드 중 출발점으로 현재까지 계산된 최단 거리를 가지는 노드를 찾는데 걸리는 시간) + O(ElogV) (각 노드마다 이웃한 노드의 최단거리를 갱신할 때 걸리는 시간)으로 보시면 될 것 같습니다. 출처 : https://namu.wiki/w/%EB%8B%A4%EC%9D%B5%EC%8A%A4%ED%8A%B8%EB%9..

최소 신장 트리(Minimum Spanning Tree), 크루스칼(Kruskal) 알고리즘, 프림(Prim) 알고리즘

신장 트리 그래프에서 모든 노드를 포함하면서 사이클이 존재하지 않는 부분 그래프를 의미 트리의 조건 : 모든 노드가 포함되어 서로 연결되면서 사이클이 존재하지 않아야 함 사이클(cycle)이란 ? 그래프에서 시작 노드에서 출발해서 다른 노드를 거쳐 다시 시작 노드로 돌아갈 수 있는 경로가 존재한다면, 이는 하나의 사이클이 됩니다. 최소 신장 트리 최소한의 비용으로 신장 트리를 찾기 위한 방법 1, 2, 3번 지역에 도로를 2개 놓아 전체 지역을 연결시키도록 하는 경우에서는 1->2, 2->3을 연결하는 것이 가장 저렴하게 연결할 수 있는 방법입니다. 즉, 최소 신장 트리는 말 그대로 최소한의 비용(가중치의 합이 최소==간선의 비용)으로 신장 트리를 찾아내는 알고리즘이고, 그리디 알고리즘으로 분류됩니다. ..

백준 1806 부분합(c++)

https://www.acmicpc.net/problem/1806 1806번: 부분합 첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다. www.acmicpc.net 두 개의 포인터를 이용해서 원하는 값을 추출하는 투 포인터 알고리즘 문제 입니다. 연속된 수들의 부분합 중에서 합이 S이상이 되는 것들 중에서 수열의 최소 길이를 구해야 합니다. 테스트 케이스를 예시로 설명 드리겠습니다. 10 15 5 1 3 5 10 7 4 9 2 8 start, end 변수를 두어 이를 조작하여 원하는 수열의 최소 길이를 구해야 합니다. sum(부분합) < S(원..