전체 글
[Redis] springboot + Redis cache(조회)
💡문득 똑같은 데이터를 페이지 호출 시 마다 DB에 접근해서 가져온다면, 성능 이슈가 있을 수 있지 않을까? 라는 생각이 들었다.(데이터 수가 많을 때) 그래서 In-memory 기반의 데이터베이스인 Redis를 사용해서 데이터를 저장하고 불러온다면 성능 개선을 할 수 있을 것 같았다. (TTL 설정을 통한 휘발성 데이터 저장) 또한, Springboot에서는 Redis와 연동하기 위한 library도 지원해주고, cache 기능도 지원한다고 한다. Springboot에서 Redis를 활용하여 cache 기능을 설계하기 위한 전략은 [Redis] 캐시 설계 전략 지침을 참고하자. 이제 아래를 통해 Spring boot에 Redis를 연동하고, cache도 사용해보도록 하자! 1. 레디스 연동하기(의존성 ..
[QueryDSL] N + 1 현상 해결 과정
문제점 poi_basic 테이블 만을 조회하려했는데, 아래와 같이 N + 1 현상이 일어나고 있었다. 현상황 poi_basic 테이블과 poi_facility 테이블은 OneToOne관계이다. Entity로 DB 조회 테이블 조회 코드 고찰 그렇다면 왜 OneToOne관계에서 N+1 문제가 생기는지 생각해보았다. 분명 양쪽 테이블에 지연로딩(Lazyloading)을 설정했었는데, 지연로딩이 제대로 적용되지 않았던 것이다. 자 그럼 왜 N+1이 발생하는지 알아보자. N+1이 발생하는 이유는 프록시 초기화가 일어났기 때문이다. 예를들어, 아래와 같은 테이블 연관관계가 있다고 하자. Q. [Order_Item]테이블을 조회하는데 [Order]테이블과 [Product]를 항상 함께 조회해야 하나? 답은 “No”..
[백준] 1563번: 개근상(Java)
Notion에 정리한 글을 옮긴 것입니다. 1563번: 개근상 백준중학교에서는 학기가 끝날 무렵에 출결사항을 보고 개근상을 줄 것인지 말 것인지 결정한다. 이 학교는 이상해서 학생들이 학교를 너무 자주 빠지기 때문에, 개근상을 주는 조건이 조금 독 www.acmicpc.net 문제 풀이 완전탐색을 이용해야하지만, 완전탐색만 사용한다면 경우의 수가 O(3^1000)의 시간복잡도가 발생한다. 그래서 재귀적 접근(DFS) + dp ⇒ dp의 bottom-up방식을 사용하여 풀었다. 이 문제의 핵심은 점화식을 찾는 것인데, 간단한 예를 통해 알아보자. 한 학기를 3일이라고 하자. 지각(late)는 2일 이상이면 안되고, 결석(absent)은 연속 3일 이상이면 안된다. dp[idx][late][absent] 3..
[알고리즘] 투포인터(Two Pointer) 알고리즘
투포인터 알고리즘 리스트나 배열에 순차적으로 접근해야 할 때, 두 개의 점의 위치를 기록하면서 처리하는 알고리즘 1. 원리 1. 시작점과 끝점이 첫번째 원소의 인덱스를 가르키도록 한다. 2. 목표값 보다 시작점 인덱스부터 끝점의 인덱스까지의 결과값이 작으면 끝점(end)를 1 증가시킨다. 3. 목표값 보다 시작점 인덱스부터 끝점의 인덱스까지의 결과값이 크거나 같으면 시작점(start)를 1 증가시킨다. 4. 모든 경우를 확인할 때가지 2~3번 과정을 반복한다. 2. 예제 예제를 통해 알아보자. 투포인터 알고리즘의 대표적인 문제인 특정한 합을 가지는 부분 연속 수열 찾기로 알아보자. 아래와 같은 수열이 있다. 여기서 연속되는 수의 합이 5 일때의 개수를 구해보자. 투포인터 알고리즘을 사용하면 다음과 같은 ..
[알고리즘] LCS(최장 공통 부분 수열) & LIS(가장 긴 증가하는 부분 수열)
1. LCS란? Longest Common Subsequence의 약자이며, 두 문자열을 비교할 때 공통적으로 나타나는 부분 순서들 중 가장 긴 것을 말한다. 예를 들어, 'ABCBDAB'와 'BDCABA'의 LCS를 구해보면 ABCBDAB BDCABA => 'BCBA'가 나오게 된다. 그리고 LCS는 최적화를 해야 하는 문제이기 때문에, 동적계획법(DP)를 사용하여야 가장 효율적으로 구할 수 있다. 1-1. 접근 방법 & 예시 두 문자열 'GCABCD' 그리고 'ABDCED'가 주어졌을 때, LCS를 구하는 진행과정은 다음과 같다. 위 그림에서 확인할 수 있듯이, {GCA}, {GCAB}, {GCABC}, {GCABCD}와 {A}를 비교하면 공통 수열이 1임을 알 수 있다. 위 그림은 {ABDCED} ..