개요 Read Through 전략은 메소드에 @Cacheable을 걸어서 자동으로 Redis에 캐싱을 하는 전략 입니다. 캐시 미들웨어가 직접 데이터 소스와 연동하여 캐시 누락시 자동으로 데이터를 로드 합니다. 즉, 자동화된 캐싱 전략이라 생각하면 될 거 같습니다. 이번에는 Read Through Cache를 기록하려 합니다. 흐름 API 요청 수신 캐시 확인 데이터가 존재할 경우 : 캐시된 값을 반환 데이터가 존재하지 않을 경우 : 캐시 미들웨어가 DB에서 데이터를 가져와 캐시에 저장한 후 값을 반환 전에 정리한 RedisTemplate, RedisHash를 이용해서 수동으로 Redis에 캐싱을 했습니다. 이러한 전략을 Cache-Aside 혹은 Lazy-Loading 이라 합니다. Read Throu..
문제 출저 https://www.acmicpc.net/problem/2665 2665번: 미로만들기 첫 줄에는 한 줄에 들어가는 방의 수 n(1 ≤ n ≤ 50)이 주어지고, 다음 n개의 줄의 각 줄마다 0과 1이 이루어진 길이가 n인 수열이 주어진다. 0은 검은 방, 1은 흰 방을 나타낸다. www.acmicpc.net 문제 풀이 (0,0) 지점에서 (n-1, n-1) 지점까지 이동하는데 0타일을 1타일로 바꾸는 갯수의 최소값을 구하는게 이 문제의 목표이다. (0,0) 을 시작으로 BFS 탐색을 진행했다. 이 때, int[][] count 라는 2차원 배열을 만들어 이 지점을 지날 때 타일의 바꾼 횟수의 최소값을 계속 갱신하게 했다. 즉, count 배열에 기존에 기록된 값이 작아야 탐색을 계속 할 수..
개요 Redis 학습 과정에서 RedisHash 말고도 RedisTemplate 방법이 있다는 것을 알았습니다. 프로젝트를 진행하면서 JPA로 MySQL과 매핑된 Product 클래스를 Redis에 저장해보고 싶었습니다. @RedisHash 랑 @Entity를 한 클래스에 동시에 사용하는 것은 가능은 하지만 두 개의 저장소에 동시에 매핑됨으로 복잡하고 에노테이션 충돌이 발생할 수도 있고 불안한 점이 많았습니다. 이 때 RedisTemplate을 학습하고 적용했습니다. RedisTemplate RedisTemplate는 Spring Data Redis에서 제공하는 핵심 클래스로 Redis 연산을 수행하기 위한 기본적인 템플릿을 제공합니다. RedisTemplate을 원하는 대로 커스텀하여 Spring Bo..
개요 Redis는 인메모리 저장소 Key : Value 형태로 저장되며 캐시 서버로 자주 사용되며 성능 향상, 분산 처리 등 여러 방면에서 도움을 줍니다. Spring Boot와 Redis를 연결하여 객체를 Redis를 저장하고 조회하는 작업을 정리해보려 합니다. 작업 순서 1. build.gradle 파일에 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-data-redis' 2. application.yml 파일에 Redis 연결 정보 추가 spring: redis: host: localhost port: 6379 3. Redis와 연결할 객체 생성 package com.dotd.product.redis.entity; impor..
문제 출저 https://www.acmicpc.net/problem/14938 14938번: 서강그라운드 예은이는 요즘 가장 인기가 있는 게임 서강그라운드를 즐기고 있다. 서강그라운드는 여러 지역중 하나의 지역에 낙하산을 타고 낙하하여, 그 지역에 떨어져 있는 아이템들을 이용해 서바이벌을 www.acmicpc.net 문제 풀이 한 지점에서 허용 범위(m) 이내에서 가장 많은 아이템을 얻을 수 있는지를 구하는 문제였다. 이 문제를 풀기 위해 다익스트라 알고리즘을 활용했다. BFS로 노드를 탐색하지만 visited로 방문 체크를 하여 한 번만 방문하는게 아니라 여러 번 방문해도 이전에 방문한 것 보다 더 적은 비용으로 방문하면 계속 탐색을 이어나가는 것 이다. 이러한 탐색 과정을 모든 정점에서 시행하였고 가..
문제 출저 https://www.acmicpc.net/problem/1991 1991번: 트리 순회 첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파 www.acmicpc.net 문제 풀이 트리가 주어지고 이 트리의 전위 순회, 중위 순회, 후위 순회 했을 때 결과를 출력하는게 이 문제의 요구 사항이다. 트리를 저장하기 위해 Node라는 클래스를 만들어 left, right를 저장했다. 이 노드의 연결 정보는 Map nodeMap 형태로 저장했다. 순회를 구하는 방법은 재귀 함수를 사용했다. 재귀 함수로 노드를 이동하고 적절한 시기에 StringBui..
문제 출저 https://www.acmicpc.net/problem/16932 16932번: 모양 만들기 N×M인 배열에서 모양을 찾으려고 한다. 배열의 각 칸에는 0과 1 중의 하나가 들어있다. 두 칸이 서로 변을 공유할때, 두 칸을 인접하다고 한다. 1이 들어 있는 인접한 칸끼리 연결했을 때, 각각의 www.acmicpc.net 문제 풀이 0과 1이 주어진 숫자판에서 0을 1로 바꿨을 때 1이 이어진 가장 큰 넓이가 무엇인지 구하는게 이 문제의 요구사항이다. 숫자판을 입력 받을 때 0을 저장하는 zeroQue를 만든다. 또한 1이 이어진 영역의 넓이를 구하기 위해 BFS를 사용한다. 이 때 인덱스를 부여하여 탐사간 마친 1의 영역은 인덱스 번호로 바꾼다. Map areaMap을 만들어 인덱스에 따른 ..
개요 이번에는 Spring Batch에서 작업의 흐름을 설정할 때 사용하는 Flow, Split을 학습하고 프로젝트에 적용해 보겠습니다. Flow Flow는 Spring Batch에서 작업 흐름을 정하는데 사용됩니다. 작업의 단계인 Step을 그룹화하여 복잡한 작업 흐름을 생성할 수 있습니다. Flow는 Step을 순차적으로 실행되게 하며 필요한 경우 조건부로 실행 흐름을 제어 할 수 있습니다. 예를 들어, 작업이 실패한 경우 다른 단계로 이동하게 하거나 특정 조건이 충족되면 다음 단계를 실행하게 하는 등 여러 조거분 실행 흐름을 있습니다. Flow 예시 @Bean public Flow userUpdateFlow() { return new FlowBuilder("userUpdateFlow") .start..
문제 출저 https://www.acmicpc.net/problem/11404 11404번: 플로이드 첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 www.acmicpc.net 문제 풀이 도시의 갯수 n이 주어지고 도시에서 도시로 이동하는 경로와 비용을 제공하는 정보가 m개 주어진다. 이 때, 모든 도시에서 다른 도시로 가는 비용의 최솟값을 구하는게 이 문제의 목적이다. 시작 도시를 넣으면 시작 도시에서 다른 도시로 가는 최소 비용을 구하는 함수인 search를 만들었다. search는 BFS를 이용하여 탐색을 진행했고 answer 배열에 최소 비용을 기입했다..
문제 출저 https://www.acmicpc.net/problem/13549 13549번: 숨바꼭질 3 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 www.acmicpc.net 문제 풀이 수빈이의 위치에서 동생까지 가는 시간을 구하는게 이 문제의 목표이다. 수빈이는 1초 후에 현재 위치에서 +1, -1 가거나 0초 후에 현재 위치*2인 위치로 이동할 수 있다. 범위는 0, 100000이므로 십만개의 칸을 가진 int 배열을 생성하고 해당 위치에 몇 초 후에 도착하는지를 저장한다. BFS로 시작 위치 n을 시작으로 탐색을 진..
Index란? MySQL에 Index란 DB에 성능을 향상시키기 위한 데이터 구조 입니다. Index는 DB 테이블 내의 특정 열(컬럼, 필드)에 대한 검색과 정렬을 빠르게 수행하기 위한 자료구조 입니다. Index는 데이터 검색 속도 향상, 정렬, 중복 제거 등의 용도로 사용되며 기본키 인덱스, 유니크 인덱스, 인덱스, 외래 키 인덱스 등의 종류가 있습니다. 저는 테이블의 특정 열에 대한 일반적인 Index를 적용해보려 합니다. Index는 데이터의 종류가 많은 열에 사용하면 더욱 큰 성능 향상 효과를 볼 수 있습니다. Index 사용하기 MySQL에서 Index를 적용하여 조회 성능 향상시켜 보겠습니다. 성능 측정은 Spring Boot에서 진행했고 JPA를 활용했습니다. 저의 프로젝트 구성은 다음과..
Test Code 란? 테스트 코드란 개발자들이 작성한 코드나 비즈니스 로직 자체를 테스트 하기 위한 코드 입니다. 테스트 코드를 사용하는 이유는 다양합니다. 개발 과정에서 문제를 미리 발견할 수 있다. 리팩토링 리스크가 줄어든다. 애플리케이션을 가동해서 직접 테스트 하는 것보다 테스트를 빠르게 진행할 수 있다. 하나의 명세 문서로 기능을 수행한다. 리팩토링 리스크가 줄어든다. 리팩토링 과정에서 새로운 코드가 추가되면 그 코드와 연관된 코드에게 영향을 줍니다. 테스트 코드가 없다면 수시로 확인해야 하지만 테스트 코드가 있다면 혹시 모를 부작용에 대비할 수 있습니다. Test Code 활용 테스트 코드를 활용하기 위한 순서는 다음과 같습니다. 의존성 추가 파일 생성 테스트 코드 작성 1. 의존성 추가 테스..