
  <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
      <title>Junyoung Yang</title>
      <link>https://tailwind-nextjs-starter-blog.vercel.app/blog</link>
      <description>Junyoung Yang</description>
      <language>ko</language>
      <managingEditor>y@jun0.dev (Junyoung Yang)</managingEditor>
      <webMaster>y@jun0.dev (Junyoung Yang)</webMaster>
      <lastBuildDate>Mon, 27 Apr 2026 00:00:00 GMT</lastBuildDate>
      <atom:link href="https://tailwind-nextjs-starter-blog.vercel.app/feed.xml" rel="self" type="application/rss+xml"/>
      
  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/ollama-to-vllm-serving</guid>
    <title>AI 조교 기획 및 Ollama를 vLLM으로 전환해 동시 사용자 50명 처리하기</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/ollama-to-vllm-serving</link>
    <description>Ollama 기반 LLM 서버에서 동시 요청 증가 시 발생하는 성능 병목을 분석하고, vLLM으로 서버를 전환해 동시 사용자 50명 수준까지 안정적으로 처리할 수 있도록 개선한 과정과 결과를 정리했습니다.</description>
    <pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>대표글</category><category>llm</category><category>vllm</category><category>kubernetes</category><category>infra</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/ollama-to-vllm-serving</guid>
    <title>Planning an AI Teaching Assistant and Moving from Ollama to vLLM to Handle 50 Concurrent Users</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/ollama-to-vllm-serving</link>
    <description>I analyzed the performance bottlenecks that appeared when concurrent requests increased on an Ollama-based LLM server, then moved the serving layer to vLLM so it could stably handle around 50 concurrent users.</description>
    <pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>대표글</category><category>llm</category><category>vllm</category><category>kubernetes</category><category>infra</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/k3s-vllm-gpu-workload</guid>
    <title>k3s에서 vLLM GPU 워크로드 실행하기</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/k3s-vllm-gpu-workload</link>
    <description>Code Place의 AI 조교 기능을 운영 클러스터에서 실행하기 위해 드라이버, NVIDIA runtime, k3s containerd 설정, RuntimeClass, device plugin을 맞춰간 기록입니다.</description>
    <pubDate>Sun, 26 Apr 2026 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>대표글</category><category>kubernetes</category><category>k3s</category><category>vllm</category><category>cuda</category><category>infra</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/k3s-vllm-gpu-workload</guid>
    <title>Running a vLLM GPU Workload on k3s</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/k3s-vllm-gpu-workload</link>
    <description>How I prepared a k3s cluster to run Code Place AI assistant workloads with NVIDIA drivers, container runtime configuration, RuntimeClass, and device plugin checks.</description>
    <pubDate>Sun, 26 Apr 2026 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>대표글</category><category>kubernetes</category><category>k3s</category><category>vllm</category><category>cuda</category><category>infra</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/longhorn-cnpg-troubleshooting</guid>
    <title>Longhorn·CNPG 장애 원인 추적</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/longhorn-cnpg-troubleshooting</link>
    <description>Code Place 운영 중 PostgreSQL 인스턴스 문제처럼 보였던 장애를 Kubernetes, CloudNativePG, Longhorn, 노드 레이어로 나눠 확인하며 원인을 좁혀간 기록입니다.</description>
    <pubDate>Sat, 25 Apr 2026 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>대표글</category><category>kubernetes</category><category>longhorn</category><category>cnpg</category><category>postgresql</category><category>infra</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/longhorn-cnpg-troubleshooting</guid>
    <title>Tracing a Longhorn and CloudNativePG Failure</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/longhorn-cnpg-troubleshooting</link>
    <description>How I narrowed down a PostgreSQL startup issue in Code Place by separating CloudNativePG, Kubernetes, Longhorn, and node-level storage signals.</description>
    <pubDate>Sat, 25 Apr 2026 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>대표글</category><category>kubernetes</category><category>longhorn</category><category>cnpg</category><category>postgresql</category><category>infra</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/longhorn-mount-conflict-multipathd</guid>
    <title>Longhorn mount conflict와 multipathd 간섭 문제</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/longhorn-mount-conflict-multipathd</link>
    <description>Code Place 운영 중 Longhorn 볼륨 마운트 실패를 Kubernetes 이벤트, share-manager 상태, ext4 메시지, multipathd 간섭 가능성까지 내려가며 추적한 기록입니다.</description>
    <pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>대표글</category><category>longhorn</category><category>kubernetes</category><category>linux</category><category>storage</category><category>infra</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/longhorn-mount-conflict-multipathd</guid>
    <title>Longhorn Mount Conflict and multipathd Interference</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/longhorn-mount-conflict-multipathd</link>
    <description>How I traced a Longhorn volume mount failure through Kubernetes events, share-manager state, ext4 messages, and possible multipathd interference.</description>
    <pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>대표글</category><category>longhorn</category><category>kubernetes</category><category>linux</category><category>storage</category><category>infra</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/cnpg-rw-ro-endpoints</guid>
    <title>CNPG RW·RO 엔드포인트 구분하기</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/cnpg-rw-ro-endpoints</link>
    <description>Code Place 운영 중 read-only transaction 오류를 통해 CloudNativePG의 read-write, read-only 서비스 엔드포인트를 다시 확인한 기록입니다.</description>
    <pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>대표글</category><category>cnpg</category><category>postgresql</category><category>kubernetes</category><category>database</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/cnpg-rw-ro-endpoints</guid>
    <title>Separating RW and RO Endpoints in CloudNativePG</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/cnpg-rw-ro-endpoints</link>
    <description>How a read-only transaction error led me to verify CloudNativePG read-write and read-only service endpoints in Code Place.</description>
    <pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>대표글</category><category>cnpg</category><category>postgresql</category><category>kubernetes</category><category>database</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/grit-redis-room-state-sync</guid>
    <title>GRIT에서 Redis로 방 상태 동기화하기</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/grit-redis-room-state-sync</link>
    <description>GRIT 실시간 화상 스터디 서비스에서 타이머, 발표자, 마이크 권한 같은 방 상태를 멀티 인스턴스 환경에서 일관되게 관리하기 위해 Redis Hash와 ZSET을 사용한 기록입니다.</description>
    <pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>대표글</category><category>spring-boot</category><category>redis</category><category>livekit</category><category>webrtc</category><category>realtime</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/grit-redis-room-state-sync</guid>
    <title>Synchronizing GRIT Room State with Redis</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/grit-redis-room-state-sync</link>
    <description>How I used Redis Hash and ZSET to keep timers, presenters, and microphone permissions consistent across multiple instances in GRIT.</description>
    <pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>대표글</category><category>spring-boot</category><category>redis</category><category>livekit</category><category>webrtc</category><category>realtime</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/spring-security-filter-exception-handling</guid>
    <title>Spring Security 필터 예외 처리 방식 정리</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/spring-security-filter-exception-handling</link>
    <description>GRIT에서 JWT 인증 필터 에러가 공통 응답이 아니라 톰캣 500 에러로 내려오던 문제를 계기로 Spring Security의 예외 처리 경계를 정리한 기록입니다.</description>
    <pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>대표글</category><category>spring-security</category><category>jwt</category><category>spring-boot</category><category>backend</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/spring-security-filter-exception-handling</guid>
    <title>Handling Exceptions in Spring Security Filters</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/spring-security-filter-exception-handling</link>
    <description>How I handled JWT filter exceptions in GRIT after authentication errors bypassed the common controller exception response.</description>
    <pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>대표글</category><category>spring-security</category><category>jwt</category><category>spring-boot</category><category>backend</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/entity-validation-refactoring</guid>
    <title>반복 null 체크를 줄인 엔티티 검증 로직 리팩토링</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/entity-validation-refactoring</link>
    <description>GRIT의 사용자 프로필 초기화·수정 로직에서 검증과 대입이 반복되던 문제를 엔티티 내부 책임으로 정리한 기록입니다.</description>
    <pubDate>Sun, 01 Mar 2026 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>java</category><category>refactoring</category><category>validation</category><category>domain-model</category><category>backend</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/entity-validation-refactoring</guid>
    <title>Refactoring Repeated Entity Validation Logic</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/entity-validation-refactoring</link>
    <description>How I moved repeated null and blank checks in GRIT profile logic into entity-level state change methods.</description>
    <pubDate>Sun, 01 Mar 2026 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>java</category><category>refactoring</category><category>validation</category><category>domain-model</category><category>backend</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/grit-observability-prometheus-loki-grafana</guid>
    <title>GRIT 모니터링 구성: Prometheus + Loki + Grafana + Spring Actuator</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/grit-observability-prometheus-loki-grafana</link>
    <description>GRIT 운영을 준비하며 Spring Actuator, Prometheus, Loki, Grafana로 메트릭과 로그를 수집하고 확인할 수 있게 구성한 기록입니다.</description>
    <pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>spring-boot</category><category>prometheus</category><category>loki</category><category>grafana</category><category>monitoring</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/grit-observability-prometheus-loki-grafana</guid>
    <title>Monitoring GRIT with Prometheus, Loki, Grafana, and Spring Actuator</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/grit-observability-prometheus-loki-grafana</link>
    <description>How I prepared basic monitoring for GRIT with Spring Actuator, Prometheus, Loki, and Grafana.</description>
    <pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>spring-boot</category><category>prometheus</category><category>loki</category><category>grafana</category><category>monitoring</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/timetable-ai-recognition</guid>
    <title>시간표 이미지 AI 인식 및 프롬프트 개선</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/timetable-ai-recognition</link>
    <description>UniSchedule에서 시간표 이미지를 안정적인 일정 데이터로 바꾸기 위해 GPT Vision과 구조화 출력을 사용하며 프롬프트를 개선한 기록입니다.</description>
    <pubDate>Sat, 25 Oct 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>ai</category><category>prompt-engineering</category><category>structured-output</category><category>backend</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/timetable-ai-recognition</guid>
    <title>Improving AI Timetable Recognition and Prompt Design</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/timetable-ai-recognition</link>
    <description>How I used GPT Vision and structured output to convert timetable images into reliable schedule data in UniSchedule.</description>
    <pubDate>Sat, 25 Oct 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>ai</category><category>prompt-engineering</category><category>structured-output</category><category>backend</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/unischedule-redis-pubsub-schedule-events</guid>
    <title>멀티 인스턴스 환경에서 채팅 메시지 전파하기: Redis Pub/Sub</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/unischedule-redis-pubsub-schedule-events</link>
    <description>팀 일정 관리 서비스(UniSchedule) 개발 중 발생한 멀티 인스턴스 환경의 채팅 메시지 전파 문제를 Redis Pub/Sub의 도입으로 해결해보았습니다.</description>
    <pubDate>Mon, 20 Oct 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>대표글</category><category>spring-boot</category><category>redis</category><category>pubsub</category><category>aws</category><category>architecture</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/unischedule-redis-pubsub-schedule-events</guid>
    <title>Propagating Chat Messages in a Multi-Instance Environment with Redis Pub/Sub</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/unischedule-redis-pubsub-schedule-events</link>
    <description>How I fixed chat message propagation issues in UniSchedule by introducing Redis Pub/Sub for a multi-instance backend environment.</description>
    <pubDate>Mon, 20 Oct 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>대표글</category><category>spring-boot</category><category>redis</category><category>pubsub</category><category>aws</category><category>architecture</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/webclient-vs-resttemplate</guid>
    <title>WebClient와 RestTemplate 선택 기준 정리</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/webclient-vs-resttemplate</link>
    <description>UniSchedule에서 외부 API를 연동하며 RestTemplate과 WebClient 사이에서 공식 지원 방향, 설정 유연성, 현재 MVC 구조와의 균형을 기준으로 선택한 기록입니다.</description>
    <pubDate>Mon, 15 Sep 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>spring</category><category>webclient</category><category>http-client</category><category>backend</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/webclient-vs-resttemplate</guid>
    <title>Choosing Between WebClient and RestTemplate</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/webclient-vs-resttemplate</link>
    <description>How I chose WebClient for external API integration in UniSchedule by considering official direction, configuration flexibility, and the current MVC architecture.</description>
    <pubDate>Mon, 15 Sep 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>spring</category><category>webclient</category><category>http-client</category><category>backend</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/ondelete-vs-jpa-cascade</guid>
    <title>@OnDelete와 JPA Cascade 선택 기준 정리</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/ondelete-vs-jpa-cascade</link>
    <description>상품 삭제 시 옵션까지 함께 삭제해야 하는 요구사항에서 Hibernate @OnDelete와 JPA Cascade를 비교하며 영속성 컨텍스트 일관성을 기준으로 선택한 기록입니다.</description>
    <pubDate>Wed, 25 Jun 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>jpa</category><category>hibernate</category><category>cascade</category><category>database</category><category>backend</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/ondelete-vs-jpa-cascade</guid>
    <title>Choosing Between @OnDelete and JPA Cascade</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/ondelete-vs-jpa-cascade</link>
    <description>How I compared Hibernate @OnDelete and JPA Cascade for deleting product options while keeping persistence context consistency in mind.</description>
    <pubDate>Wed, 25 Jun 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>jpa</category><category>hibernate</category><category>cascade</category><category>database</category><category>backend</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/circular-reference-lazy-limit</guid>
    <title>순환 참조 문제와 @Lazy 적용의 한계</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/circular-reference-lazy-limit</link>
    <description>선물하기 API 구현 중 ProductService와 OptionService가 서로 참조하며 발생한 순환 참조 문제를 @Lazy로 덮지 않고 의존 방향과 책임 분리 관점에서 다시 본 기록입니다.</description>
    <pubDate>Fri, 20 Jun 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>spring</category><category>dependency-injection</category><category>architecture</category><category>backend</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/circular-reference-lazy-limit</guid>
    <title>Circular Dependencies and the Limit of @Lazy</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/circular-reference-lazy-limit</link>
    <description>How I used a circular dependency between ProductService and OptionService as a signal to revisit responsibility boundaries instead of just hiding it with @Lazy.</description>
    <pubDate>Fri, 20 Jun 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>spring</category><category>dependency-injection</category><category>architecture</category><category>backend</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/pageable-input-validation</guid>
    <title>Pageable 입력 검증: PageRequestDto 설계</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/pageable-input-validation</link>
    <description>Spring Pageable을 그대로 노출했을 때 정렬 기준과 페이지 크기 계약이 느슨해지는 문제를 PageRequestDto로 통제한 기록입니다.</description>
    <pubDate>Wed, 18 Jun 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>spring</category><category>pagination</category><category>validation</category><category>api-design</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/pageable-input-validation</guid>
    <title>Validating Pageable Input with PageRequestDto</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/pageable-input-validation</link>
    <description>How I controlled page size and sort fields by wrapping Spring Pageable input with a request DTO.</description>
    <pubDate>Wed, 18 Jun 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>spring</category><category>pagination</category><category>validation</category><category>api-design</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/pagination-count-query-cost</guid>
    <title>JPA Page의 숨겨진 비용: count 쿼리</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/pagination-count-query-cost</link>
    <description>목록 조회 API를 만들며 Page가 자동으로 수행하는 count 쿼리 비용을 확인하고, Page와 Slice를 어떤 기준으로 선택할지 정리한 기록입니다.</description>
    <pubDate>Sun, 15 Jun 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>jpa</category><category>pagination</category><category>spring-data</category><category>performance</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/pagination-count-query-cost</guid>
    <title>Reducing Count Query Cost in Pagination</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/pagination-count-query-cost</link>
    <description>How I compared Page and Slice after reviewing the cost of automatic count queries in list APIs.</description>
    <pubDate>Sun, 15 Jun 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>jpa</category><category>pagination</category><category>spring-data</category><category>performance</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/jpa-n-plus-one-problem</guid>
    <title>JPA N+1 문제: 원인 분석부터 해결까지</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/jpa-n-plus-one-problem</link>
    <description>선물하기 API에서 연관 데이터를 조회하며 발생할 수 있는 JPA N+1 문제를 Fetch Join, EntityGraph, Batch Size 관점에서 비교한 기록입니다.</description>
    <pubDate>Tue, 10 Jun 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>jpa</category><category>hibernate</category><category>spring</category><category>performance</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/jpa-n-plus-one-problem</guid>
    <title>JPA N+1 Problem: Cause and Fix Options</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/jpa-n-plus-one-problem</link>
    <description>A comparison of Fetch Join, EntityGraph, and Batch Size while handling related data queries in a gift API.</description>
    <pubDate>Tue, 10 Jun 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>jpa</category><category>hibernate</category><category>spring</category><category>performance</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/rest-delete-body-design</guid>
    <title>REST API DELETE 요청에서 Body 사용을 지양한 이유</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/rest-delete-body-design</link>
    <description>선물하기 API를 설계하면서 DELETE 요청에 데이터를 Body로 넘길지, Query Parameter나 Path Variable로 표현할지 검토한 기록입니다.</description>
    <pubDate>Wed, 28 May 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>rest-api</category><category>http</category><category>api-design</category><category>backend</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/rest-delete-body-design</guid>
    <title>Why I Avoided Request Body in REST DELETE APIs</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/rest-delete-body-design</link>
    <description>How I chose Path Variable over DELETE request body when designing a gift API delete endpoint.</description>
    <pubDate>Wed, 28 May 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>rest-api</category><category>http</category><category>api-design</category><category>backend</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/attacklab-buffer-overflow-writeup</guid>
    <title>AttackLab - Buffer Overflow Writeup</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/attacklab-buffer-overflow-writeup</link>
    <description>Buffer Overflow 취약점을 이용해 5개 Phase를 해체하는 AttackLab 풀이 기록입니다. Code Injection과 ROP(Return-Oriented Programming) 두 가지 기법을 사용했습니다.</description>
    <pubDate>Tue, 20 May 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>system-software</category><category>assembly</category><category>gdb</category><category>x86</category><category>buffer-overflow</category><category>rop</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/uuid-index-performance</guid>
    <title>UUID PK와 인덱스 성능: UUIDv4, ULID, UUIDv7 비교</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/uuid-index-performance</link>
    <description>프로젝트에서 식별자로 UUID를 사용할지 검토하며 UUIDv4, ULID, UUIDv7이 인덱스 성능과 정렬 특성에 어떤 차이를 갖는지 정리한 기록입니다.</description>
    <pubDate>Tue, 20 May 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>uuid</category><category>database</category><category>index</category><category>performance</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/attacklab-buffer-overflow-writeup</guid>
    <title>AttackLab - Buffer Overflow Writeup</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/attacklab-buffer-overflow-writeup</link>
    <description>A writeup for solving the five AttackLab phases with buffer overflow, code injection, and ROP(Return-Oriented Programming).</description>
    <pubDate>Tue, 20 May 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>system-software</category><category>assembly</category><category>gdb</category><category>x86</category><category>buffer-overflow</category><category>rop</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/uuid-index-performance</guid>
    <title>UUID PK and Index Performance: UUIDv4, ULID, and UUIDv7</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/uuid-index-performance</link>
    <description>A comparison of UUIDv4, ULID, and UUIDv7 from the perspective of index locality, ordering, and ID exposure.</description>
    <pubDate>Tue, 20 May 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>uuid</category><category>database</category><category>index</category><category>performance</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/bomblab-binary-bomb-writeup</guid>
    <title>BombLab - Binary Bomb Writeup</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/bomblab-binary-bomb-writeup</link>
    <description>주어진 Binary 파일을 GDB로 disassembly하고 디버깅하면서 6개 Phase와 Secret Phase를 해체한 BombLab 풀이 기록입니다.</description>
    <pubDate>Mon, 19 May 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>system-software</category><category>assembly</category><category>gdb</category><category>x86</category><category>reverse-engineering</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/bomblab-binary-bomb-writeup</guid>
    <title>BombLab - Binary Bomb Writeup</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/bomblab-binary-bomb-writeup</link>
    <description>A BombLab writeup for defusing six phases and the secret phase by disassembling and debugging the given binary with GDB.</description>
    <pubDate>Mon, 19 May 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>system-software</category><category>assembly</category><category>gdb</category><category>x86</category><category>reverse-engineering</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/application-validation-select-update</guid>
    <title>애플리케이션 계층에서 직접 검증이 필요한 이유</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/application-validation-select-update</link>
    <description>카카오테크캠퍼스 선물하기 API를 구현하며 DB 제약조건에만 맡길지, 애플리케이션에서 먼저 검증할지 고민한 기록입니다.</description>
    <pubDate>Thu, 15 May 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>spring</category><category>jpa</category><category>validation</category><category>database</category><category>backend</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/application-validation-select-update</guid>
    <title>Why Some Validation Belongs in the Application Layer</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/application-validation-select-update</link>
    <description>How I decided when to validate business rules in application code instead of relying only on database constraints.</description>
    <pubDate>Thu, 15 May 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>spring</category><category>jpa</category><category>validation</category><category>database</category><category>backend</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/rag-pipeline-llm-hallucination</guid>
    <title>RAG 파이프라인으로 LLM 환각 현상 완화하기</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/rag-pipeline-llm-hallucination</link>
    <description>DocDoc에서 의료 논문 기반 답변을 만들며, 질문만 LLM에 전달했을 때 생기는 근거 없는 답변 문제를 RAG와 SSE 스트리밍으로 줄인 기록입니다.</description>
    <pubDate>Tue, 15 Apr 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>rag</category><category>llm</category><category>pinecone</category><category>langchain</category><category>ai</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/rag-pipeline-llm-hallucination</guid>
    <title>Reducing LLM Hallucination with a RAG Pipeline</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/rag-pipeline-llm-hallucination</link>
    <description>How I used RAG and SSE streaming in DocDoc to make medical-paper-based answers more grounded and usable.</description>
    <pubDate>Tue, 15 Apr 2025 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>rag</category><category>llm</category><category>pinecone</category><category>langchain</category><category>ai</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/android-fragment-savedinstancestate</guid>
    <title>Android Fragment 생명주기와 savedInstanceState 문제 해결 기록</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/android-fragment-savedinstancestate</link>
    <description>Android 편의 앱을 만들며 백그라운드 복귀 후 Fragment 표시 상태가 깨지던 문제를 savedInstanceState와 생명주기 관점에서 해결한 초기 프로젝트 기록입니다.</description>
    <pubDate>Sun, 15 Mar 2020 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>android</category><category>fragment</category><category>lifecycle</category><category>debugging</category><category>early-project</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/android-fragment-savedinstancestate</guid>
    <title>Debugging Android Fragment Lifecycle and savedInstanceState</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/android-fragment-savedinstancestate</link>
    <description>An early project record of fixing Fragment state restoration issues after returning from the background in an Android utility app.</description>
    <pubDate>Sun, 15 Mar 2020 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>android</category><category>fragment</category><category>lifecycle</category><category>debugging</category><category>early-project</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/iot-tcp-socket-lighting</guid>
    <title>IoT 자율형 전등에서 TCP 소켓 서버 만들기</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/iot-tcp-socket-lighting</link>
    <description>IoT 자율형 전등 프로젝트에서 NodeMCU와 Android 앱 사이의 상태를 실시간으로 주고받기 위해 HTTP polling 대신 TCP 소켓 서버를 만들었던 초기 프로젝트 기록입니다.</description>
    <pubDate>Tue, 15 Oct 2019 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>nodejs</category><category>tcp</category><category>socket</category><category>iot</category><category>early-project</category>
  </item>

  <item>
    <guid>https://tailwind-nextjs-starter-blog.vercel.app/blog/iot-tcp-socket-lighting</guid>
    <title>Building a TCP Socket Server for an IoT Smart Light</title>
    <link>https://tailwind-nextjs-starter-blog.vercel.app/blog/iot-tcp-socket-lighting</link>
    <description>An early project record of building a TCP socket server between NodeMCU and an Android app for real-time smart light control.</description>
    <pubDate>Tue, 15 Oct 2019 00:00:00 GMT</pubDate>
    <author>y@jun0.dev (Junyoung Yang)</author>
    <category>nodejs</category><category>tcp</category><category>socket</category><category>iot</category><category>early-project</category>
  </item>

    </channel>
  </rss>
