전체 글
글 144편 · 학습 노트 35편 포함
-
Kafka 멱등 소비자란?
중복은 소비자가 막고, 유실은 감수한 이유
한 줄로 멱등 소비자(Idempotent Consumer)는 같은 메시지를 두 번 받아도 결과가 한 번 받았을 때와 같은 소비자다. 골프 크롤러에 Kafka 예약 이벤트를 붙이면서, 소비자는 event_id UNIQUE 제약과 ON CONFLICT DO NOTHING 으로 중복 메...
-
밤새 도는 에이전트 루프는 멈추는 법이 절반이다
Ralph 패턴과 무인 루프의 멈춤 조건
AI 코딩 에이전트를 사람 없이 밤새 돌리는 방법이 있다. 커뮤니티에서 Ralph 라고 부른다. 원리는 단순하다 — 에이전트가 한 번 일을 끝내면 셸이 곧바로 다시 부른다. 그걸 무한 반복한다. while :; do cat PROMPT.md | claude-code ; done 한...
-
하이드레이션 전의 '껍데기 버튼'이란?
눌러도 반응이 없는 938회차를 겪고
한 줄로 화면에 보이는 버튼이라고 해서 누를 수 있는 버튼은 아니다. 서버가 먼저 그려 보낸 HTML 속 버튼은 자바스크립트가 클릭 동작을 붙이기 전까지 눌러도 아무 일이 없다. 무신사 오픈런 938회차는 이 껍데기 버튼을 눌러서 놓쳤다. 그래서 러너(응모를 대신 해 주는 자동화 ...
-
Redis Pub/Sub 은 메시지를 보관하지 않는다
Pub/Sub · List · Streams 중 무엇을 고르나
Redis 로 메시지를 나르는 방법은 세 가지다. Pub/Sub, List, Streams. 셋 다 “A 가 보내고 B 가 받는다”를 하지만, 고르는 기준은 성능도 문법도 아니다. 공식 문서에는 자료구조 선택 가이드 가 따로 있는데, 거기서 Pub/Sub 은 다뤄지지 않는다. Pu...
-
같은 도식을 Mermaid 와 Archify 로 그려봤다
둘을 나란히 비교하기
결론부터 정보량은 같았다 — 노드 9개, 화살표 8개 차이는 검증이다. Archify는 선이 겹치면 반려하고, Mermaid는 그냥 그린다 대신 Archify는 약 800KB, Mermaid는 2.4KB + CDN 아래에 같은 도식을 두 방식으로 나란히 놓았다. 직접 비교해보시면 ...
-
북마클릿은 아직 죽지 않았다
무엇이 막히고 무엇이 되는지 직접 재봤다
한 줄로 북마클릿은 북마크에 주소 대신 자바스크립트를 넣어 둔 것이다. 누르면 지금 보고 있는 페이지 안에서 그 코드가 돈다. “요즘은 CSP 때문에 안 된다”는 말을 자주 보는데, 절반만 맞다. 직접 재보니 갈리는 지점이 분명했다. GitHub (엄격한 CSP) CSP 없는 ...
-
문서에 없는 API 를 바이너리에서 꺼냈다
Herdr 소켓 API 로 플러그인 만들기
한 줄로 Herdr 공식 문서의 API 페이지는 엔드포인트를 하나도 적어두지 않았다. server · client · update 세 개와 “CLI 와 소켓 API 는 같은 표면”이라는 한 문장이 전부다. 그런데 herdr api schema --json 을 치면 275KB 가 쏟...
-
폰에서 에이전트를 조종했다
Collie 로 승인 대기를 풀어낸 3일
한 줄로 에이전트를 오래 돌려보면 일하는 시간보다 승인을 기다리는 시간이 길다. 자리를 비우면 그 대기가 전부 멈춤이 된다. Collie 는 그 판에 폰을 붙인다. 밖에서 승인 번호를 누르고, 답을 보내고, /compact 를 친다. 3일 동안 폰에서 39번 입력을 보냈고, 그중 ...
-
Herdr 는 에이전트의 옆자리를 알아본다
코딩 에이전트를 위한 터미널 멀티플렉서
한 줄로 터미널 판(pane) 안에 무엇이 돌고 있는지를 아는 멀티플렉서다. tmux 는 판을 나눠주고 끝난다. 그 안에서 도는 게 셸인지 에이전트인지, 답을 기다리는 중인지 일하는 중인지는 모른다. Herdr 는 그걸 안다. 그래서 에이전트가 다른 에이전트를 부릴 수 있다. 이 ...
-
git status 가 깨끗하다고 지워도 되는 게 아니었다
같은 저장소가 로컬에 두 벌 있었다 여러 머신 설정을 만지다가 블로그 저장소를 열었는데, 같은 저장소가 두 곳에 clone 돼 있었다. /Users/<user>/dmstjd1024.github.io 마지막 커밋 2026-09-07 17:50 /Users/<user&...
-
SSH 로는 되는데 Herdr 만 못 찾는다
.zshrc 가 아니라 .zshenv 였던 이유
한 줄로 ~/.local/bin 을 .zshrc 에 넣었는데도 원격 도구가 바이너리를 못 찾았다. 비대화식(non-interactive) SSH 에서 zsh 는 .zshrc 를 읽지 않는다. .zshenv 에 넣어야 했다. “내가 SSH 로 직접 들어가면 멀쩡한데 프로그램만 못 찾...
-
내 설정이 4개월 만에 3계층이 됐다
에이전틱 워크플로우를 어떻게 설계했나
에이전틱 워크플로우가 뭔가 AI 에게 매번 지시를 다시 쓰는 대신, 판단 기준과 절차를 미리 파일로 적어두고 그 위에서 일을 시키는 것이다. 대화가 끝나도 파일은 남으므로, 다음 대화는 같은 기준에서 시작한다. “프롬프트를 잘 쓴다”와는 다르다. 프롬프트는 이번 한 번이고, 워크플...
-
도식 3개가 18×18px 로 찌그러졌다
규칙을 어디에 적어야 안 틀리나
한 줄로 규칙은 문서에 잘 쓰는 것보다, 코드가 강제하게 만드는 편이 확실하다. 이 블로그 도식 182개로 확인한 결과다. 층 강제 방식 위반 색 CSS 가 강제 0건 좌표 코드가 계산 0건 래퍼 문서에만 적음 3건 새어 나간 3개가 전부 “문서에만 적어둔” 항목이었다. 이 글은 ...
-
내가 쓴 규칙을 소스로 검증했더니 근거가 틀려 있었다
규칙도 썩는다 앞의 두 글에서 규칙을 어떻게 나누고 어떻게 쌓았는지 썼다. 이번엔 반대다. 쌓아둔 규칙을 다시 읽어보니 틀린 것들이 있었다. 틀린 방식이 세 가지였다. 동작은 맞는데 이유가 틀린 것, 가리키던 대상이 사라진 것, 그리고 숫자를 재본 적이 없는 것. 셋 다 에러가 나...
-
브랜치 하나 따는 데 스킬 10KB 를 쓴다
내가 돌리는 워크플로우 설계
왜 브랜치 따는 데 문서가 필요한가 앞 글에서 설정이 3계층으로 갈린 과정을 썼다. 이번엔 그 위에서 실제로 매일 도는 워크플로우 하나를 처음부터 끝까지 뜯는다. 작업 브랜치를 만들고, 끝나면 PR 을 올려 머지하는 흐름이다. work-start 10,060B, work-finis...
-
끄면 예전으로 돌아갈 수 있나
자동화가 AX로 넘어가는 지점
판별 기준은 하나다 — 끄면 돌아갈 곳이 있나 만든 자동화가 도구인지, 일하는 방식이 바뀐 것인지는 기능 개수로 갈리지 않는다. 그것을 껐을 때 예전 방식으로 돌아갈 수 있으면 도구다. 돌아갈 곳이 없으면 일하는 방식이 바뀐 것이다. AX(AI Transformation)라는 말은...
-
LSP 는 코드를 글자가 아니라 뜻으로 읽는다
에이전트에게 무엇을 주는가
한 줄로 코드를 문자열이 아니라 문법으로 이해하는 도구다. grep 은 비슷한 글자를 찾고, LSP 는 같은 것을 찾는다. 이 차이가 전부다. 문제 — save 를 찾아줘 같은 코드에서 save 를 검색한다고 하자. user.save() // ← 진짜 그 함수 // 나중에 save...
-
회사마다 클러스터를 하나씩 통째로 띄운다
kind 로 만드는 멀티테넌시
한 줄로 회사를 하나 만들면, 그 회사 전용 쿠버네티스 클러스터가 통째로 하나 생긴다. 네임스페이스가 아니라 클러스터다. 서버 한 대 위에 kind 클러스터가 회사 수만큼 뜬다. 왜 네임스페이스가 아닌가 보통 멀티테넌시(여러 고객이 한 시스템을 나눠 쓰는 구조)는 네임스페이스로 가...
-
kubectl 없이 클러스터를 보는 화면을 띄웠다
쿠버네티스 대시보드 설치와 토큰 발급
한 줄로 쿠버네티스 클러스터를 웹 화면으로 보고 조작하는 공식 관리 도구다. kubectl 로 하던 일을 브라우저에서 클릭으로 한다. 무엇을 대신해주나 평소 클러스터 상태를 보려면 이렇게 친다. kubectl get pods -n monitoring kubectl describe ...
-
Prometheus 는 한 덩어리로 깔린다
메모리 때문에 보관 기간을 깎은 이유
한 줄로 Prometheus 를 단독으로 깔지 않는다. kube-prometheus-stack 이라는 묶음 차트로 Grafana·Alertmanager·수집기까지 6개 컴포넌트가 한 번에 들어온다. 그래서 진짜 문제는 설치가 아니라 자원 배분이다. 서버 한 대에 클러스터가 여러 개...
-
Istio 를 깔아두고 트래픽은 안 보냈다
서비스 메시를 넣되 아직 태우지 않은 이유
한 줄로 Istio 를 설치는 하는데, 실제 트래픽은 Istio 를 통과하지 않는다. Fabric 배포 스크립트 주석이 그걸 명시하고 있다. # Orderer/Peer의 istio.port 설정 (Kind 클러스터에서는 Istio 대신 직접 포트 사용) 이 글은 왜 이런 상태가 됐...
-
포트 3개를 1개로 줄이자 무한 리다이렉트가 났다
Ingress 로 클러스터 입구를 하나로 모으기
한 줄로 회사 하나가 쓸 수 있는 포트가 10개뿐이라, 관측 도구 3종을 포트 하나에 몰아넣었다. 그 대가로 경로 재작성(rewrite)이 필요해졌다. 이 글은 왜 그게 필요한지에 대한 이야기다. 포트가 왜 모자라나 앞 글에서 봤듯, 이 시스템은 회사마다 쿠버네티스 클러스터를 통째...
-
대시보드를 파일로 심었더니 로그인 루프에 빠졌다
Grafana 를 코드로 관리하기
한 줄로 Grafana 에 API 를 한 번도 호출하지 않고 대시보드를 등록한다. JSON 파일을 ConfigMap 으로 만들고 라벨 하나(grafana_dashboard=1) 를 붙이면 끝이다. 나머지는 Grafana 옆에 붙은 보조 컨테이너가 알아서 한다. 왜 손으로 만들면 안...
-
레지스트리 이름이 둘이라 이미지를 못 받았다
사설 레지스트리(registry:2)를 클러스터에 붙이기
한 줄로 폐쇄망(인터넷이 끊긴 망)에서 이미지를 공급하려고 띄운 사설 레지스트리다. 이미지 이름은 registry:2. Docker 가 공식 배포하는 레지스트리 서버다. 그리고 이 레지스트리가 담고 있는 이미지 목록에 registry:2 자신이 들어 있다. 이 글은 그게 왜 필요한...
-
블록 탐색기 하나 때문에 전용 DB 를 띄웠다
PostgreSQL 을 클러스터 안에 두기
한 줄로 Fabric Explorer(블록 탐색기) 하나만 쓰는 전용 DB 다. 애플리케이션 DB 가 아니다. 이 시스템의 본체 DB 는 따로 있고, 이건 탐색기가 화면을 그리려고 쌓아두는 사본이다. 왜 블록체인에 DB 가 또 필요한가 Fabric Explorer 는 블록·트랜잭션...
-
CouchDB 를 고른 대가는 파드 두 배였다
Fabric 상태 DB 를 LevelDB 대신 CouchDB 로
한 줄로 Hyperledger Fabric 피어가 현재 상태를 저장하는 DB 다. 기본값이 아니다. 일부러 골랐고, 그 대가로 피어 수만큼 DB 가 늘어난다. 블록체인인데 DB 가 왜 필요한가 헷갈리기 쉬운 지점이라 먼저 푼다. 블록체인은 거래 기록(원장) 을 이어붙인 사슬이다. ...
-
1초 살고 사라지는 컨테이너가 하는 일
busybox 를 초기화 작업에 쓰는 법
한 줄로 Besu 노드가 뜨기 직전에 잠깐 떠서 폴더 주인을 바꾸고 사라지는 컨테이너다. 하는 일은 명령 한 줄이다. chown -R 1000:1000 /data 이 한 줄 때문에 이미지 하나가 필요하다. 초기화 컨테이너란 쿠버네티스에는 초기화 컨테이너(init container)...
-
Fabric 채널 조인이 조용히 실패했다
kubectl hlf 20단계로 Hyperledger Fabric 을 올린 기록
한 줄로 회사를 만들 때 Fabric 은 안 생긴다. 빈 클러스터에 오퍼레이터만 깔릴 뿐이고, 네트워크는 따로 요청해야 만들어진다. 그 과정이 스크립트 1,178줄, 20단계다. 두 단계로 나뉜다 회사 생성 글에서 클러스터까지는 봤다. 그때 깔리는 건 hlf-operator 뿐이다...
-
Besu 검증자 2개가 함정이었다
Helm 5번으로 Hyperledger Besu 네트워크를 올리기
한 줄로 Besu 는 Helm 차트 5번으로 깔린다. Fabric 이 kubectl hlf 20단계였던 것과 대비된다. 그리고 검증자를 4개 요청해도 합의에 참여하는 건 2개뿐이다. 에러 없이. Fabric 과 무엇이 다른가 Fabric 글과 나란히 놓으면 차이가 뚜렷하다. F...
-
훅은 언제 막고 언제 못 막나
하나는 막았고 하나는 0건이었다
훅을 두 번 만들었고 결과가 갈렸다 Claude Code 의 훅(hook)은 특정 시점에 끼어드는 스크립트다. 도구를 부르기 직전, 파일을 저장한 뒤, 세션이 끝날 때 같은 지점에서 돈다. 프롬프트에 적은 규칙과 달리 모델의 협조가 필요 없다 — 코드가 판정하고 코드가 막는다. 그...
-
내 발화 565건을 세어봤다
나는 Claude Code 에 어떻게 말을 거는가
세어볼 수 있게 해둔 것이 있다 매일 23:55 에 그날 Claude 와 나눈 대화를 마크다운으로 떨구는 스크립트를 돌린다. 옵시디언 저장소에 날짜별로 쌓인다. --- tags: [대화기록, 클로드] 날짜: 2026-08-26 대화수: 146 --- # 2026-08-26 (수) ...
-
스킬 24개를 왜 만들었나
직접 만든 16개와 가져온 3개
스킬이 뭔가 특정 상황에서만 읽히는 지침 문서다. CLAUDE.md 와 달리 매 대화에 실리지 않고, 필요할 때만 로드된다. 그래서 평소 비용 없이 상세한 내용을 담을 수 있다. ~/.claude/skills/ 아래 폴더 하나가 스킬 하나이고, 안에 SKILL.md 를 둔다. 지금...
-
Superpowers 는 코드를 쓰기 전에 멈추게 만든다
플러그인이 강제하는 절차
한 줄로 AI 에게 “바로 코딩하지 말고 이 절차를 밟아라” 를 강제하는 플러그인이다. 기능을 더해주는 게 아니라 일하는 순서를 바꾼다. 그래서 설치해도 새 명령어가 늘지 않고, 대신 Claude 가 작업에 들어가는 방식이 달라진다. 만든 사람은 Jesse Vincent(obra)...
-
OMC 는 에이전트 19개를 부린다
oh-my-claudecode 오케스트레이션 층
한 줄로 하나의 요청을 여러 에이전트에게 나눠 실행시키는 플러그인이다. oh-my-claudecode, 줄여서 OMC. MIT 라이선스이고 Yeachan-Heo/oh-my-claudecode 에서 받는다. Superpowers 가 절차를 세운다면 OMC 는 인력을 나눈다. 층이 달...
-
승인 단계를 없애고 탈출구를 남겼다
OMC 자동 실행 규칙
문제 — 좋은 도구인데 안 부른다 OMC 는 에이전트 19개에 일을 나눠 실행시킨다. 파일 여러 개에 걸친 작업에는 확실히 낫다. 그런데 부르려면 키워드를 쳐야 한다. ralph, team, autopilot 같은 것들이다. 나는 그걸 한 번도 안 썼다. 대화 기록 23일치, 발화...
-
MCP 12개, 도구 251개
무엇을 왜 붙였나
MCP 가 뭔가 Model Context Protocol. AI 가 외부 서비스를 도구로 쓰게 해주는 규약이다. 붙이면 Claude 가 Jira 티켓을 만들고, Slack 을 읽고, 브라우저를 조작할 수 있게 된다. 개념 설명은 따로 쓴 글에 있고, 여기서는 내가 실제로 무엇을 붙...
-
CLAUDE.md 에 무엇을 썼나
4개월간 쌓인 규칙 14개
CLAUDE.md 가 뭔가 Claude Code 가 매 대화에 자동으로 실어 보내는 규칙 파일이다. 여기 적어두면 매번 말하지 않아도 지켜진다. 전역(~/.claude/CLAUDE.md) 하나가 있고, 프로젝트마다 따로 둘 수도 있다. 계층 구조는 다른 글에서 다뤘고, 여기서는 전...
-
팀 설정 파일을 내 것처럼 고칠 수 없다
skip-worktree 로 흡수하기
왜 git 에 넣나 맥 4대(회사 2 · 개인 2)를 오간다. 한쪽에서 고친 규칙이 다른 쪽에 없으면 같은 지시를 두 번 해야 한다. 그래서 저장소 하나를 진실 공급원으로 두고 각 머신이 심링크(원본을 가리키는 바로가기 파일)로 그 파일을 본다. ~/.claude/CLAUDE.md...
-
Aside 는 로그인한 채로 브라우저를 조종한다
로그인 상태를 물려받는 AI 브라우저
한 줄로 로그인 세션을 그대로 물고 있는 브라우저를 AI 가 조종하게 해주는 도구다. 일반 브라우저 자동화는 빈 브라우저에서 시작한다. 그래서 사내 관리자 화면 하나 열려면 로그인부터 해야 한다. Aside 는 내가 이미 로그인해둔 브라우저 자체를 조종한다. 인증 단계가 사라진다....
-
캐시가 아니라 자로 쓴 Redis
통계 API 응답시간을 직접 재기
관리자 화면에 “통계 API 평균 응답시간” 을 띄워야 했다. 통계 API 는 집계 쿼리가 무거워 느려지면 먼저 티가 나는 쪽이라, 지금 얼마나 걸리는지를 화면에서 보고 싶었다. APM 을 붙이는 선택지가 있었지만 그러지 않았다. 알고 싶은 것은 특정 URL 접두사 하나의 평균 이...
-
장부만 지우고 세션은 살려뒀다
동시 접속 기기 제한이 안 걸린 이유
구독 플랜별로 동시 접속 기기 수를 제한하는 기능이다. 무료는 1대, 상위 플랜은 그 이상. Redis 에 사용자별 세션 목록을 두고, 로그인할 때 개수를 세어 넘으면 막는다. 만들고 나서 테스트했더니 제한이 걸리는데도 다른 기기가 계속 쓰였다. 로그인 화면에서는 “기존 기기를 종...
-
스킬 16개를 만들었더니 명령어 모음이 판단 문서가 됐다
셸 래퍼로 시작해 판단 기준을 적게 됐다
첫 스킬은 16줄짜리 셸 래퍼였다 Claude Code 의 스킬(skill)은 특정 상황에서만 읽히는 지침 문서다. 규칙 파일과 달리 매 대화에 실리지 않고, 필요할 때만 로드된다. 계층과 로드 비용 이야기는 1편에 썼다. 지금 24개가 있고 그중 16개를 직접 만들었다. 가장 오...
-
Claude Code 설정을 맥 4대에 나눠 담았다
계층, 플러그인, 그리고 상시 로드 비용
시작은 규칙 파일 하나였다 Claude Code 는 CLAUDE.md 라는 파일에 적어둔 규칙을 매 대화에 실어 보낸다. “테이블 행은 | 로 시작하고 끝낸다” 같은 걸 적어두면 매번 말하지 않아도 지켜진다. 처음엔 이 파일 하나였다. 지금은 이렇게 나뉘어 있다. 계층 줄 수 적용...
-
예외를 잡았는데도 롤백됐다
rollback-only 마크를 몰랐다
문제: 부가 작업이 실패하면 본 작업까지 사라진다 LCA 승인 기능에 부가 작업이 둘 붙어 있다. baseline 저장 — 승인 시점의 지표를 스냅샷으로 남김 할당 스냅샷 — 같은 성격 둘 다 승인의 전제조건이 아니다. 없어도 승인은 유효하다. 그런데 이게 실패하면 승인 자체가 5...
-
undo 하나 넣었다가 4단 도미노
시작: undo 스냅샷이 과거를 바꿨다 그리드에 Ctrl+Z를 붙였다. 그런데 되돌리면 엉뚱한 값이 되살아났다. 재현이 딱 떨어졌다. 행1 월 셀에 11 입력 행2 월 셀에 22 입력 Ctrl+Z 2회 결과 — 행1은 0으로 복원되는데 행2가 22로 되살아남 (기대 0) 원인은 얕...
-
동기 호출과 무엇이 다른가
비동기 메시징 입문
비동기 메시징 이란 서비스끼리 직접 부르지 않고, 중간에 둔 저장소에 메시지를 넣어 주고받는 방식 보내는 쪽은 메시지를 넣고 바로 자기 일을 끝낸다. 받는 쪽이 지금 살아 있는지 신경 쓰지 않는다 받는 쪽은 자기 속도로 꺼내서 처리한다 중간에서 메시지를 맡아 두는 것을 브로커(Br...
-
REST 와 무엇이 다른가
GraphQL 입문
GraphQL 이란 API 를 통해 데이터를 주고받기 위한 쿼리 언어(Query Language, 원하는 데이터를 문장으로 적어 요청하는 문법) 클라이언트가 “무엇이 필요한지”를 직접 적어서 보내면, 서버가 딱 그만큼만 돌려준다 2012년 페이스북이 사내에서 만들어 2015년에 공...
-
백엔드 개발자 로드맵 2026
원본 로드맵의 세부 항목 132개를 하나도 합치지 않고 전부 그렸다. 큰 흐름만 보려면 아래 전체 흐름 도식 하나로 충분하고, 그 뒤 1~7단계가 세부 항목이다. 항목에 붙은 대안은 위의 기본 항목 대신 하나만 고르라는 뜻이고, 순서 무관은 아무 때나 익혀도 되는 항목이다. 표시가...
-
재는 행위가 크기를 바꾸면 화면이 폭주한다
CSS 한 줄이 만든 피드백 루프
문제: 차트가 무한히 커진다 화면 — LCA 결과 요약 증상 — 차트가 계속 커지며 레이아웃이 깨지고 깜빡거림 특징 — 멈추지 않는다. 가만히 둬도 계속 커진다 폭을 재봤더니 약 1,200만 px까지 갔다. 매 사이클 약 3.1배씩 커지고 있었다. 원인: CSS 한 줄이 만든 피드...
-
스프린트 운영과 차트 읽는 법
JIRA 활용
JIRA 입문, JQL 심화와 자동화에서 이어지는 글이다. 이 글은 도구 사용법이 아니라 팀을 어떻게 굴리느냐에 대한 글이다. 들어가며 JIRA를 잘 쓰는 팀과 못 쓰는 팀의 차이는 기능을 얼마나 아느냐가 아니다. JIRA에 적힌 내용이 실제 상황과 일치하느냐의 차이다. 못 쓰는 ...
-
JQL 심화와 자동화, 그리고 연동
JIRA 활용
JIRA 입문 - 개념부터 기본 사용법까지에서 이어지는 글이다. 1편이 “JIRA가 무엇이고 어떻게 쓰는가”였다면, 이 글은 “손으로 하던 일을 어떻게 줄이는가”에 대한 글이다. 들어가며 JIRA를 며칠 써보면 반복 작업이 눈에 띄기 시작한다. 매일 아침 내 이슈를 찾으려고 같은 ...
-
AI 붙여서 쓰기 (Rovo 와 MCP)
JIRA 활용
JIRA 입문, JQL 심화와 자동화, 스프린트 운영과 차트에서 이어지는 글이다. ⚠️ 이 분야는 변화가 빠르다. 이 글은 2026년 8월 기준으로 확인한 내용이며, 요금제·크레딧·기능명은 자주 바뀌므로 실제 적용 전에 공식 문서를 확인하는 것이 좋다. 먼저 이름 정리부터 JIRA...
-
디플로이먼트와 서비스
쿠버네티스 기본 오브젝트
디플로이먼트(Deployment) 란? 파드(Pod)를 관리해주는 것 앞에서 파드를 직접 매니페스트로 만들어 띄웠다. 그런데 파드만 쓰면 불편한 점이 있다. 서버를 3개 띄우려면 매니페스트 파일을 3개 만들어야 한다 파드가 죽으면 아무도 다시 살려주지 않는다 새로운 버전으로 바꾸려...
-
개념부터 기본 사용법까지
JIRA 입문
JIRA 란 Atlassian(아틀라시안)에서 만든 이슈 트래커(Issue Tracker, 할 일을 등록하고 추적하는 도구) “누가, 무엇을, 언제까지, 지금 어디까지 했는지”를 한 곳에서 관리하는 도구 원래는 버그 관리 도구로 시작했지만, 지금은 개발 업무 전반의 일정·진행 상황...
-
도커 교과서 6장
볼륨과 파일 시스템 마운트, 그 한계
도커 볼륨을 이용한 퍼시스턴트 스토리지 지금까지는 컨테이너를 만들고 지우는 걸 아무렇지 않게 했다. 그런데 DB처럼 데이터를 보관해야 하는 프로그램이라면 이야기가 달라진다. 컨테이너 속 데이터가 사라지는 이유 컨테이너 안에 파일을 하나 만들어보자. docker container r...
-
도커 교과서 5장
레지스트리·리포지터리·이미지 태그
도커 허브 등 레지스트리에 이미지 공유하기 4장까지는 내 컴퓨터 안에서만 이미지를 만들었다. 빌드한 이미지를 다른 사람도 쓰게 하려면 레지스트리에 올려야 한다. 레지스트리, 리포지터리, 이미지 태그 다루기 세 가지 용어가 헷갈리는데, 이미지 이름 하나를 뜯어보면 정리된다. dock...
-
pull 은 됐는데 설정이 반만 적용된다
맥 4대 dotfiles 를 무인으로 동기화하기
훅: 파일은 최신인데 설정은 옛날이었다 맥 4대(회사 2 / 개인 2)를 오가며 쓰는 상황 한쪽에서 고친 Claude Code 규칙이 다른 쪽엔 없음 새 머신 세팅 — zsh, git, ssh, 폰트, 플러그인을 기억에 의존해 복구 회사 머신에만 있어야 할 사내 서버 SSH 설정이...
-
GROUP BY 축이 한 줄 달라서 배출량이 2배가 됐다
문제: 같은 투입량이 공정마다 전액 계상됐다 두 CTE의 GROUP BY 축이 달랐다. -- 산출 쪽: 공정별 GROUP BY lup.id, match_key -- 투입 쪽: LCA 전역 (match_key 당 1행) GROUP BY lup.lca_id, match_key 이 둘을...
-
트랜잭션을 쪼갰더니 잠들어 있던 버그가 깨어났다
문제: 최악 41시간짜리 단일 트랜잭션 운송 구간의 거리를 외부 API로 받아오는 배치가 있다. 이 배치의 트랜잭션 경계가 잘못돼 있었다. 구조 — resolveAll이 @Transactional 하나로 전량을 감쌈 상한 — run 당 최대 10,000건 외부 API read ti...
-
캐시를 켰는데 캐시가 0개였다
문제: 캐시를 도입했는데 아무 일도 안 일어났다 CI를 줄이려고 Gradle 캐시를 붙였다. 워크플로는 초록불이고, 로그도 정상이고, 액션도 제대로 돌았다. 그런데 레포 Actions 캐시 목록이 0개였다. 이 글은 그걸 두 번 고치고 나서야 채워진 이야기다. 그리고 두 번 다 원...
-
로컬에서 빨라진 테스트가 CI에서는 느려졌다
문제: PR마다 CI가 8분 구성 — 빌드 2분 51초 + 테스트 5분 08초 체감 — PR을 올리고 커피 한 잔 시작점 — 추측하지 않고 실제 run 로그를 열어 구간별로 쟀다 원인은 네 가지였고, 전부 로그에 있었다. Gradle 캐시가 전혀 없다 — 매 실행이 의존성 해석부터...
-
멀쩡한 계좌가 손절 모드로 밀려났다
종목마다 따로 놀던 최고점 때문에
문제: 손실이 없는데 손절 모드였다 equity_peak의 정의: 계좌 자산이 지금까지 찍은 최고점 기록 여기서 얼마나 떨어졌는지(MDD, Max Drawdown) 계산 일정 이상 하락 시 신규 매수 차단 그런데 실제 저장 상태는 달랐다. 저장 단위: 종목별 전략 인스턴스마다 따로...
-
체결 47건을 역산해서야 드러난 4.1배짜리 수수료 오차
시작은 작은 지적이었다 최초 지적: 손익 화면에서 수수료와 세금이 하나의 값으로 합산 표시 첫 판단: “두 값을 나눠 보여주면 끝” — 넘어갈 뻔함 확인 결과: 합산 구조만의 문제가 아님. 요율 자체가 틀려 있었다. 가정 대신 실측한 내역 데이터: 실제 체결 47건 출처: KIS ...
-
초당 85줄 로그가 그날의 매도 체결 기록을 지웠다
문제: 로그가 너무 많아서 로그가 사라졌다 호출 빈도 — 자동매매 전략의 on_candle 함수는 종목마다, 매 틱마다 호출 문제 코드 — MDD(최대 낙폭) 차단이 걸릴 때마다 logger.info로 무조건 기록 실질 — “차단 중”이라는 상태 하나를 매 틱마다 재알림 2026년...
-
ddl-auto: update 의 빈틈을 메웠다
보완 DDL 자동화로 채운 것
Flyway를 걷어낸 뒤 남은 숙제 이전 글: Flyway를 도입하고 3주 만에 걷어낸 이야기 걷어낸 뒤 스키마 관리 방식 JPA ddl-auto 사람이 손으로 적용하는 SQL 파일 묶음(db/manual/*.sql) 구멍 두 가지 stg 환경은 ddl-auto: validate ...
-
설정 버그를 고치니 다음 질문이 남았다
'ML 을 켜는 게 맞나'
발단: 단순한 설정 누락 docker-compose.yml의 environment 항목 — 어떤 환경변수를 컨테이너에 넘길지 명시적으로 나열하는 방식 누락된 항목 — HYBRID_ENABLE_ML 결과 — .env 파일에 값을 뭐라고 적어두든 컨테이너까지 미전달 그래서 enable...
-
죽은 파일이 살아있는 파일보다 최신이었다
감사의 목적은 번들 축소가 아니었다 흔한 동기(번들 크기, 파일 수)가 아님 목적: “죽은 코드를 살아있다고 착각하고 거기에 작업하는 사고” 방지 계기: 그 사고가 이미 여러 번 발생 조사 결과: 2주 동안 같은 패턴 5회 반복 원인: git log가 거짓말을 한다 가장 인상적인 ...
-
같은 버그를 양쪽에서 따로 고쳤다
V1/V2 이중 스택을 합치기로 한 계기
계기: 같은 버그를 양쪽에서 따로 고쳤다 한 화면에 V1·V2 두 벌의 구현 공존 신규 작성 화면 — V2 사용 월 업데이트 화면 — V1 사용 카테고리 상태 desync 버그 발생 시의 대응: V1 쪽 수정 → 며칠 뒤 V2 쪽에서 재수정 같은 원인·같은 증상·같은 수정의 2회 ...
-
매수 신호는 나오는데 체결이 0건
감으로 안 고치고 필터를 채점했다
문제: 신호는 나오는데 거래가 없다 기간: 2026년 7월 20~21일 라이브 로그 전략 상태: BUY 신호 계속 발생 실제 매수 체결: 하루종일 0건 신호 자체는 살아있는데 그게 전부 걸러지고 있다는 뜻이었다. 감으로 고치지 않고, 필터를 채점했다 방식: 짐작으로 필터를 하나씩 ...
-
캐시를 고쳤는데 안 빨라졌다
문제: “데이터 조회가 느리다” 사용자 리포트는 이 한 줄이었다. 화면 — 배출량 산정의 원데이터 목록 탭 증상 — 목록이 뜨기까지 눈에 띄게 대기 주어진 정보 — 그게 전부. 어느 쿼리인지, 어느 카테고리인지 없음 여기서 두 갈래가 갈린다. 의심 가는 곳을 고칠 것인가, 어디가 ...
-
엑셀 라이브러리가 xlsx·exceljs 두 개였다
하나로 통일하기
문제 한 프로젝트 안에서 엑셀을 내보내는 경로가 두 개였고, 각각 다른 라이브러리를 사용 중. 경로 라이브러리 헤더 스타일 AG Grid export xlsx 불가 리포트 export exceljs 적용됨 xlsx(SheetJS) 커뮤니티 버전의 제약 — 셀 스타일 미지원 결과 —...
-
AI 코드리뷰 봇이 못 잡는 것이 있었다
봇 2종을 파이프라인에 넣고 배운 것
배경 대상: 프론트엔드 저장소 1곳 구성: AI 코드리뷰 두 겹 PR에 자동으로 달리는 Gemini 리뷰 봇 작업 중간에 명시적으로 태우는 code-review 패스 목표: “지적을 받는 것”이 아니라 지적사항을 실제 커밋으로 환류시키기 기간: 약 두 달 두 달 운영 결과 — 봇이...
-
소프트 삭제 전환과 @Filter가 새는 곳
엔티티 14개를 하드 삭제에서 바꾸며
엔티티 14개를 하드 삭제에서 소프트 삭제로 배경 — 보고서에서 참조하는 데이터가 삭제되면 과거 보고서가 파손 작업 — 삭제를 is_delete 플래그로 전환 대상 — 엔티티 14개 개념은 단순한데 실제로 걸린 곳은 둘 — 유니크 제약, @Filter 미적용 경로 (a) 유니크 제...
-
OCR 파싱에 30초 타임아웃으로는 부족했다
webhook 비동기로 옮기기
30초로는 부족했다 기능: 문서 OCR 파싱 기존 구조: 내부 OCR 서비스에 HTTP 요청 → 결과 수신 → 응답 (동기) 30초 타임아웃에 계속 걸린 원인 두 가지: PaddleOCR 콜드스타트 — 모델 로딩 지연. 유휴 후 첫 요청이 특히 느림 페이지당 처리 지연 — 문서 길...
-
PDF 다운로드가 7초 걸렸는데, 범인은 한글 폰트였다
폰트 로딩을 들여다본 기록
문제 대상 — 제품 배출량을 산정하는 B2B 웹앱의 결과 리포트 PDF 다운로드 소요 시간 — 버튼 클릭 후 약 7초 그동안 화면 — 로딩만 회전, 아무 변화 없음 사용자 반응 — “먹통이 됐나” 하고 재클릭하기 충분한 시간 구현 스택 — @react-pdf/renderer 4.x...
-
AI 에이전트 72개로 메모리 누수를 감사했다
그 결과를 다시 검증한 이유
문제 오래 켜두는 SPA의 메모리 누수 — 재현부터 어려움 조건: 특정 화면 열고 닫기를 수십 번 반복해야 드러남 그 시점엔 이미 어느 컴포넌트 탓인지 특정하기 어려움 수백 개 컴포넌트를 사람이 하나씩 훑는 건 비현실적 그래서 접근 전환 병렬 에이전트 72개를 띄워 프론트엔드 컴포...
-
N+1 은 하나의 문제가 아니었다
fetch join 이 답이 아닐 때 네 가지
N+1은 하나의 문제가 아니다 기간: 한 달 반 작업: 대시보드 조회 성능 개선 N+1 조우 횟수: 여러 번, 매번 처방이 상이 “N+1이면 fetch join” 반사가 통하지 않는 경우: 절반 이상 (a) fetch join을 못 쓸 때 — @BatchSize 첫 케이스 위치: ...
-
RTK Query 워터폴을 없애자 stale 이 드러났다
캐시를 켠 대가
문제 대시보드 탭 하나를 여는 데 요청이 직렬로 연결. summary 조회 → 첫 제품 자동 선택 → 해당 제품의 LCA 선택 → 상세 데이터 호출 각 단계가 앞 단계의 응답을 기다린 뒤에야 시작 — 전형적인 워터폴 추가로 이 API 그룹은 keepUnusedDataFor: 0으로...
-
읽을 때마다 CTE 5개를 풀스캔했다
뷰를 물질화 테이블로 바꾸기
읽을 때마다 5개 CTE를 풀스캔하고 있었다 대상 — 대시보드 조회에 쓰이는 엔티티 하나 매핑 — @Subselect로 매핑된 뷰 구성 — CTE 5개를 엮은 집계 뷰 MySQL의 동작 — 이 뷰를 실체화해두지 않음. 조회할 때마다 전체 재계산 즉 화면을 열 때마다 풀스캔 판단 기...
-
AG Grid의 autoHeight는 행 가상화를 끈다
columnDefs 재생성과 전체 remap 두 가지 원인
문제 입출력 데이터를 입력하는 그리드에서 행이 수백 개로 늘어나자 셀 하나를 편집할 때마다 눈에 띄게 버벅였다. 타이핑 속도를 화면이 못 따라오는 정도였다. 원인 1: 편집할 때마다 columnDefs가 통째로 재생성됐다 columnDefs는 useMemo로 감싸져 있었음 의존성 ...
-
readOnly 에서 write 를 잡아냈다
테스트 가드레일 만들기
조회 API가 매번 write 트랜잭션을 만들고 있었다 발단 — 대시보드 조회 API 응답 지연 확인 결과 — eco-view의 배출원 조회 경로가 lcaStepService.updateStepOnly(write)를 부수효과로 호출 즉 대시보드를 열 때마다 write 트랜잭션 생성...
-
AI가 쓴 커밋 메시지가 거짓말을 했다
배경: 커밋의 절반이 AI 협업이다 대상: 같은 백엔드를 공유하는 쌍둥이 Next.js 프론트엔드 기간: 한 달 남짓 집중 작업 커밋 접두사: 압도적으로 fix 국면: 통합테스트 + QA 대응 그 기간의 AI 협업 표기를 집계해 보니, 두 저장소 모두 AI 협업 커밋이 전체의 절반...
-
JWT 에서 Spring Session 으로 바꾼 뒤가 문제였다
전환 자체는 하루였다
전환 자체는 하루였다 내용: JWT 기반 인증 → Redis 기반 Spring Session 삭제: JwtFilter, JwtProvider 등 클래스 6개, 374줄 커밋 하나로 종료 정작 내용이 있는 구간: 그다음 3주 이 글의 주제: 세션 전환 후 드러난 문제들 (a) API...
-
Flyway 를 22일 만에 걷어냈다
도입보다 철수에서 배운 것
도입과 철수 사이 22일 도입 — 2026년 5월 13일 철수 — 6월 4일 기간 — 22일 그 사이 FlywayConfig — 221줄까지 성장 후 통째로 삭제 성공담이 아니라 철수 회고다. 왜 도입했나 프로젝트 구조: 빌드 — Gradle 멀티모듈 7개 (common / sha...
-
kubectl exec 은 왜 멈추는가
셸 스크립트에 타임아웃과 재시도 넣기
문제: 스크립트가 멈춘다 Fabric 네트워크 기동 = bash 스크립트가 kubectl을 순서대로 호출 증상 — 스크립트가 간헐적으로 멈춤. 에러가 아니라 그냥 정지 환경 — 폐쇄망 + kind 다중 클러스터. 네트워크 계층이 순탄하지 않음 원인 구조: kubectl은 기본적으로...
-
비동기 API가 무조건 200을 반환하고 있었다
문제: “삭제 성공”이라는 거짓말 블록체인 네트워크 생성에 걸리는 시간 — 몇 분 수행 작업 — Kubernetes에 리소스 등록, pod 기동 대기, 채널 생성, peer 조인 그래서 채택한 방식 — 생성도 삭제도 비동기 처리 컨트롤러의 역할 — 작업 등록만 하고 즉시 응답 문제...
-
TOCTOU 한 건을 고치는 대신 버그 클래스를 없앴다
문제: SFTP 업로드가 동시에 들어오면 터졌다 프로젝트: 웹 버튼 클릭 → Hyperledger Fabric·Besu 네트워크를 Kubernetes 클러스터에 배포하는 플랫폼 인프라 계층: JSch로 원격 서버에 SSH/SFTP 접속 → bash 스크립트 전송 후 실행 해당 업로...
-
TanStack Query 에서 로그아웃은 토큰만 지우는 게 아니다
캐시까지 비워야 한다
문제: 로그아웃했는데 이전 사용자 데이터가 보인다 구성: 같은 백엔드를 쓰는 쌍둥이 Next.js 프론트엔드 — 관리자 포털, 사용자 포털 인증 상태: Zustand 서버 상태: TanStack Query 이 분리 자체는 흔하고 합리적인 구성 문제 지점: 로그아웃 경로 useAut...
-
클러스터를 지웠는데 디스크가 안 줄어든다
익명 볼륨과 삭제 순서
문제: 지웠는데 공간이 안 돌아온다 폐쇄망 서버 한 대 위에 기업별 kind 클러스터가 여러 개 뜨는 구조 클러스터를 만들고 지우는 일이 잦다 — 그때마다 삭제 스크립트가 돈다 증상: 클러스터를 삭제해도 디스크 사용량이 줄지 않는다 에러는 없었다. 스크립트는 정상 종료하고, kin...
-
localStorage 에 남은 플래그가 로그인을 막았다
isAuthenticated: true 하나가 남긴 것
문제: 로그인 페이지가 “로딩 중…“에서 안 넘어간다 사용자 포털 버그 리포트 한동안 안 쓰다가 다시 진입하면 로그인 화면이 “로딩 중…“만 표시한 채 정지 폼 미표시 → 로그인 경로 없음 localStorage 비우면 정상 복귀 localStorage를 비워야 풀린다 → 원인은 ...
-
오퍼레이터 버그를 CRD 패치로 우회했다
오픈소스를 포크하지 않고 고치기
문제: 체인코드 상태가 FAILED에서 안 나온다 구조: 체인코드 배포 시 Kubernetes에 FabricChaincode 커스텀 리소스 생성 hlf-operator가 이 리소스를 보고 실제 체인코드 pod 기동 증상: 배포는 실제로 성공 kubectl get fabricchai...
-
인증 필터가 매 요청 DB를 네 번 때리고 있었다
문제: TPS가 안 나온다 부하 테스트에서 목표 TPS 미달 애플리케이션 로직 자체는 가벼움 조사 방향: 비즈니스 코드가 아니라 모든 요청이 반드시 지나가는 경로 구성: Spring Security + JWT 필터 체인 추적 결과: DB 접근이 겹겹이 누적 지점 하는 일 JwtFi...
-
TanStack Query 에서 mutation 후 목록이 안 바뀐다
invalidate 가 lazy 해서 생긴 일
문제: mutation 후 목록이 즉시 안 바뀐다 관리자 포털과 사용자 포털 양쪽에서 반복된 QA 피드백. 증상 — 항목을 삭제하거나 생성했는데 목록이 그대로 반영 시점 — 탭을 옮겼다 오거나 새로고침한 뒤 전제 — mutation 성공 후 invalidateQueries 호출 중...
-
깨진 한글을 되살리는 코드 87줄을 지웠다
문제: 감사 로그의 한글이 깨져 보였다 감사 로그(누가 어떤 API를 언제 호출했는지 남기는 기록) 화면에 한글이 ìë°처럼 표시됨 이런 깨짐을 mojibake(모지바케)라고 부른다 — 어떤 인코딩으로 저장한 바이트를 다른 인코딩으로 읽었을 때 나오는 글자 원인은 금방 찾았다. /...
-
같은 User인데 권한 검사가 깨졌다
재사용의 숨은 계약
3분 만에 되돌린 최적화 인증 경로에서 DB를 네 번 때리던 걸 걷어낸 이야기는 인증 필터가 매 요청 DB를 네 번 때리고 있었다에 썼다. 감사 로그 비동기화, 커넥션 풀, 인메모리 캐시까지 29분 동안 커밋 여섯 개가 나갔다. 그 글에 안 쓴 게 하나 있다. 여섯 중 하나는 3분...
-
게이트웨이가 죽었는데 사용자가 F5를 누른다
브라우저 서킷 브레이커
문제: 새로고침이 서버를 한 번 더 때린다 구성: 같은 백엔드를 공유하는 쌍둥이 Next.js 프론트엔드 — 관리자 포털, 사용자 포털 게이트웨이가 502/503/504 반환 시 두 앱 모두 전역 오버레이 표시 (“잠시 후 다시 시도해 주세요”) 진짜 문제는 그 다음: 사용자가 멈...
-
navigator.clipboard는 HTTPS에서만 동작한다
문제: 복사 버튼이 아무 반응이 없다 화면: 관리 화면 기능: 값 복사 버튼 로컬: 정상 동작 배포 환경: 버튼 눌러도 무반응 에러 토스트 없음, 콘솔 출력 없음 원인 위치 — 코드가 아니라 배포 환경 조건: HTTPS가 아닌 환경에서 서비스되는 경우 navigator.clipbo...
-
포트 할당 함수를 네 번 고쳤다
매번 다른 이유로
배경: 기업 하나에 클러스터 하나 폐쇄망에서 여러 기업이 각자 블록체인 네트워크를 쓰는 구조 격리 단위는 기업 1개 = kind 클러스터 1개 — 한 서버 위에 클러스터가 여러 개 뜬다 클러스터마다 호스트 포트가 필요하다(API 서버, Ingress, 대시보드, RPC…) 그래서 ...
-
탭 상태를 useState에 두지 마라
URL 파생 상태로 바꾸기
문제: 사이드 메뉴로 이동하면 탭이 안 바뀐다 관리자 포털의 여러 목록 화면이 탭 보유 탭 상태 위치 — ?tab= 쿼리 파라미터 그 덕에 되는 것 — 링크 공유, 새로고침 담당 훅 — useTabQuery 하나 QA에서 올라온 증상 사이드 메뉴 구성 — ?tab=code 링크와 ...
-
사이드바 권한 분기 100줄을 지우고 ICON_MAP만 남기다
문제: 사이드바가 권한을 안다 사용자 포털 사이드 메뉴: 상수 배열로 하드코딩 두 그룹의 메뉴가 파일 안에 박혀 있음 각 항목에 permission 문자열 부착 // 권한 코드와 경로는 가명. 구조만 그대로다. const GROUP_A_MENU_ITEMS = { ALPHA: { l...
-
401 을 성공으로 취급하는 헬스체크
배포 스크립트를 서브커맨드 오케스트레이터로 재설계
훅: 헬스체크가 401을 실패로 보고 있었다 기존 헬스체크 동작 앱 재시작 후 /monitor/health 호출 응답이 오면 성공 처리 until "${SSH_CMD[@]}" "$REMOTE_USER@$REMOTE_HOST" \ "curl -fsS 'http://127.0.0.1:...
-
AI 에게 스펙과 자기검토까지 시켰다
구현은 그 다음이다
커밋 히스토리가 곧 작업 기록이다 기간: 넉 달 커밋마다 어떤 도구로 작업했는지 트레일러를 남겼다 — Made-with: Cursor, Co-Authored-By: Claude <모델> 트레일러를 남긴 덕에 나중에 “이 코드를 어떤 방식으로 짰더라”를 되짚을 수 있었다....
-
엑셀 업로드에서 이름이 모호할 때 사용자에게 되묻기
자동 매칭도 실패도 아닌 셋째 선택지
문제 엑셀 파일로 장비 수천 행을 조직에 일괄 배정하는 기능: 사용자가 하는 일 — 시트에 장비번호와 조직명 기입 후 업로드 서버가 하는 일 — 조직명으로 조직을 찾아 매핑 문제 지점 — 조직명이 유일하지 않음 조직 트리에서 서로 다른 부모 아래 동명의 하위 조직 존재 가능. 사용...
-
두 단계 조인을 버리고 역정규화했다
백필 마이그레이션까지
문제 장비 A의 소속 조직 파악 — 두 단계 조인 필요 A ──(customer_sq)──> B ──(매핑 테이블)──> 조직 A는 조직을 직접 갖지 않음 A → 고객 B에 부착 B → 조직 매핑 테이블을 통해 조직에 연결 정규화 관점에서는 정상 — 조직 정보가 한 곳에...
-
캐싱은 쉬웠고 무효화가 어려웠다
권한 체크를 세션에 올린 뒤
문제 기존 권한 모델: user_level 정수 하나 숫자가 클수록 많은 권한 한계: “조회는 되는데 삭제는 안 되고, 다른 화면에서는 승인 권한이 있다” 같은 요구 → 정수 하나로 표현 불가 새 권한이 생길 때마다 숫자 구간 재해석 필요 그 해석이 코드 여기저기에 분산 결정: 권...
-
depth < 10 방어 코드가 버그를 감추고 있었다
두 문제가 한 숫자에 뭉개져 있었다
문제의 코드 대상: 계층형 조직 트리 서비스의 조상 조직 ID 수집 메서드 원래 구현의 핵심 — 아래 한 줄 while (currentId != null && depth < 10) { ancestorIds.add(0, currentId); Organization...
-
GIN trigram 인덱스를 만들었는데 왜 안 빨라지지?
인덱스를 만든 날과 인덱스가 실제로 쓰인 날이 13일 떨어져 있다 2026-03-12 — GIN trigram 인덱스 추가 2026-03-25 — 인덱스가 쿼리 플랜에 처음 등장 그 사이 13일 동안 인덱스는 디스크만 차지 이 글의 주제 — 그 13일 문제 환경: Spring Bo...
-
바인드 파라미터 65,535개 한도에 부딪혔다
PostgreSQL 이 한 번에 받는 값의 상한
문제 기능: 엑셀로 장비 매핑 정보 일괄 업로드 수백 행 → 정상 동작 실제 현장 데이터 수만 행 → 배치 INSERT에서 터짐 구현: MyBatis <foreach> 멀티 로우 INSERT 행이 늘수록 SQL 하나의 바인드 파라미터 개수도 선형 증가 그 개수에 상한 존...
-
배포 직후 55분, 핫픽스 4연발
문제를 네 번 다시 정의한 하루
09:41 — 배포하자마자 터졌다 배포 대상: 프록시 로테이션 기능 증상: 실서버에서 크롤링 미작동 로컬은 정상, 배포 환경에서만 실패 이후 55분 동안 커밋 4개 연달아 배포 문제를 하나 고칠 때마다 다음 문제가 드러나는 패턴이었다. 10:12 — 1차 원인: 토큰이 서버에 없었...
학습 노트
책·강의를 따라 적은 정리 35편. 2026 이전에 쓴 것이다.
-
리액트 시작하기 (6 ~ 장)
State 와 Hooks — useState 부터 useRef 까지
State 리액트 Component의 상태를 관리하는 객체 state는 개발자가 정의한다. 랜더링이나 데이터의 흐름에 사용되는 값들만 state에 포함시켜야한다. state가 변경될 경우, 컴포넌트가 재 랜더링 되기 때문에 랜더링과 데이터의 흐름에 관계없는 데이터를 저장하면, 컴포...
-
Alias 명령어 처리
자주 쓰는 명령을 줄여 쓰기
Alias 명령어 처리 bash 접근 nano ~/.bashrc alias 명령어 추가 alias log="tail -f /{프로젝트 경로}/logs/{로그파일명}.log"
-
도커 교과서 4장
소스 코드에서 이미지까지, 멀티 스테이지 빌드
애플리케이션 소스 코드에서 도커 이미지까지 Dockerfile 가 있는데 빌드서버가 필요할까? 빌드 툴 체인을 통해 한번에 패키징해서 공유하면 편리 도커만 갖춰진다면 컨테이너를 통해 어떤 환경에서든 애플리케이션 빌드, 실행 가능 도커허브를 통해 빌드도구가 내장된 공식 이미지 제공 ...
-
S3 란
오브젝트 구성과 데이터 일관성 모델
S3 란 매우 안전하고 가변적인 오브젝트 저장 공간 제공 버킷 : 최상의 폴더 S3 오브젝트 구성 요소 이해 Key Value 구조 (key : 오브젝트 파일명, value : 오브젝트 내용물) 업로드된 파일에 다른 내용이 들어가있따면, 버전 2로 업로드 가능 S3 데이터 일관성 ...
-
RDS 란
Aurora·OLTP/OLAP·백업 정리
RDS 란 관계형 데이터 베이스 서비스 RDBS Amazon Aurora 서버리스 및 머신러닝 어플리케이션 구축을 위해 요구되는 고성능 관계형 DB 데이터 웨어하우스 데이터 관리하는 시스템 유형 데이터 분석 작업 진행 즉, ‘데이터를 보관하고 사용하는 저장 창고’ 하나 혹은 여러 ...
-
MCP 란
LLM 에이전트 개발이 왜 표준을 필요로 했나
MCP 란 Model Context Protocol (MCP)는 LLM(대형 언어 모델)과의 상호작용을 위한 프로토콜입니다. MCP는 LLM이 특정 작업을 수행하기 위해 필요한 컨텍스트를 제공하는 데 중점을 둡니다. 이 프로토콜은 LLM이 더 나은 응답을 생성할 수 있도록 돕기 위...
-
리액트 시작하기 (1 ~ 5장)
JSX 문법과 렌더링 원리
리액트 설치 방법 npm 설치 node 설치 툴은 원하는대로 JSX 문법 자바스크립트 확장 문법 JavaScript + XML/HTML ex) 예시 const element = <h1>Hello, world!</h1>; 원리 React.createElement...
-
EC2 란
요금제와 EBS, 가용영역까지
EC2 란 클라우드 공간에 크기가 유연하게 변경되는 가상 서버 기능 제공 가상서버이기에 디스크 용량, CPU, 메모리 등을 자유롭게 조정 가능 비용 지불 방법 온디맨드: 사용한 만큼만 지불, 예측 불가능한 트래픽에 적합 리저브드: 저렴한 비용, 1~3년 임대, 인스턴스 크기 변경 ...
-
Markdown 문법
자주 쓰는 문법 한 장 정리
Markdown 문법 게시물 작성하면서, Markdown을 많이 사용할텐데, 요약집처럼 정리해보았다. 제목 # 제목 1 ## 제목 2 ### 제목 3 #### 제목 4 ##### 제목 5 ###### 제목 6 제목 1 제목 2 제목 3 제목 4 제목 5 제목 6 <h1>...
-
쿠버네티스
파드로 띄운 프로그램에 접속이 안 되는 이유
쿠버네티스란, 다수의 컨테이너를 효율적으로 배포, 확장 및 관리 하기 위한 오픈소스 시스템 Docker Compose의 확장판이라고 생각 쿠버네티스 장점 컨테이너 관리 자동화(배포, 확장, 업데이트) 부하 분산 (로드 밸런싱) 쉬운 스케일링 셀프 힐링 파드(Pod) 란?, 하나의 ...
-
도커 교과서 3장
이미지 만들기와 Dockerfile 작성
도커 이미지 만들기 도커 허브에 공유된 이미지 사용하기 web-ping 어플리케이션 이미지 pull 명령어 docker image pull diamol/ch03-web-ping 도커 이미지를 다운받을 때 각각의 파일을 이미지 레이어 라고 부른다. 환경변수 도커 컨테이너도 별도의 환...
-
도커 교과서 2장
컨테이너 실행과 웹사이트 호스팅
도커의 기본적인 사용법 컨테이너 실행 컨테이너로 애플리케이션 실행 명령어 애플리케이션은 미리 도커로 실행되도록 패킹돼 누구나 사용되도록 공유된 것 docker container run diamol/ch02-hello-diamol 애플리케이션을 컨테이너에서 실행할 수 있도록 패키징(...
-
Github Action VS Code Pipeline
코어 개념과 가격 비교
Github action 이란 Github에서 공식적으로 제공하는 CI / CD 툴 코드 변경 문제사항 검사 소프트웨어 빌드, 상용서버 배포 통계 데이터 수집 코어 개념 Workflow 자동화된 전체 프로세스. 하나 이상의 Job으로 구성되고, Event에 의해 예약되거나 트리거될...
-
Clean Code 후기
1장부터 끝까지 읽고 남은 것
1장 [깨끗한 코드] 회사가 망한 원인은 바로 나쁜 코드 탓.. 나쁜 코드는 개발 속도를 크게 떨어트린다. → 현재 기반을 잡는 상태이기에 여러 상황에 따라 유연히 대체 가능한 코드를 구현해야한다. 나쁜 코드의 위험을 이해하지 못하는 관리자 말을 그대로 따르는 행동은 전문가답지 못...
-
티켓 원정대 출발!
프로젝트 시작 — 기술 선택과 파트 나누기
프로젝트 시작 TDD 책을 정독하고 읽었던 내용들을 사용해보는 프로젝트를 진행해보려고 한다. 나는 2,3번 프로젝트를 진행해봤는데 결과는 좋지 않았고 이번에는 결과물을 완성하고 싶은 마음이 크다. 설명 100명에게 Ticket을 배포하는 프로그램을 RESTful방식 개발합니다 *신...
-
엔티티 설정
Account 엔티티를 두고 한 고민
고민 과연 Account 객체를 생성할 때 필요한 column명을 찾아서 적어봤다. Account @Getter @Builder @Entity @NoArgsConstructor @AllArgsConstructor public class Account { @Id @GeneratedV...
-
내가 적어보는 Hateoas 정리
DTO 안에 넣을 수 있을까
Hateoas 티켓 프로젝트를 진행하면서 rest(ful?) api 문서화를 만드는 중, 우리는 hateoas를 당장 써서 만들어야 할지 아닐지 고민되었다. 그래서 일단 자료조사를 위해서 hateoas에 대해 알아보려고 한다. Hateoas 란? Wikipedia에서 ‘hateoa...
-
DTO 처리방법
VO·Entity 와 무엇이 다른가
티켓 프로젝트를 진행하다가 다들 DTO에 대한 처리방식이 있었는데 나도 하나 적고 싶어서 DTO에 대한 내용을 찾다가 DTO에 관한 고찰 이분에 대한 내용 글이 재미있어서 읽고 블로그에 정리하고 싶어졌다. DTO 란? Data Transfer Object 로 계층간의 데이터를 교환...
-
SAP UI5 란
Bootstrapping·Components·MVC 구조
SAP UI5 SAP UI5 란 HTML5, CSS, JavaScript로 구성된 클라이언트 UI 기술이다. SAP UI5로 개발된 앱들은 우리가 사용하는 장치의 브라우저 안에서 실행한다. 사용자들이 앱을 액세스 할 때, 해당 서버로 애플리케이션을 브라우저에 로드하라는 요청을 전송...
-
OData V2 Model
모델 인스턴스 생성과 URL 파라미터
oData V2 model oData V2 모델을 사용하면 oData Service로 부터 데이터 제어를 가져올 수 있다. oData V2 모델은 서버측의 모델이며 데이터 셋은 단지 서버에서 사용가능하고 클라이언트들은 단순히 요청된 데이터만 알 수 있다. 각 정렬과 필터링 작동은 ...
-
자바의 예외 처리
try·catch·throws 와 예외 계층 — Live Study 9주차
목적 자바의 예외 처리에 대해 학습하세요. 학습할 것 자바에서 예외 처리 방법 (try, catch, throw, throws, finally) 자바가 제공하는 예외 계층 구조 Exception과 Error의 차이는? RuntimeException과 RE가 아닌 것의 차이는? 커스...
-
자바의 인터페이스
정의와 구현 방법 — Live Study 8주차
목적 자바의 인터페이스에 대해 학습하세요. 학습할 것 인터페이스 정의하는 방법 인터페이스 구현하는 방법 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법 인터페이스 상속 인터페이스의 기본 메소드 (Default Method), 자바 8 인터페이스의 static 메소드, 자바 8 인...
-
자바의 패키지
package·import·클래스패스 — Live Study 7주차
목적 자바의 패키지에 대해 학습하세요. 학습할 것 package 키워드 import 키워드 클래스패스 CLASSPATH 환경변수 -classpath 옵션 접근지시자 1. package 키워드 패키지 패키지는 클래스랑 인터페이스의 모음이며 관련된 클래스끼리 그룹단위로 모아 효율적인 ...
-
자바의 상속
super 키워드와 메소드 오버라이딩 — Live Study 6주차
목적 자바의 상속에 대해 학습하세요. 학습할 것 자바 상속의 특징 super 키워드 메소드 오버라이딩 다이나믹 메소드 디스패치 (Dynamic Method Dispatch) 추상 클래스 final 키워드 Object 클래스 1. 자바 상속의 특징 자바의 상속 전, 상속이란, 기존 ...
-
자바의 Class
클래스 정의와 객체 생성 — Live Study 5주차
목적 자바의 Class에 대해 학습하세요. 학습할 것 클래스 정의하는 방법 객체 만드는 방법 (new 키워드 이해하기) 메소드 정의하는 방법 생성자 정의하는 방법 this 키워드 이해하기 1. 클래스 정의하는 방법 클래스란, 객체를 정의해놓은 것, 또는 객체의 설계도 라고 정의할 ...
-
제어문
선택문과 반복문 — Live Study 4주차
목적 자바가 제공하는 제어문을 학습하세요 학습할 것 선택문 반복문 1. 선택문 Switch if 같은 조건문은 참, 거짓밖에 없기 때문에 경우가 많아질 수록 else if를 계속 추가해야하며 else if 에 있는 조건식들을 일일히 다 계산하며 내려가야 하므로 처리 시간이 늘어난다...
-
연산자
백기선 Live Study 3주차
목적 자바가 제공하는 다양한 연산자를 학습하세요. 학습할 것 산술 연산자 비트 연산자 관계 연산자 논리 연산자 instanceof assignment(=) operator 화살표(->) 연산자 3항 연산자 연산자 우선 순위 (optional) Java 13. switch 연산...
-
primitive 타입, 변수, 배열
백기선 Live Study 2주차
목적 자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다. 프리미티브라는 한글말만 보고 커피에 타먹는 가루 용어인가 그래서 어원 비슷하게 쓰는가 생각했는데.. 검색해보니 ‘primitive = 기본적인, 원시적인’ 이라는 뜻이라니.. 잠깐 누구도 보지 않았는데 영...
-
자바의 애노테이션
직접 정의하는 방법까지
목적 자바의 애노테이션에 대해 학습하세요. 학습할 것 애노테이션 정의하는 방법 @retention @target @documented 애노테이션 프로세서 1. 애노테이션 정의하는 방법 애너테이션이란 프로그램의 소스코드 안에 다른 프로그램의 위한 정보를 미리 약속된 형식으로 포함시킨...
-
JVM, 자바 코드 실행 과정
백기선 Live Study 1주차
목적 자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기 남궁성님이 출판하신 JAVA의 정석를 기반으로 작성하려고 한다. 학습할 것 JVM이란 무엇인가 JVM이란 java를 실행하기 위한 가상 머신이다. 여기서 ‘가상머신’ 대신 ‘가상 컴퓨터’라고 부르는게 이해하기 좋...
-
Jasypt 암호화
설정값 암호화와 Tomcat 외부변수 등록
jasypt 이란 프로젝트를 하면서 이메일 인증이나 DB정보를 저장할 때 값을 노출 시킨 상태에서 github에 올린다면 해킹의 여지가 있기에 jasypt 라이브러리를 사용하자는 이야기가 나왔다. 일단은 암호화에 대한 내용을 찾아봤다. 암호화란 메시지 내용이 불명확하도록 평문을 재...
-
깃허브 블로그 로컬로 돌리기
실행 스크립트 만들어 두기
깃허브 블로그 실행 파일 처음엔 남들 github.io에 개발 관련 블로그가 많이 보이길래 저건 어떻게 만들지 하며 찾아보니깐 깃허브로 무료 호스팅을 제공하는거라 한다. 나는 이런 글을 쓰는 것이 좀 어색하지만 차츰 글의 양을 늘려보도록 하겠다. 일단 jekyll 설치, 실행 방식...
-
Git flow와 Jira 사용 전략
브랜치 종류와 운영 순서
일단 프로젝트를 진행하면서 저희는 코드 관리는 github를 사용하기로 했고 테스크 툴로는 Jira를 사용하기로 했다. 그리고 협업 전략에서 git flow라는 것을 알게 되었다. 일단 이것들이 먼지 살펴보려고 한다. git flow란? 프로젝트 브랜치 전략의 개발 모델 또는 방법...
-
SSR, SSG
CSR·SPA 와 무엇이 다르고 SEO 는 어떻게 되나
SSR, SSG, jamstack SSR Server Side Rendering으로 서버에서 HTML 구조로 응답하는 방식 CSR Client Side Rendering (ex Angular, React, Vue) javascript로 동적 페이지를 출력 SPA Single Pag...
-
PostgreSQL이란
구조와 기능, 그리고 내 생각
PostgreSQL 오픈 소스 객체 관계형 데이터베이스 새로운 하나의 프로그래밍처럼 구현하는 기능을 제공한다. 구조 클라이언트 / 서버 모델 사용 기능 트랜잭션과 ACID(Atomicity, Consistency, Isolation, Durability)를 지원 또한 주요 기능들을...