전체 글 99

[Calenduck] 6초를 59ms로 줄인 Redis 캐싱 적용기

문제 상황이전 글에서 멀티스레드 + 배치 처리로 49초 → 6초까지 줄였음.근데 막상 서비스로 쓰려니까 6초도 느림.메인페이지 들어갈 때마다 6초 기다리는 건 사용자 경험상 문제가 있음.특히 새로고침할 때마다 6초씩 걸리면 답답함.근데 생각해보면:공연 정보가 초 단위로 바뀌는 게 아님하루에 한 번 정도 갱신해도 충분함같은 데이터를 매번 API 호출해서 가져오는 건 낭비캐싱을 적용하면 해결될 문제임.원인 분석왜 캐싱을 처음부터 안 했는가?처음 설계할 때 "KOPIS 데이터는 실시간으로 바뀔 수 있다"는 가정 때문에 캐싱을 피했음.근데 실제로 확인해보니:공연 정보가 하루에 여러 번 바뀌는 경우는 거의 없음대부분 신규 공연 등록, 종료 공연 삭제 정도기존 공연의 출연진이나 가격이 수시로 바뀌지 않음"실시간 최..

공모전 2026.02.08

[Calenduck] 메인페이지 로딩 49초를 6초로 줄인 과정

문제 상황메인페이지 API 만들고 Postman으로 테스트했는데 49초가 나옴.우리 서비스는 KOPIS(공연예술통합전산망) Open API에서 공연 정보를 가져오는 구조임.DB에는 공연 ID만 저장하고, 상세 정보(포스터, 출연진, 가격 등)는 매번 API로 조회함.메인페이지 요청 → DB에서 공연 ID 100개 조회 → 각 ID로 KOPIS API 호출 → 응답문제는 API 호출이 순차적으로 일어나고 있었음.for (String id : performanceIds) { // 1번 호출 → 응답 대기 → 2번 호출 → 응답 대기 → ... Elements element = callKopisApi(id); results.add(element);}KOPIS API 1회 호출에 약 0.5초.1..

공모전 2026.02.04

백준 14567번 선수과목

첫 출에 정점 수n과 간선수 m이 주어진다.그 아래 m개의 줄에 정점 시작 a와 끝 b가 주어지는데 b과목을 이수하기 전에 a과목을 먼저 들어야한다.예제 입력 2번을 예로 들자면,첫 번째 줄에 6개의 과목 수(정점 수)와 4개의 간선 쌍이 주어진다.아래는 입력값에 따라 1번부터 6번 과목까지 들어야하는 과목 수를 연결하고 소요되는 학기를 정리해봤다. 먼저 해당 문제는 유향 그래프로 a과목에서 b과목으로 이어진다.1번 과목을 듣기 위해서 1, 총 1개의 과목, 학기 필요. 과목을 듣기 위해서 1 > 2, 총 2개의 과목, 학기 필요. br>과목을 듣기 위해서 1 > 3, 총 2개의 과목, 학기 필요 과목을 듣기 위해서 4, 총 1개의 과목, 학기 필요 -> 4번 과목으로 이어진 다른 과목이 없기에 ..

자바 알고리즘 2025.09.18

백준 1260번 DFS와 BFS

먼저, BFS와 DFS에대한 개념을 트리 형식으로 그려보기만 하다보니 직접 코드로 어떻게 작성해야할지 헷갈리는 부분이 많았다. 이 문제는 두 가지 방법을 모두 적용해보면서 기초를 다질 수 있어서 개인적으로 좋은 문제라고 생각한다. 문제:정점 개수 N, 간선 개수 M, 탐색을 시작할 정점 번호 V 3개의 입력값과 각 간선을 연결하는 두 정점의 번호가 M개 만큼 주어졌을 때, DFS와 BFS가 차례대로 수행된 결과를 반환하는 문제이다. import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Arrays;import java.util.LinkedList;import jav..

자바 알고리즘 2025.09.03

[Java] 객체 생성과 싱글톤 패턴 - 왜 필요한가?

자바에서 객체를 생성하고 사용하는 기본적인 방법은 new 키워드를 사용한다. 근데 이대로도 괜찮은가 라는 생각이 있음 아래는 기본적으로 new 키워드로 객체 생성하는 코드이다. 객체 속성 정의 Car 클래스, 실행public class Car { String modelName; String color; public Car(String modelName, String color) { this.modelName = modelName; this.color = color; }}public class Main { public static void main(String[] args) { Car car1 = new Car("현대자동차1", "..

Java 2025.07.29

JDK, JRE, JVM 그게 뭔데

오늘은 JDK, JRE, JVM에 대해 정리해봤다자바 공부하다 보면 맨날 헷갈리는 단골 질문"JDK, JRE, JVM 이게 뭔데?"오늘은 이 셋의 관계랑, 바이트코드가 뭔지도 같이 정리해봤다. JDK (Java Development Kit) -> 범위가 가장 큰 놈이다.말 그대로 자바 개발 도구 모음 세트개발자가 작성한 소스코드를 .java로 만들고, .class로 컴파일하고, 디버깅하고 실행까지 다 해볼 수 있다.실제로 개발할 땐 이걸 설치해야 하고 JDK에 JRE, JVM 다 포함됨예) javac(컴파일러), jdb(디버거), jar(압축 툴) 등등 개발자 도구가 다 들어있음 JRE (Java Runtime Environment)개발 도구는 빠진 대신, 자바 프로그램을 실행할 수 있는 환경JRE는 ..

Java 2025.07.18

대칭키 vs 공개키(비대칭키) 암호화의 차이점

대칭키와 장단점 대칭키는 암호화와 복호화할 때 사용하는 키가 동일하다. 하나의 키를 사용하여 데이터를 암호화, 복호화 하는데 장단점으로는 아래와 같다. 공개키 암호화 방식과 비교했을 때 속도가 더 빠르다는 장점이 있다. 그러나 키를 직접 교환하는 방식이며, 하나의 키로 암복호화 하기에 해당 키가 탈취당했을 때 누구나 암호화된 데이터에 접근할 수 있다. 대칭키 암호화: 암호화와 복호와의 키가 같다. 용도: 데이터의 내용을 숨기기 위함 장점: 속도가 빠르다. 단점: 키가 유츌될 위험이 있어 보안 수준이 낮다. 공개키와 장단점 공개키는 암호화, 복호화할 때 사용하는 키가 다르다. 공개키를 사용하여 데이터를 암호화하고 개인키를 사용하여 복호화 하는데 장단점으로는 아래와 같다. 대칭키 암호화 방식과 비교했을 때 ..

TIL 2023.10.16

[프로그래머스 - Java/Stack] 짝지어 제거하기

1. 문제 입력받은 문자열 중 연속되는 2개의 문자가 있다면 제거하는 문제이다. 연속되는 문자가 없다면 0을 반환하고 연속되는 문자를 제거할 수 있다면 1 반환. 2. 의사코드 연속된 문자를 비교한다는 것을 보고 스택을 사용하여 문자 하나씩 추가하면서 비교하면 될 것 같았다. 1. 문자 하나씩 비교를 해야하기에 String이 아닌 Character 스택 생성 Stack stack = new Stack(); 2. 빈 스택에 첫 문자를 추가하고, 이후에 추가할 때마다 값을 비교 stack.push(s.charAt(0)); for(인덱스 1부터 문자열 s길이만큼){ stack의 값과 새로 추가할 문자를 비교하여 같다면 삭제, 다르다면 추가 } 3. 시도 import java.util.Stack; class S..

자바 알고리즘 2023.10.13

[MySQL] 임시 테이블을 생성하는 with

아래의 코드들은 온라인, 오프라인 매장을 갖고있는 쇼핑몰의 데이터를 예시로 진행한다. 온라인 오프라인 고객 모두 이름과 주소, 연락처를 갖고있다. 동일한 이름이 같은 지역에 존재해도 핸드폰 번호가 다르다면 다른 사람이다. 동일한 이름이 같은 번호를 가질 수 없다. 두 테이블의 동일 인물은 반포에사는 "박" 이름을 가진 사람이다. 1. OFF_LINE 테이블에 데이터 삽입 insert into `OFF_LINE` (offline_id, offline_name, offline_address, offline_phone) values (1, '정', '용산', '010-1234-1234'), (2, '김', '마포', '010-111..

MySQL 2023.10.06