923 posts
코딩 테스트 합격을 위한 리트코드 핵심 문제 풀이

코딩 테스트 합격을 위한 리트코드 핵심 문제 풀이

코딩 테스트 준비, 막막하게 느껴지신 적 있으신가요? 🤔 저도 처음엔 리트코드 문제를 무작정 풀고, 정답을 외우는 식으로 비효율적인 준비를 했던 경험이 있습니다. 문제를 아무리 많이 풀어도 새로운 문제가 나오면 막막해지고, 면접에서 "왜 이렇게 풀었나요?"라는 질문에 제대로 대답하지 못했던 적도 있었죠. 심지어 분명히 풀어본 문제인데도 시간이 지나면 어떻게 풀었는지 기억이 안 나는 경우도 많았습니다. 18년 넘게 개발자로 일하면서 한국 대기업에서 아마존, 그리고 실리콘밸리 스타트업까지 이직할 때마다 수많은 코딩 테스트를 직접 겪어

AI 크롤러를 막으면 돈이 될까?

AI 크롤러를 막으면 돈이 될까?

1년 전 Cloudflare가 꽤 과감한 일을 벌였습니다. 2025년 7월 1일을 "콘텐츠 독립기념일"이라 부르면서, 신규 도메인에서는 AI 크롤러를 기본으로 차단하도록 정책을 뒤집었거든요. 그동안 웹의 기본값은 "일단 열려 있음"이었는데, 그걸 "먼저 허락을 구하라"로 바꾼 겁니다. 여기에 크롤링 한 건마다 요금을 매기는 Pay Per Crawl까지 얹었습니다. 30년 가까이 예약석으로만 남아 있던 402 Payment Required 상태 코드를 꺼내 쓴 것도 이때였고요. 저처럼 개인 블로그를 운영하는 사람 입장에서 궁금한 건

AT Protocol: Bluesky를 떠받치는 탈중앙 소셜 프로토콜

AT Protocol: Bluesky를 떠받치는 탈중앙 소셜 프로토콜

소셜 서비스를 옮겨본 적 있으신가요? 계정을 새로 파고, 팔로워를 처음부터 다시 모으고, 그동안 쓴 글은 옛 서비스에 그대로 남겨두고 나오게 됩니다. 계정도 데이터도 인맥도 전부 그 회사 서버 안에 있으니 당연한 일이죠. 서비스가 마음에 안 들어도 쉽게 못 떠나는 이유이기도 하고요. 😅 AT Protocol(atproto)은 이 구조를 뒤집어보려는 시도입니다. Bluesky를 떠받치는 프로토콜로 알려져 있지만, 정확히 말하면 Bluesky는 이 프로토콜 위에 올라간 여러 앱 중 하나일 뿐입니다. 신원과 데이터를 앱 바깥으로 꺼내

AI 에이전트가 스스로 결제하는 웹: x402 프로토콜

AI 에이전트가 스스로 결제하는 웹: x402 프로토콜

AI 에이전트에게 일을 시키다가 이런 벽에 부딪혀 보신 적 있나요? 필요한 데이터를 가져오라고 시켰더니 "해당 API는 인증이 필요합니다"라며 멈춰 서는 상황 말이죠. 그 API를 쓰려면 사람인 제가 직접 회원가입을 하고, 신용카드를 등록하고, 요금제를 고르고, 발급받은 키를 환경 변수에 꽂아줘야 합니다. 에이전트가 자율적으로 일한다더니 결제 앞에서는 매번 저를 부르는 셈입니다. 😅 생각해보면 당연합니다. 웹의 결제는 처음부터 끝까지 사람을 전제로 설계됐거든요. 결제 양식을 채우고 약관에 동의하고 인증 문자를 받는 과정은 전부 사

어색하게 끊기는 한국어 줄바꿈 다듬는 법

어색하게 끊기는 한국어 줄바꿈 다듬는 법

공들여 쓴 글에 제목을 달고 모바일에서 열어봤는데, 마지막 줄에 짧은 단어 하나만 덩그러니 남아 있는 걸 보신 적 있으신가요? 😅 글꼴도 크기도 잘 골랐는데 제목이 어딘가 엉성해 보이는데요. 한국어라면 여기에 더해 "브라우저"가 "브라" / "우저"로 뚝 잘리는 일까지 생깁니다. 이런 문제는 글꼴이나 여백을 아무리 만져도 해결되지 않습니다. 줄을 어디서 나눌지는 브라우저의 줄바꿈 알고리즘이 정하는 영역이기 때문인데요. 우리가 개입하려면 그 알고리즘에 직접 말을 걸어야 합니다. 이번 포스팅에서는 word-break 속성과 text-

Web Bot Auth: IP 대신 서명으로 봇의 신원을 증명하기

Web Bot Auth: IP 대신 서명으로 봇의 신원을 증명하기

서버 로그에 GPTBot이 찍혀 있다고 해봅시다. 이게 정말 OpenAI가 보낸 요청일까요? 🤔 User-Agent 헤더는 그냥 문자열입니다. curl -A "GPTBot" 한 줄이면 누구나 GPTBot 행세를 할 수 있죠. 그래서 지금까지는 IP 주소로 한 번 더 확인했습니다. 봇 운영자가 자기 IP 대역을 공개하면 사이트는 요청이 그 대역에서 왔는지 대조하는 방식이었는데요. 그런데 이 방식이 요즘 급격히 무너지고 있습니다. AI 에이전트가 사용자를 대신해 웹을 돌아다니기 시작하면서부터입니다. 이런 에이전트는 서버리스 환경이나

Cloudflare OS: AI 에이전트를 위한 운영체제

Cloudflare OS: AI 에이전트를 위한 운영체제

에이전트에게 작업을 맡겨두고 커피를 타러 다녀온 적 있으신가요? 돌아와 보면 첫 단계에서 승인 창을 띄워놓고 얌전히 기다리고 있죠. 😅 이런 일이 몇 번 반복되면 손이 가는 곳은 대체로 정해져 있습니다. 자동 승인을 켜거나, 권한 설정을 통째로 건너뛰는 옵션을 쓰거나. 안전하게 쓰라고 만든 장치가 오히려 위험한 선택을 부추기는 셈인데요. 개인이 쓰는 코딩 에이전트에서도 이런데, 회사 전체가 에이전트에 GitHub, Google Docs, Slack을 물려준다고 생각하면 문제는 훨씬 커집니다. Cloudflare가 2026년 8월에

Agent Plugins: 스킬과 MCP를 한 패키지로 묶기

Agent Plugins: 스킬과 MCP를 한 패키지로 묶기

에이전트용 스킬을 하나 잘 만들어 두면 여기저기서 쓰고 싶어집니다. 팀 동료는 클로드 코드 대신 Codex를 쓰고, 다른 동료는 Cursor를 쓰니까요. 스킬만 나눠주는 거라면 방법은 이미 있습니다. skills.sh의 npx skills add에 -a '*'를 붙이면 지원하는 코딩 에이전트 전부에 같은 스킬을 한 번에 설치해 주거든요. 진짜 문제는 스킬이 혼자 굴러가지 않을 때 드러납니다. 배포 상태를 조회하는 MCP 서버가 있어야 동작하는 스킬이라면, 서버 설정은 여전히 도구마다 손으로 넣어야 하죠. 스킬과 도구가 한 몸인데 배

Mole: 맥 청소부터 시스템 모니터링까지 한 번에

Mole: 맥 청소부터 시스템 모니터링까지 한 번에

맥으로 개발을 하다 보면 디스크가 슬금슬금 차오릅니다. 저장 공간 경고가 뜰 때쯤 확인해보면 대개 이런 상태예요. 460GB짜리 디스크에서 남은 공간이 24GB 남짓입니다. 문제는 무엇을 지워야 할지 모르겠다는 거죠. 사진이나 영상을 지우자니 아깝고, ~/Library 안쪽은 열어봐도 알 수 없는 이름의 폴더뿐입니다. 😅 맥 청소 앱은 예전부터 많았습니다. 그런데 이 바닥은 유독 미심쩍은 광고와 연 3만~5만 원짜리 구독으로 얼룩져 있어서 선뜻 손이 가지 않죠. "잡동사니 12GB를 발견했습니다" 같은 문구는 봤어도, 정확히 무슨

Herdr: AI 코딩 에이전트를 위한 터미널 멀티플렉서

Herdr: AI 코딩 에이전트를 위한 터미널 멀티플렉서

AI 코딩 에이전트 하나를 터미널에서 돌릴 때는 별문제가 없습니다. 그런데 버그 수정은 Codex에 맡기고, 테스트 실패 원인 조사는 Claude Code에 시키고, 옆에서는 개발 서버까지 띄우기 시작하면 상황이 달라져요. 터미널 탭을 돌아다니며 누가 작업 중인지, 누가 권한 승인을 기다리는지 계속 확인해야 합니다. 일은 에이전트들이 하는데 정작 사람은 터미널을 순찰하느라 바쁜 셈이죠. 🤔 Herdr는 이 문제를 풀기 위해 만든 터미널 멀티플렉서(terminal multiplexer)입니다. 화면을 나누고 세션을 유지하는 데서 그

코딩을 덜 하게 된 우리는 에이전트를 제대로 감독할 수 있을까요?

코딩을 덜 하게 된 우리는 에이전트를 제대로 감독할 수 있을까요?

요즘 이런 말을 자주 듣습니다. 이제 개발자는 코드를 직접 짜기보다 코딩 에이전트를 지휘하고 감독해야 한다고요. 저도 개발자의 역할이 바뀌고 있다는 큰 흐름에는 동의합니다. 다만 여기에는 조심해야 할 역설이 있습니다. 과연 직접 구현을 할 수 없는 개발자가 에이전트를 감독할 수 있을까요? 문법을 빠르게 떠올리고 코드를 입력하는 속도는 조금 느려져도 괜찮습니다. 하지만 요구 사항을 파악하고, 코드의 동작을 예측하고, 실패 원인을 추적하는 능력까지 잃는다면 이야기가 달라집니다. 에이전트가 만든 결과물을 판단할 기반도 함께 사라지기 때문

TanStack Markdown과 Highlight

TanStack Markdown과 Highlight

문서 사이트를 만들다 보면 이상한 순간이 옵니다. 정작 보여주려는 건 글자 몇 천 개인데, 그걸 그리려고 내려받는 자바스크립트가 1MB를 넘어가는 거죠. 😅 TanStack 팀이 딱 이 상황이었습니다. tanstack.com의 문서 페이지 하나가 스크립트만 약 1.1MiB를 전송하고 있었는데, 그중 358KiB 정도가 오직 코드 구문 강조에 쓰이고 있었어요. 이걸 React Server Components로 감추는 대신, 팀은 도구 자체를 작게 만드는 쪽을 택했습니다. 그렇게 나온 게 TanStack Markdown과 TanSta

비밀번호를 안전하게 저장하고 검증하기

비밀번호를 안전하게 저장하고 검증하기

회원 가입 API를 만들다 보면 데이터베이스의 비밀번호 열을 어떻게 채워야 할지 고민하게 됩니다. 평문을 그대로 넣으면 안 된다는 사실은 알겠는데, AES로 암호화해야 할까요? 아니면 SHA-256으로 해시하면 충분할까요? 둘 다 안전한 답은 아닙니다. 비밀번호 저장은 일반 데이터 암호화나 파일 무결성 검사와 다른 위협을 상대하기 때문인데요. 공격자가 데이터베이스를 통째로 가져간 뒤에도 사용자의 원래 비밀번호를 알아내기 어렵게 만들어야 합니다. 이번 글에서는 비밀번호를 저장하고 검증하는 기본 흐름부터 우리에게 익숙한 범용 해시 알고

Cloudflare Agents SDK로 상태 있는 AI 에이전트 만들기

Cloudflare Agents SDK로 상태 있는 AI 에이전트 만들기

AI 채팅을 하나 만들었다고 해볼까요? 사용자가 목표를 알려주고 대화를 나누는 동안에는 제법 그럴듯하게 동작합니다. 그런데 브라우저를 닫았다가 다시 열면 이전 목표를 잊습니다. "30분 뒤에 다시 알려줘"라고 해도 그때까지 프로세스를 붙잡아 둘 방법이 마땅치 않고요. 여러 기기에서 같은 대화에 접속하면 상태가 서로 어긋나기도 합니다. 🤔 대형 언어 모델(large language model, 이하 LLM)을 호출하는 것만으로는 이런 문제를 해결할 수 없습니다. 모델 밖에서 사용자별 상태를 저장하고, 실시간 연결을 관리하고, 정해진

Mosh: 네트워크가 바뀌어도 끊기지 않는 원격 셸

Mosh: 네트워크가 바뀌어도 끊기지 않는 원격 셸

카페에서 서버 작업을 하다가 노트북을 덮고 지하철을 탄 뒤 다시 열었을 때, 터미널이 그대로 멈춰 있는 걸 보신 적 있으신가요? 🤔 몇 초쯤 기다리다가 결국 Ctrl+C를 눌러보고, 그래도 반응이 없어서 창을 닫고 다시 접속합니다. 아까 어느 디렉터리에 있었는지 기억을 더듬어 다시 이동하고요. 와이파이에서 테더링으로 갈아탈 때도, 사무실에서 집으로 이동할 때도 똑같은 일이 반복됩니다. SSH는 TCP 위에서 동작하는데, TCP 연결은 클라이언트의 IP 주소에 묶여 있습니다. IP가 바뀌는 순간 그 연결은 되살릴 방법이 없어요. 서

Web Awesome으로 프레임워크 독립적인 UI 만들기

Web Awesome으로 프레임워크 독립적인 UI 만들기

관리자 화면에 버튼 하나를 추가하려는데 디자인부터 다시 잡아야 했던 적이 있나요? 버튼만 끝나면 다행이지만 입력창, 대화 상자, 탭, 드롭다운까지 필요해지면 이야기가 달라집니다. 직접 만들자니 접근성과 키보드 조작이 걱정되고, 익숙한 UI 프레임워크를 쓰자니 특정 JavaScript 프레임워크에 프로젝트 전체가 묶일 수 있죠. Web Awesome은 이 사이를 파고드는 UI 컴포넌트 라이브러리입니다. React나 Vue 전용 컴포넌트 대신 브라우저 표준인 웹 컴포넌트(Web Components)로 만들어졌는데요. 일반 HTML 페이

TanStack Intent: 라이브러리와 함께 배포하는 에이전트 스킬

TanStack Intent: 라이브러리와 함께 배포하는 에이전트 스킬

AI 에이전트에게 라이브러리를 다루는 코드를 맡겼다가 한숨을 쉬어 본 적 있으신가요? 분명 최신 버전을 설치했는데 2년 전에 사라진 API를 자신 있게 써 놓거나, 이름만 남고 시그니처가 바뀐 함수를 옛날 방식으로 호출해 놓는 경우 말입니다. 모델이 게을러서가 아닙니다. 학습 데이터에 남은 옛 코드와 지금 node_modules에 설치된 코드가 다를 뿐이죠. 문제는 에이전트가 그 차이를 알 방법이 마땅치 않다는 데 있습니다. TanStack Intent는 이 간극을 조금 색다른 방식으로 메웁니다. 문서를 어딘가에 잘 정리해 두고 에

AI는 저에게 코드는 써주었지만, 저의 언어로 만들어주지는 못했습니다

AI는 저에게 코드는 써주었지만, 저의 언어로 만들어주지는 못했습니다

이직을 하고 Kotlin과 Rust라는 저에게 생소한 언어 두 개를 동시에 써야하는 기회가 생겼습니다. 마침 코딩 에이전트가 막 부상하던 시기였는데요. 공부를 하는 방법에도 변화를 주면 어떨까 싶었습니다. 그래서 두 프로그래밍 언어를 완전히 다른 방식으로 공부하는 실험을 시작했습니다. Kotlin 학습은 철저하게 AI 주도로 하기로 결심했습니다. 무조건 AI가 코드를 작성하게 하고, 코드를 이해할 때도 AI의 도움을 받았습니다. 모르는 문법이 나오면 바로 질문해서 답변을 얻고, 새로운 라이브러리를 만나면 핵심 용례만 빠르게 파악했습

클로드 코드 Dynamic Workflows: 수십 개 에이전트를 스크립트로 굴리기

클로드 코드 Dynamic Workflows: 수십 개 에이전트를 스크립트로 굴리기

클로드 코드를 쓰다 보면 어느 순간 이런 작업을 만나게 됩니다. "저장소 전체의 라우트 핸들러를 훑어서 인증 누락을 찾아줘", "컴포넌트 500개를 새 스타일 시스템으로 옮겨줘", "문서와 이슈를 여러 방향에서 조사한 뒤 서로 검증해서 보고서를 만들어줘" 같은 요청 말이죠. 이런 작업은 한 대화 안에서 차근차근 진행할 수도 있습니다. 하지만 파일이 많아지고 검증 단계가 늘어나면 컨텍스트가 금방 지저분해지고, Claude가 어느 파일을 봤는지, 어떤 결과를 검증했는지 사람이 계속 추적해야 합니다. 서브 에이전트를 여러 번 호출하는 방

Cargo features로 조건부 컴파일과 선택적 의존성 다루기

Cargo features로 조건부 컴파일과 선택적 의존성 다루기

Rust로 크레이트를 가져다 쓰다 보면 Cargo.toml에서 이런 줄을 한 번쯤 보셨을 거예요. 여기서 features는 대체 뭘까요? 왜 어떤 크레이트는 그냥 추가하면 되는데, 어떤 크레이트는 ["derive"]나 ["full"] 같은 걸 콕 집어줘야 제대로 동작할까요? 🤔 Cargo features는 크레이트의 기능을 조건부로 켜고 끄는 스위치입니다. 크레이트를 만드는 쪽에서는 "이 기능은 옵션이야"라고 미리 나눠두고, 쓰는 쪽에서는 필요한 것만 골라서 켤 수 있죠. 덕분에 안 쓰는 기능까지 컴파일하느라 빌드가 느려지거나 바

Discord