<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>sevin.dev | blog</title>
    <link>https://blog.sevin.dev</link>
    <description>배우고 기록하는 개발자의 공간</description>
    <language>ko</language>
    <atom:link href="https://blog.sevin.dev/feed.xml" rel="self" type="application/rss+xml"/>
    
    <item>
      <title><![CDATA[좋은 테스트란 무엇일까, 개발자라면 모두가 마주치는 테스트 이야기]]></title>
      <link>https://blog.sevin.dev/posts/piki-server-test-strategy</link>
      <guid isPermaLink="true">https://blog.sevin.dev/posts/piki-server-test-strategy</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[이상적인 소프트웨어 이론은 다들 안다. 근데 마감이 정해진 프로젝트에선 내 시간만 쓸 수가 없다. TDD의 장점을 인정하면서도, 현실과의 트레이드오프 안에서 내가 잡은 균형. 복구 가능한 에러는 전부 4xx로 명시하고, 그 에러 경로를 빠짐없이 테스트로 막는 이야기.]]></description>
      <category><![CDATA[백엔드]]></category>
    </item>
    <item>
      <title><![CDATA[비밀번호 없는 admin 페이지, 슬랙으로 내 IP를 등록해 여는 PiKi 운영 백오피스]]></title>
      <link>https://blog.sevin.dev/posts/piki-admin-slack-ip-gate</link>
      <guid isPermaLink="true">https://blog.sevin.dev/posts/piki-admin-slack-ip-gate</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[운영자가 알림 문구 하나 고치려고 매번 배포를 부탁하던 걸 없애고 싶었다. 근데 그 백오피스를 prod에 띄우자니 비밀번호로 막기도, IP로 막기도 애매했다. 결국 슬랙으로 내 IP를 등록해 여는, 비밀번호 없는 문을 만들었다.]]></description>
      <category><![CDATA[백엔드]]></category>
    </item>
    <item>
      <title><![CDATA[이 글, AI가 썼을까? — raw AI와 'AI 티 지우개'로 윤문한 글, 직접 구분하기]]></title>
      <link>https://blog.sevin.dev/posts/ai-or-not-guess</link>
      <guid isPermaLink="true">https://blog.sevin.dev/posts/ai-or-not-guess</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[같은 사건을 쓴 주니어 장애 회고 두 개. 하나는 AI가 그냥 뽑은 raw 버전, 다른 하나는 'AI 티'를 지워주는 도구로 윤문한 버전이다. 어느 쪽이 손 안 댄 AI인지 가려낼 수 있을까. 정답은 본문에서 드래그하면 드러난다. 한국어 AI 글의 문체 지문을 직접 확인하는 실험이다.]]></description>
      <category><![CDATA[일상]]></category>
    </item>
    <item>
      <title><![CDATA[ADD(Agent-Driven Development)에서의 터미널 — iTerm2에서 cmux까지]]></title>
      <link>https://blog.sevin.dev/posts/add-terminal-cmux</link>
      <guid isPermaLink="true">https://blog.sevin.dev/posts/add-terminal-cmux</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[IntelliJ는 env 볼 때나 켜고, 터미널만 네 개 띄워놓고 에이전트를 병렬로 돌린다. 그러다 깨달았다 — 병목은 터미널이었다. iTerm2에서 tmux를 거쳐 cmux로 갈아타며, 에이전트 시대의 터미널이 무엇이어야 하는지 정리한 기록.]]></description>
      <category><![CDATA[일상]]></category>
    </item>
    <item>
      <title><![CDATA[백준이 사라졌다]]></title>
      <link>https://blog.sevin.dev/posts/boj-is-gone</link>
      <guid isPermaLink="true">https://blog.sevin.dev/posts/boj-is-gone</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[잘하지도 못했고, 대회에 나간 적도 없다. 그냥 그 사이트가 있었다.]]></description>
      <category><![CDATA[회고]]></category>
    </item>
    <item>
      <title><![CDATA[JWT 토큰 어디에 둘까 — 쿠키만 박았던 이유가 익숙함이었다는 깨달음 (Web · Native · WebView)]]></title>
      <link>https://blog.sevin.dev/posts/jwt-where-to-put-token</link>
      <guid isPermaLink="true">https://blog.sevin.dev/posts/jwt-where-to-put-token</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[웹 only 환경에선 httpOnly 쿠키가 정답이었는데, Native · WebView 까지 환경이 셋이 되니 그 답이 깨졌다. body 채널을 왜 망설였는지부터 dual contract 까지, 책임 분담을 다시 따져본 기록.]]></description>
      <category><![CDATA[백엔드]]></category>
    </item>
    <item>
      <title><![CDATA[MCP 오케스트레이터 구축기 - 외부 MCP 서버 붙이기]]></title>
      <link>https://blog.sevin.dev/posts/mcp-orchestrator-3</link>
      <guid isPermaLink="true">https://blog.sevin.dev/posts/mcp-orchestrator-3</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[직접 만든 오케스트레이터에 Playwright MCP를 붙여서 실제 브라우저를 제어했다. 코드 한 줄 안 바꾸고.]]></description>
      <category><![CDATA[백엔드]]></category>
    </item>
    <item>
      <title><![CDATA[MCP 오케스트레이터 구축기 - 오케스트레이터 설계]]></title>
      <link>https://blog.sevin.dev/posts/mcp-orchestrator-2</link>
      <guid isPermaLink="true">https://blog.sevin.dev/posts/mcp-orchestrator-2</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[MCP 서버가 여러 개가 되는 순간 에이전트는 어디에 요청해야 할지 모른다. 그 문제를 오케스트레이터로 풀었다.]]></description>
      <category><![CDATA[백엔드]]></category>
    </item>
    <item>
      <title><![CDATA[MCP 오케스트레이터 구축기 - Spring AI로 MCP 서버 띄우기]]></title>
      <link>https://blog.sevin.dev/posts/mcp-orchestrator-1</link>
      <guid isPermaLink="true">https://blog.sevin.dev/posts/mcp-orchestrator-1</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[MCP를 클라이언트로만 쓰다가, 직접 서버를 만들어야 하는 상황이 됐다.]]></description>
      <category><![CDATA[백엔드]]></category>
    </item>
    <item>
      <title><![CDATA[블로그 개발기 - 댓글 알림 구현과 구글 검색 등록]]></title>
      <link>https://blog.sevin.dev/posts/google-search-console-resend</link>
      <guid isPermaLink="true">https://blog.sevin.dev/posts/google-search-console-resend</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[블로그를 만들고 나서 추가한 것들. 구글 검색에 노출되게 하고, 댓글이 달리면 이메일로 알림 받기.]]></description>
      <category><![CDATA[일상]]></category>
    </item>
    <item>
      <title><![CDATA[블로그 개발기 - AI도 내 블로그를 찾게 하자]]></title>
      <link>https://blog.sevin.dev/posts/aio-ai-optimization</link>
      <guid isPermaLink="true">https://blog.sevin.dev/posts/aio-ai-optimization</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[네이버에서 구글로, 구글에서 AI로. 검색 방식이 바뀌면 최적화 방식도 바뀐다.]]></description>
      <category><![CDATA[일상]]></category>
    </item>
    <item>
      <title><![CDATA[블로그 개발기 - Obsidian처럼, universe 뷰 만들기]]></title>
      <link>https://blog.sevin.dev/posts/three-js-intro</link>
      <guid isPermaLink="true">https://blog.sevin.dev/posts/three-js-intro</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[Obsidian graph view 보고 이걸 블로그에 넣고 싶었다. Three.js로 포스트들을 3D 공간에 띄운 과정.]]></description>
      <category><![CDATA[일상]]></category>
    </item>
    <item>
      <title><![CDATA[블로그 개발기 - 블로그를 시작하며]]></title>
      <link>https://blog.sevin.dev/posts/starting-the-blog</link>
      <guid isPermaLink="true">https://blog.sevin.dev/posts/starting-the-blog</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[배운 걸 기록하지 않으면 금방 잊는다는 걸 몸으로 배웠다.]]></description>
      <category><![CDATA[일상]]></category>
    </item>
    <item>
      <title><![CDATA[linkat 개발기 - 링크 아카이빙 서비스]]></title>
      <link>https://blog.sevin.dev/posts/linkat-devlog</link>
      <guid isPermaLink="true">https://blog.sevin.dev/posts/linkat-devlog</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[브라우징 중에 링크를 저장하는 게 이렇게 귀찮을 줄 몰랐다. 그래서 직접 만들었다.]]></description>
      <category><![CDATA[사이드프로젝트]]></category>
    </item>
    <item>
      <title><![CDATA[블로그 개발기 - 서버가 필요 없는데 서버를 만들었다]]></title>
      <link>https://blog.sevin.dev/posts/blog-backend-retrospective</link>
      <guid isPermaLink="true">https://blog.sevin.dev/posts/blog-backend-retrospective</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[블로그 하나 만들면서 과설계했다가 다 갈아엎은 얘기.]]></description>
      <category><![CDATA[일상]]></category>
    </item>
    <item>
      <title><![CDATA[Next.js App Router 제대로 이해하기]]></title>
      <link>https://blog.sevin.dev/posts/next-js-app-router</link>
      <guid isPermaLink="true">https://blog.sevin.dev/posts/next-js-app-router</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[Page Router 쓰다가 App Router로 넘어오면서 한동안 계속 헷갈렸던 것들.]]></description>
      <category><![CDATA[프론트엔드]]></category>
    </item>
    <item>
      <title><![CDATA[Spring Boot + JPA 삽질 모음]]></title>
      <link>https://blog.sevin.dev/posts/spring-boot-jpa</link>
      <guid isPermaLink="true">https://blog.sevin.dev/posts/spring-boot-jpa</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[이론으로 알던 것들이 실제로 터지고 나서야 제대로 이해했다.]]></description>
      <category><![CDATA[백엔드]]></category>
    </item>
    <item>
      <title><![CDATA[TypeScript 유용한 패턴들]]></title>
      <link>https://blog.sevin.dev/posts/typescript-tips</link>
      <guid isPermaLink="true">https://blog.sevin.dev/posts/typescript-tips</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[쓸 때마다 '아 이게 있었지' 하고 찾아보게 되는 것들 모음.]]></description>
      <category><![CDATA[프론트엔드]]></category>
    </item>
    <item>
      <title><![CDATA[CSS-in-JS vs 순수 CSS, 뭘 써야 할까]]></title>
      <link>https://blog.sevin.dev/posts/css-in-js-vs-css</link>
      <guid isPermaLink="true">https://blog.sevin.dev/posts/css-in-js-vs-css</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[styled-components 쓰다가 App Router에서 막혀서 결국 갈아엎은 이야기.]]></description>
      <category><![CDATA[프론트엔드]]></category>
    </item>
    <item>
      <title><![CDATA[N+1, 직접 겪어보니까]]></title>
      <link>https://blog.sevin.dev/posts/n-plus-one</link>
      <guid isPermaLink="true">https://blog.sevin.dev/posts/n-plus-one</guid>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
      <description><![CDATA[쿼리 로그 켜놓고 보니까 Post 10개 조회하는데 쿼리가 11번 나가고 있었다.]]></description>
      <category><![CDATA[백엔드]]></category>
    </item>
  </channel>
</rss>