스레드 & 부하 테스트 — 스레드 4개의 한계와 k6 검증

이 프로젝트는 스레드가 4개로 제한된 환경에서 돌아간다. 이 제약이 프로젝트 전체의 설계에 영향을 줬다. 세마포어 permit을 4로 잡은 것도, 트랜잭션을 쪼갠 것도, Rate Limiter를 건 것도 결국 이 4개라는 제약에서 출발한 거다.그런데 "스레드 4개"라는

2026년 2월 8일
·
0개의 댓글
·

외부 API 연동 패턴 — 타임아웃, 재시도, 서킷 브레이커

이 프로젝트에서 LLM은 외부 API다. 내가 제어할 수 없는 영역이다. 언제 응답이 올지, 얼마나 걸릴지, 실패할지 성공할지 모두 내 손 밖이다.세마포어와 Rate Limiter로 RPM 초과를 막고, 트랜잭션을 쪼개서 커넥션 점유 시간을 줄였다. 그런데 그것만으로는

2026년 2월 7일
·
0개의 댓글
·

트랜잭션 & DB — 30초짜리 트랜잭션을 쪼갤 수밖에 없었던 이유

추리게임의 시나리오 생성 흐름은 이렇다. 풀스토리를 만들고, 용의자별 알리바이를 생성하고, 증거를 배치하고, 용의자 정보를 저장한다. 이 과정에서 LLM을 여러 번 호출하고, 각 결과를 DB에 저장한다.처음에는 이 전체를 하나의 트랜잭션으로 묶었다. "전부 성공하거나

2026년 2월 7일
·
0개의 댓글
·

Rate Limiting — 토큰 버킷, Guava, 그리고 Redis를 안 쓴 이유

앞에서 세마포어로 동시 접근 수를 4개로 제한했다. 그런데 이것만으로는 부족했다.세마포어는 "동시에 몇 개까지 허용할 것인가"를 제어하지, "얼마나 빠르게 호출할 것인가"는 제어하지 않는다. 예를 들어 permit 4개가 전부 비어있는 상태에서 요청 4개가 동시에 들어

2026년 2월 6일
·
0개의 댓글
·

세마포어 & 동시성 제어 — AQS, CAS, 그리고 왜 세마포어인가

프리티어 LLM API를 쓰고 있었다. 당연히 동시 호출 수에 제한이 있었고, 백엔드 스레드도 4개로 제한된 환경이었다. 동시에 4개 이상의 요청이 LLM API를 때리지 못하게 제어할 수단이 필요했다.처음부터 세마포어를 쓰려고 했던 건 아니다. synchronized

2026년 2월 6일
·
0개의 댓글
·
post-thumbnail

문과 비전공 SQLD 1주일의 전사 합격!!

공부기간 : 일주일, 일 3시간 이하이유..싸피 커리큘럼 너무빡셈..사실 시험준비할 시간이 너무 없어서(과제와 시험의 연속..) 붙을 생각안하고 그냥 sql 공부나 좀 해놔야지 하는 마음으로 깔짝거려 본거같은데붙어버림 ... 예상 한 30점대였는데 합격했대서 놀라따.S

2025년 9월 13일
·
0개의 댓글
·

백준 - 2513

문제 접근:학교(S)를 기준으로 좌표가 왼쪽(plus), 오른쪽(minus) 으로 나뉘므로 각각 별도 관리버스는 한 번에 K명까지 태울 수 있으므로, 멀리 있는 아파트 단지부터 학생을 수송하는 것이 최적학생 수가 버스 정원을 넘으면 여러 번 왕복해야 하고, 남은 인원

2025년 8월 27일
·
0개의 댓글
·

백준 - 15789

문제 접근: H왕국을 제외하고, 연결요소 수를 max순으로 정렬한 후 C왕국 연결 수 + max연결 수 \* T번 반복하면 되겠다.시간복잡도: $O(N + M + N log N)$풀이과정그래프 구성무방향 그래프를 인접 리스트로 구성두 개의 BFS 수행C에서 한 번 BF

2025년 8월 27일
·
0개의 댓글
·

백준 - 10026

문제 접근: bfs사용해 R / G / B마다 탐색하되, 인자로 isGreen을 받아 적록색약인 사람과 아닌사람의 영역을 구분하려고 함시간복잡도: $O(N^2)$풀이과정입력받은 보드에서 BFS를 이용해 일반인의 시각으로 색상 영역 개수를 셈visited 배열 초기화

2025년 8월 27일
·
0개의 댓글
·

백준 - 13164

문제 접근: 오름차순으로 정렬되어 입력되므로 입력값을 i+1 - i로 빼서 둘 사이의 차이를 구해 배열에 저장한 후 이를 사용해서 최소값을 구한다. → “가장 큰 차이 (K-1개)를 제외한 나머지를 모두 더하면 최소합이 된다” 시간복잡도: $O(N log N)$인

2025년 8월 27일
·
0개의 댓글
·

백준 - 7569

문제 접근:토마토는 익은 토마토들(1)이 동시에 bfs탐색해야되므로, bfs를 쓸때 1인 것들을 모두 찾아 동시에 큐에 집어넣고 탐색이 끝나면 cnt++, 다음 1인 노드들 탐색하는 식으로 풀어야겠다고 생각함bfs탐색이 끝난후에는 tomato배열을 탐색해 0을 마주치는

2025년 8월 27일
·
0개의 댓글
·
post-thumbnail

1일 1알고리즘 1달차 골드 달성!

현재 진행중인 상황과 앞으로의 계획1일 2알고리즘알고리즘 종류 선택해 1문제 풀기(dp/그리디/bfs&dfs/재귀/자료구조 등)알고리즘 구분짓지 않고 랜덤 1문제 풀기약한 부분 -> dp,그리디,재귀 ...웬만한 알고리즘에 익숙해졌다 싶으면 프로그래머스로 넘어가기(다익

2025년 8월 24일
·
0개의 댓글
·

백준 - 1931

문제 접근: before의 회의종료 시간과, after의 회의시작 시간을 비교해서 after.start ≥ before.end시간이라면 시간이 겹치지 않고 회의를 배정할 수 있다고 판단했음 또한, 이렇게 리스트를 비교해나가기 위해선 정렬이 필요하다고 생각했고, 끝나

2025년 8월 24일
·
0개의 댓글
·

백준 - 2667

boolean\[]\[] home - 1인 경우 true 저장하는 집 배열, boolean\[]\[] visited - 방문 여부 저장할 배열, int\[]\[] dir - 상하좌우 탐색할 배열, List<Integer> list - 단지별 집 수를 오름차순으로

2025년 8월 12일
·
0개의 댓글
·

백준 - 2468

입력값(지형의 높이)을 받을 int\[]\[] area , 방문여부 저장할 boolean\[]\[] visited , 침수 여부 저장할 boolean\[]\[] wet 배열 선언→ 이때, area를 제외한 visited / wet 2차원배열은 비의 높이(0~최대높이-1

2025년 8월 12일
·
0개의 댓글
·

백준 - 2606

퍼지는 문제이므로 인접노드들을 모조리 큐에 넣어서 탐색하면서 카운트하기 위해 bfs 사용무방향 그래프이므로 양방향의 인덱스에 값을 모두 추가해 연결1에서 시작하면서, 1은 카운트 하지않으므로 큐에 인접노드를 집어넣는 시점에 ++cnt 하고, 큐가 비어 while문을 빠

2025년 8월 12일
·
0개의 댓글
·

백준 - 1697

우선 N / K 를 입력받은 후 bfs의 파라미터로 N을 넘김(int start)이때 N == K 라면 0을 리턴하고 바로 종료bfs메서드 호출100,001개의 visited - 방문여부 체크 / distance - 해당 지점까지의 최단거리 저장하는 배열 선언q에 시작

2025년 8월 12일
·
0개의 댓글
·

백준 - 2644

촌수 계산 ⇒ 시작점에서 도착점까지 도달하는 최단거리가 촌수이므로 bfs로 최단거리 찾기 시작노드 연결관계 저장할 List<Integer>\[] graph , 방문여부 저장할 boolean\[] visited, 타켓(시작점)에서 목적지까지 도달하는데 걸리는 거리

2025년 8월 12일
·
0개의 댓글
·

백준 - 2178

1 인 경우 true 값을 가지는 boolean\[]\[] maze , 방문여부 확인할 boolean\[]\[] visited 생성상하좌우로만 인접한 경우에 해당해 전진할 수 있으므로 4방향 배열 생성r, c, count를 인자로 받는 bfs 메서드 선언(r,c,cou

2025년 8월 9일
·
0개의 댓글
·

백준 - 4963

0 0 이 들어오면 종료되므로, String a = ""; while (!(a = br.readLine()).equals("0 0") 로 조건 만족시 반복문 안 돌도록처음 2차원 배열 섬 입력을 받을때 1인 경우 true로 받는 boolean\[]\[] island 생

2025년 8월 9일
·
0개의 댓글
·