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

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

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

OrbStack으로 macOS에서 Docker와 Linux 사용하기

OrbStack으로 macOS에서 Docker와 Linux 사용하기

macOS에서 개발하다 보면 웹 서버 하나를 확인하려고 Docker Desktop을 켜는 일이 자주 생기는데요. 컨테이너 몇 개만 실행하면 되는데 관리 화면이나 설정이 복잡하게 느껴질 때도 있습니다. 터미널에서는 익숙한 Docker 명령어를 쓰고, 실행 중인 서비스를 앱에서 바로 확인할 수 있다면 편하겠죠? OrbStack은 이런 작업에 사용할 수 있는 macOS용 도구입니다. 이번 글에서는 OrbStack을 설치하고 컨테이너를 실행한 뒤, 개발용 도메인과 Linux 머신까지 사용해 보겠습니다. Docker Desktop에서 옮겨

Agent Router: AAIF에 합류한 두 번째 에이전트 게이트웨이

Agent Router: AAIF에 합류한 두 번째 에이전트 게이트웨이

지난 6월에 agentgateway 글을 올리면서 AAIF에 막 합류한 에이전트 게이트웨이라고 소개했는데요. 그런데 9월 9일, AAIF 블로그에 또 하나의 게이트웨이가 합류했다는 발표가 올라왔습니다. Envoy AI Gateway라는 이름으로 알려져 있던 프로젝트가 Agent Router로 이름을 바꾸고 재단에 들어온 거예요. 한 재단에 게이트웨이가 둘이라니 좀 이상하지 않나요? 🤔 둘 다 에이전트 앞에 앉아서 MCP 서버와 LLM 호출을 받아내겠다고 하니 겹치는 게 당연해 보이는데, 막상 들여다보면 출발점이 꽤 다릅니다. 이번

Meat Proxy가 되지 마세요

Meat Proxy가 되지 마세요

동료의 질문을 AI에 그대로 넣고 나온 답변을 복붙해서 답장하신 적이 있으신가요? 아니면 에이전트가 짜준 코드를 읽어 보지도 않고 PR 설명까지 써달라고 한 후 동료에게 코드 리뷰를 요청하신 적이 있으신가요? 반대로 동료에게 이런 답변이나 리뷰 요청을 받아본 적은요? 이렇게 AI가 뱉은 결과물을 읽지도, 이해하지도, 검증하지도 않고 그대로 타인에게 넘기는 사람을 요즘 Meat Proxy라고 많이 부릅니다. 🥩 굳이 한국어로 옮기자면 "살로 된 중계기" 정도가 될 것 같네요. AI 시대에 우리가 경계해야 할 행태를 뼈아프게 꼬집는

GitHub Agentic Workflows: 마크다운으로 쓰는 AI 저장소 자동화

GitHub Agentic Workflows: 마크다운으로 쓰는 AI 저장소 자동화

GitHub Actions로 저장소를 자동화하다 보면 어느 순간 벽에 부딪힙니다. 새 이슈가 열릴 때 알맞은 라벨을 붙여주고 싶은데, 그 규칙을 조건문으로 적으려니 답이 안 나오는 거죠. 제목에 "버그"가 들어가면 bug 라벨을 붙이자고 시작하지만, 정작 사용자가 올리는 이슈는 "로그인하면 화면이 하얘져요" 같은 문장이거든요. 😅 이런 일은 규칙이 아니라 판단이 필요한 작업입니다. 이슈를 읽고, 무슨 말인지 이해하고, 빠진 정보가 무엇인지 알아채야 하니까요. 사람이 하기엔 지루하고 기계가 하기엔 애매한, 딱 그 사이에 있는 일이죠

AI가 쓴 글에 남는 워터마크는 어떻게 동작할까요?

AI가 쓴 글에 남는 워터마크는 어떻게 동작할까요?

이 글은 사람이 쓴 걸까요, AI가 쓴 걸까요? 요즘 리뷰 하나, 과제 하나, 기사 하나를 두고도 이 질문이 따라붙는데요. 답을 내려주겠다는 탐지 서비스는 많지만 대부분 문체를 보고 짐작하는 수준이라, 억울하게 걸리는 사람과 유유히 빠져나가는 글이 함께 생깁니다. 😅 그래서 모델을 만드는 쪽이 아예 표시를 남기는 방향으로 움직이고 있습니다. Google은 Gemini가 쓴 글에 워터마크를 심어 왔고, Anthropic도 2026년 8월 14일 Claude에 같은 방식을 적용한다고 발표했습니다. 짐작이 아니라 확인을 하겠다는 이야기

클로드 코드 Artifacts: 세션 결과물을 링크 하나로 공유하기

클로드 코드 Artifacts: 세션 결과물을 링크 하나로 공유하기

터미널에서 클로드 코드로 장애 원인을 한참 파헤쳤는데, 결과를 팀에 공유하려니 막막했던 적 있으신가요? 표를 마크다운으로 옮기고 스크린샷을 찍어 슬랙에 긴 글을 올렸는데 정작 동료는 "그래서 어느 서비스가 문제라는 거야?"라고 되묻습니다 😅 터미널 텍스트는 만든 사람에게는 충분해도 받는 사람에게는 읽기 힘든 매체거든요. Anthropic이 2026년 6월 클로드 코드에 추가한 Artifacts는 이 간극을 메우는 기능입니다. 세션에서 만든 결과물을 claude.ai에 웹 페이지로 게시해 링크 하나로 공유하고 세션이 이어지는 동안

Rust 기초: LazyLock과 OnceLock으로 전역 값 지연 초기화하기

Rust 기초: LazyLock과 OnceLock으로 전역 값 지연 초기화하기

전역에 룩업 테이블(lookup table) 하나 두고 싶을 뿐인데, Rust에서는 이게 생각보다 까다롭습니다. 해시맵을 static으로 선언하려고 하면 컴파일러가 바로 막아서거든요. static에 넣는 값은 컴파일 시점에 계산이 끝나 있어야 하는데, HashMap::from은 실행 중에 힙을 할당하니 안 된다는 뜻입니다. 예전에는 lazy_static! 매크로나 once_cell 크레이트(crate)를 받아 와서 풀던 문제인데요. 이제는 외부 의존성 없이 해결됩니다. 에러 메시지 마지막 줄에서 컴파일러가 이미 답을 알려주고 있네요

QUIC: UDP 위에 신뢰성을 새로 쌓은 전송 프로토콜

QUIC: UDP 위에 신뢰성을 새로 쌓은 전송 프로토콜

새 전송 프로토콜을 만든다는 건 웬만해선 벌이지 않는 일입니다. TCP는 40년 넘게 인터넷을 떠받쳐 왔고, 그동안 쌓인 개선안도 한둘이 아니거든요. 그런데도 구글은 2012년에 TCP를 고치는 대신 UDP 위에 새 프로토콜을 얹기 시작했고, 그게 지금의 QUIC가 되었습니다. HTTP 글에서 HTTP/3를 다루며 QUIC를 잠깐 언급했는데요. 이번에는 QUIC 자체를 놓고, 왜 굳이 바닥부터 새로 만들었는지 그리고 그래서 무엇이 달라졌는지를 짚어보겠습니다. 왜 TCP를 고치지 못했을까 TCP에 없는 기능을 넣자는 제안은 늘 있었습

OpenSSF Scorecard로 오픈소스 저장소 보안 점수 매기기

OpenSSF Scorecard로 오픈소스 저장소 보안 점수 매기기

npm에서 라이브러리를 하나 고를 때 무엇을 보시나요? 저는 스타 수만 보고 정하지는 않습니다. 저장소에 들어가서 이슈에 답이 잘 달리는지, 릴리스가 꾸준한지, 기여자가 몇 명이나 되는지를 훑어보죠. 그런데 그렇게 살펴봐도 손에 남는 건 "괜찮아 보인다"는 인상뿐입니다. 왜 이걸 골랐냐고 누가 물으면 딱 떨어지는 근거를 대기가 어렵고, node_modules에 딸려 들어온 수백 개의 간접 의존성을 하나하나 같은 눈으로 볼 수도 없고요. 눈으로 하는 판단은 저 혼자 쓰고 끝나는 데다, 개수가 늘어나면 금방 감당이 안 됩니다. 게다가

TSRX: JSX의 뒤를 잇는 TypeScript UI 언어 확장

TSRX: JSX의 뒤를 잇는 TypeScript UI 언어 확장

React 컴포넌트를 쓰다 보면 이런 코드를 한 번쯤 마주치게 되는데요. 로딩, 에러, 목록, 빈 상태를 구분하는 평범한 요구사항인데 정작 코드는 괄호를 세 겹 열고 삼항 연산자를 두 번 중첩합니다. 자바스크립트에는 if도 있고 for도 있는데, JSX 안에서는 이 문법들을 쓸 수 없어서 전부 표현식으로 바꿔 끼워 넣어야 하기 때문입니다. 😅 TSRX는 바로 이 지점을 건드리는 프로젝트입니다. 이번 포스팅에서는 TSRX가 어떤 문법을 제공하고, 왜 이런 문법이 지금 나왔는지 살펴보겠습니다. TSRX는 무엇인가요? TSRX는 Typ

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

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

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

Bun 1.4 출시: Zig에서 Rust로 다시 쓴 자바스크립트 런타임

Bun 1.4 출시: Zig에서 Rust로 다시 쓴 자바스크립트 런타임

2026년 8월 20일에 Bun 1.4가 출시되었습니다. 저는 릴리스 노트를 열어보고 잠깐 스크롤을 멈췄는데요. 보통 이런 글은 새 API 목록으로 시작하는데, 이번에는 첫 문단부터 "Bun을 Zig에서 Rust로 다시 썼다"는 문장이 나오더라고요 🤯 런타임의 구현 언어를 통째로 바꾼다는 건 자동차가 달리는 중에 엔진을 갈아 끼우는 일에 가깝습니다. 그런데 이번 릴리스는 그 소식 말고도 볼 게 많습니다. Node.js 호환성 테스트가 1,517개 늘었고, 이미지 처리와 크론, 마크다운 파서가 표준 라이브러리로 들어왔으며, bun

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

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

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

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

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

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

C2PA: 이미지가 어디서 왔는지 서명으로 증명하기

C2PA: 이미지가 어디서 왔는지 서명으로 증명하기

LinkedIn을 넘기다가 이미지 모서리에 붙은 작은 Cr 배지를 보신 적 있으신가요? 눌러 보면 이 이미지를 어떤 도구로 언제 만들었는지, 생성형 AI가 관여했는지가 주르륵 나옵니다. 😮 궁금해서 뜯어봤더니 LinkedIn이 이미지를 분석해 알아낸 게 아니었습니다. 이미지 파일 안에 그 기록이 서명된 채로 들어 있고, LinkedIn은 그걸 읽어서 보여줄 뿐이었는데요. 그 기록의 표준이 C2PA(Coalition for Content Provenance and Authenticity)입니다. 생각해 보면 필요한 물건입니다. 사진

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

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

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

Discord