강경원· 2시간 전
Vercel 무료 플랜에서 시간별 크론 돌리기
Hobby 플랜은 크론이 하루 1회 제한이라 시간별 작업이 막힌다. GitHub Actions 스케줄 워크플로로 우회한 방법.
vercelgithub-actions♡ 1강경원· 6시간 전
Prisma + Supabase 연결, 삽질 포인트 세 가지
direct host DNS 실패, 서버리스 60초 타임아웃, pgbouncer 커넥션 제한 — Supabase에 Prisma 붙일 때 세 번 막힌 지점과 해결.
prismasupabase강경원· 11시간 전
RSS 수집기를 만들며 겪은 현실적인 문제들
UA 차단, 소스마다 다른 스키마, 재수집 멱등성, 엔티티 디코딩 — RSS 수집기의 본체는 fetch가 아니라 정규화다.
rssbackend강경원· 19시간 전
결제 웹훅은 반드시 두 번 온다 — 멱등성 설계
웹훅은 최소 1회 전달 = 중복 각오. 이벤트 ID 유니크 제약 + 같은 트랜잭션, 상태 기계 조건부 UPDATE, 그리고 중복엔 200 응답.
paymentbackend강경원· 1일 전
Next.js App Router에서 페이지를 조립만 하게 만들기
서버 컴포넌트 시대에 페이지 파일이 비대해지는 걸 막는 규칙 하나 — 페이지는 조립만 한다. lib/queries와 lib/actions로 분리한 구조 정리.
next.jsarchitecture강경원· 1일 전
Next.js ISR 때문에 조회수가 멈춘 것처럼 보였다
DB엔 쌓이는데 화면은 그대로라면 캐시부터 의심하라. ISR 페이지에서 실시간 데이터만 클라이언트로 분리한 과정.
next.jsfrontend강경원· 2일 전
실시간 게임 서버에서 배운 것 — 클라이언트를 믿지 마라
클라이언트가 보낸 이벤트를 그대로 믿으면 devtools가 치트키가 된다. 서버 권위 모델과 순수 함수 상태머신으로 정리한 실시간 게임 설계.
websocketbackend강경원· 3일 전
소셜 로그인 버튼 뒤에서 일어나는 일 — Authorization Code Grant
code는 왜 브라우저를 거치고 토큰은 왜 서버끼리만 주고받는가. 콜백 URL, state, secret rotate까지 — OAuth 흐름을 장애 대응 가능한 수준으로.
oauthbackend강경원· 4일 전
캐시 무효화, TTL만 믿으면 안 되는 이유
틀리면 안 되는 데이터는 TTL로 못 지킨다. afterCommit 삭제가 주 방어, TTL은 보험 — 캐시 무효화의 레이스 컨디션 정리.
redisbackend강경원· 6일 전
TypeScript satisfies, as를 쓰기 전에
주석은 타입을 넓히고 as는 검사를 끈다. satisfies는 검사하면서 리터럴 추론을 지킨다 — 세 방식의 차이와 쓸 곳.
typescriptfrontend강경원· 7일 전
한글 입력에서 Enter가 두 번 눌리는 버그
한글 조합 중 Enter는 keydown을 두 번 발생시킨다. isComposing 체크 한 줄로 해결하는 한국어 서비스 필수 지식.
frontend강경원· 9일 전
JPA N+1, 발견부터 처리까지 실전 순서
쿼리 통계로 발견하고, fetch join·batch size·DTO 프로젝션 중 상황에 맞게 고르고, 쿼리 수 단언 테스트로 재발을 막는 실전 순서.
jpaspring♡ 1강경원· 11일 전
정산 시스템에서 1원이 사라지는 문제 — Largest Remainder Method
비율 배분 후 반올림하면 합계가 안 맞는다. 내림 + 잔여를 나머지 큰 순으로 나눠주는 Largest Remainder Method와 불변식 테스트.
javabackend강경원· 13일 전
@Value를 버리고 @ConfigurationProperties로 갈아탄 이유
@Value는 설정이 흩어지고 런타임에 터진다. record + @ConfigurationProperties 생성자 바인딩으로 옮기면서 정리한 장점 네 가지.
springjava강경원· 14일 전
RAG 제대로 이해하기 - LLM에 '내 지식'을 붙이는 법
LLM은 똑똑하지만 두 가지 약점이 있습니다. 모르는 걸 아는 척 할루시네이션 하고, 학습 시점 이후의 최신 정보나 우리 회사 내부 문서를 모른다 는 점입니다. 이 둘을 가장 현실적으로 해결하는 방법이 RAG Retrieval Augmented Generation, 검색 증강 생성 입니
aillmrag강경원· 15일 전
재고 차감 동시성, UPDATE 한 줄로 끝내기
조회-검사-차감은 동시성에서 깨진다. 조건부 UPDATE 한 줄이면 행 락으로 원자성이 보장된다 — 비관/낙관 락과의 비교까지.
databasebackend강경원· 15일 전
트랜스포머와 어텐션 - LLM은 어떻게 다음 단어를 예측할까
ChatGPT에게 질문하면 그럴듯한 문장이 술술 나옵니다. 그런데 그 내부를 들여다보면, LLM이 실제로 하는 일은 놀랍도록 단순합니다. "지금까지의 문장 다음에 올 단어를 확률적으로 고르는 것" , 그게 전부입니다. 이 단순한 예측을 무섭게 잘하게 만든 구조가 트랜스포머 Transfo
aillmtransformer강경원· 16일 전
토큰과 토크나이저 - LLM이 글자를 읽는 방식
LLM API를 써보면 "토큰"이라는 단위를 자주 만납니다. 요금도 토큰으로 매기고, 컨텍스트 한도도 토큰으로 표시됩니다. 그런데 토큰은 우리가 생각하는 "단어"나 "글자"와 정확히 일치하지 않습니다. LLM은 사람처럼 글자를 읽는 게 아니라, 자기만의 방식으로 텍스트를 조각내서 읽기
aillmtokenizer강경원· 17일 전
Spring Batch 6에서 메타데이터가 안 쌓일 때
Spring Batch 6은 기본이 인메모리 JobRepository다. dataSourceRef도 spring.batch.jdbc.*도 없어진 상황에서 JDBC 영속을 살리는 방법.
spring-batchspring강경원· 17일 전
임베딩(Embedding) 완전 이해 - 의미를 숫자로 바꾸기
컴퓨터는 "사과"와 "바나나"가 비슷하고 "사과"와 "자동차"가 다르다는 걸 어떻게 알까요? 글자만 비교하면 "사과"와 "사고"가 더 비슷해 보일 텐데 말이죠. 이 문제를 푸는 열쇠가 임베딩 Embedding 입니다. 텍스트의 의미를 숫자 벡터로 바꿔 , 의미가 비슷하면 숫자도 가깝게
aillmembedding강경원· 18일 전
프롬프트 엔지니어링 실전 - 원하는 답을 얻는 법
같은 모델에게 같은 일을 시켜도, 어떻게 묻느냐 에 따라 결과 품질이 극단적으로 갈립니다. "요약해줘"와 "3문장으로, 핵심 지표 중심으로, 존댓말로 요약해줘"는 전혀 다른 답을 냅니다. 프롬프트 엔지니어링은 마법 주문이 아니라, 모델에게 원하는 것을 오해 없이 전달하는 커뮤니케이션 기
aillmprompt강경원· 19일 전
파인튜닝 vs RAG vs 프롬프트 - 언제 무엇을 쓸까
LLM으로 뭔가 만들려고 하면 곧 이 갈림길을 만납니다. "우리 데이터를 어떻게 넣지? 파인튜닝? RAG? 아니면 프롬프트로 어떻게든?" 세 가지는 경쟁 기술이 아니라 서로 다른 문제를 푸는 도구 입니다. 잘못 고르면 돈과 시간을 크게 낭비합니다. 이 글은 세 방법의 본질적 차이를 짚고
aillmfinetuning강경원· 20일 전
복합 인덱스, 순서가 전부다
복합 인덱스는 (성, 이름) 전화번호부다. 등호는 앞, 범위는 뒤, 정렬은 마지막 — 순서 규칙과 EXPLAIN 확인법.
databasebackend강경원· 20일 전
LoRA와 QLoRA - 적은 자원으로 LLM 파인튜닝하기
LLM을 우리 도메인에 맞게 길들이고 싶을 때 가장 먼저 떠오르는 건 파인튜닝 입니다. 그런데 수십억 개 파라미터를 통째로 다시 학습하려면 GPU가 몇 장씩 필요합니다. 이 부담을 확 낮춘 기법이 LoRA 이고, 거기서 메모리를 한 번 더 줄인 것이 QLoRA 입니다. 이 글에서는 두
aillmfinetuning강경원· 21일 전
추론 모델과 Test-Time Compute - LLM이 '생각'한다는 것
같은 문제를 줘도 어떤 모델은 곧바로 답을 뱉고, 어떤 모델은 한참 "생각"한 뒤 답을 냅니다. 후자가 요즘 말하는 추론 모델 reasoning model 이고, 그 배경에는 test time compute 라는 개념이 있습니다. 이 글에서는 LLM이 답 전에 생각을 길게 하는 게 왜
aillmreasoning강경원· 22일 전
함수 호출(Function Calling) - LLM에게 도구를 쥐여주기
LLM은 학습된 지식으로 그럴듯한 문장을 만들지만, 실시간 재고를 조회 하거나 결제를 취소 하거나 정확한 계산 을 하지는 못합니다. 이 한계를 넘는 표준적인 방법이 함수 호출 Function Calling , 즉 LLM에게 도구 tool 를 쥐여주는 것입니다. 이 글에서는 함수 호출이
aillmfunction-calling강경원· 23일 전
AI 에이전트 이해하기 - ReAct와 계획-실행 루프
함수 호출로 LLM에 도구를 쥐여줬다면, 그다음 질문은 자연스럽습니다. "목표만 던지면 알아서 여러 단계를 밟아 끝내주면 안 되나?" 이 아이디어가 AI 에이전트 agent 이고, 그 대표적인 동작 방식이 ReAct 와 계획 실행 루프 입니다. 이 글에서는 에이전트가 무엇이고, 어떤 루
aillmagent강경원· 24일 전
MCP(Model Context Protocol) - AI에 표준 연결 단자 달기
함수 호출로 도구를 연결하고 에이전트까지 만들다 보면 곧 새로운 고민이 생깁니다. "이 도구 연결을 매번, 앱마다, 모델마다 다시 짜야 하나?" 이 파편화 문제를 표준으로 풀려는 시도가 MCP Model Context Protocol 입니다. 이 글에서는 MCP가 왜 나왔고, 어떤 구조
aillmmcp강경원· 25일 전
pgvector 실전 - PostgreSQL로 벡터 검색하기
RAG를 만들려면 임베딩 벡터를 어딘가에 저장하고, 질문 벡터와 가까운 것들을 빠르게 찾아야 합니다. 전용 벡터 DB Pinecone, Qdrant 등 를 도입할 수도 있지만, 이미 쓰고 있는 PostgreSQL에 pgvector 확장 만 얹으면 대부분의 실무 요구는 충분히 해결됩니다.
aillmpgvector강경원· 26일 전
LLM 평가 - 답변 품질을 어떻게 측정할까
프롬프트를 고치고, RAG를 붙이고, 모델을 바꿉니다. 그런데 정말 나아진 걸까요? 일반 소프트웨어라면 테스트가 초록불이면 됩니다. 하지만 LLM은 같은 질문에 매번 다른 문장으로 답하고, 정답도 하나가 아닙니다. 이 글에서는 왜 LLM 평가가 어려운지, 그리고 실무에서 품질을 수치로
aillmevaluation강경원· 27일 전
할루시네이션 - LLM이 거짓말하는 이유와 줄이는 법
LLM에게 존재하지 않는 API 함수를 자신 있게 알려주거나, 없는 논문을 그럴듯한 제목과 저자까지 붙여 인용하는 경험, 다들 한 번쯤 있으실 겁니다. 이렇게 모델이 사실이 아닌 내용을 사실처럼 생성하는 현상 을 할루시네이션 hallucination, 환각 이라고 부릅니다. 이 글에서는
aillmhallucination강경원· 28일 전
컨텍스트 윈도우와 롱컨텍스트 - 길다고 다 좋을까
"이번 모델은 컨텍스트 100만 토큰 " 같은 홍보를 자주 봅니다. 그래서 "문서를 통째로 넣으면 RAG 같은 거 필요 없는 거 아냐?"라는 생각이 들기도 합니다. 하지만 컨텍스트가 길다고 무조건 좋은 것은 아닙니다. 길이에는 대가가 따르고, 길다고 잘 읽는 것도 아닙니다. 이 글에서는
aillmcontext강경원· 29일 전
구조화된 출력 - LLM에서 안정적으로 JSON 받기
LLM을 챗봇이 아니라 시스템의 한 부품 으로 쓰기 시작하면, 곧 이 벽에 부딪힙니다. "답변을 자연어로 받으면 코드에서 어떻게 파싱하지?" LLM의 출력을 다음 단계 코드가 소비하려면, 자유서술이 아니라 예측 가능한 구조 주로 JSON 로 받아야 합니다. 이 글에서는 자유서술의 문제부
aillmstructured-output강경원· 7월 7일
LLM 추론 최적화 - 양자화와 KV 캐시
LLM을 직접 서빙해보면 학습보다 추론 inference 이 더 골치 아프다는 걸 금방 알게 됩니다. GPU 메모리는 순식간에 꽉 차고, 토큰은 느리게 나오고, 비용은 요청량에 비례해 불어납니다. 다행히 추론을 가볍게 만드는 두 가지 핵심 기술이 있습니다. 바로 양자화 Quantizat
aillminference강경원· 7월 6일
로컬 LLM 실행 - Ollama로 내 PC에서 모델 돌리기
LLM을 쓰려면 무조건 API 키를 발급받고 요청마다 돈을 내야 할까요? 꼭 그렇지는 않습니다. 요즘은 내 노트북에서 직접 모델을 돌리는 것 이 놀랄 만큼 쉬워졌습니다. 그 중심에 있는 도구가 Ollama 입니다. 마치 docker run 하듯 ollama run 한 줄로 모델을 받아
aillmlocal강경원· 7월 5일
멀티모달 LLM - 이미지를 이해하는 모델
지금까지 LLM은 텍스트만 읽고 텍스트만 답하는 존재였습니다. 하지만 이제는 이미지를 던져주고 "이게 뭐야?" 라고 물을 수 있습니다. 스크린샷을 붙여 버그를 물어보고, 차트를 보여주며 요약을 시키고, 손글씨 영수증을 표로 바꾸는 일이 한 번의 프롬프트로 됩니다. 이것이 멀티모달 LLM
aillmmultimodal강경원· 7월 4일
LLM 앱 보안 - 프롬프트 인젝션 막기
전통적인 웹 보안에 SQL 인젝션이 있다면, LLM 시대에는 프롬프트 인젝션 Prompt Injection 이 있습니다. 이름은 비슷하지만 성질이 훨씬 고약합니다. SQL 인젝션은 코드와 데이터를 분리하면 막을 수 있지만, LLM은 명령과 데이터를 똑같은 자연어로 받아들이기 때문에 근본
aillmsecurity