<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Posts on DoNT - Do Not Think!!!</title>
    <link>https://dont.kr/posts/</link>
    <description>Recent content in Posts on DoNT - Do Not Think!!!</description>
    <generator>Hugo</generator>
    <language>ko-kr</language>
    <lastBuildDate>Sun, 22 Mar 2026 00:00:00 +0900</lastBuildDate>
    <atom:link href="https://dont.kr/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Java 멀티스레드 vs Kotlin 코루틴</title>
      <link>https://dont.kr/posts/2026/2026-03-22-java-thread-vs-kotlin-coroutine/</link>
      <pubDate>Sun, 22 Mar 2026 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2026/2026-03-22-java-thread-vs-kotlin-coroutine/</guid>
      <description>&lt;p&gt;Java 멀티스레드와 Kotlin 코루틴의 핵심 차이는 스케줄링 주체입니다. OS가 강제로 전환하느냐, 코드가 자발적으로 양보하느냐.&lt;/p&gt;
&lt;h2 id=&#34;os-레벨-병렬처리&#34;&gt;OS 레벨 병렬처리&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;OS 레벨
├── 멀티 프로세스 (독립 메모리)
└── 멀티 스레드 (공유 메모리, OS 스케줄링)

언어 레벨
└── 코루틴 (공유 메모리, 언어 스케줄링)
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;핵심-차이-누가-스케줄링하느냐&#34;&gt;핵심 차이: 누가 스케줄링하느냐&lt;/h2&gt;
&lt;h3 id=&#34;java-멀티스레드&#34;&gt;Java 멀티스레드&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;OS가 CPU 클럭 단위로 강제 스위칭 → 선점형(Preemptive)&lt;/li&gt;
&lt;li&gt;스레드 전환 비용이 큼 (스택, 레지스터 저장/복원)&lt;/li&gt;
&lt;li&gt;스레드 1개 = OS 스레드 1개 (~1MB)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;kotlin-코루틴&#34;&gt;Kotlin 코루틴&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;suspend&lt;/code&gt; 포인트에서 자발적으로 스레드 반납 → 협력형(Cooperative)&lt;/li&gt;
&lt;li&gt;전환 비용이 매우 작음 (힙에 상태 저장, ~수KB)&lt;/li&gt;
&lt;li&gt;스레드 몇 개 위에서 코루틴 수천 개 동작 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;계층-구조&#34;&gt;계층 구조&lt;/h2&gt;
&lt;p&gt;코루틴은 스레드를 대체하는 게 아니라 스레드 위에서 동작합니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Primary/Replica DB 분리와 Replication Lag</title>
      <link>https://dont.kr/posts/2026/2026-03-10-db-replication-lag/</link>
      <pubDate>Tue, 10 Mar 2026 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2026/2026-03-10-db-replication-lag/</guid>
      <description>&lt;p&gt;Primary/Replica DB를 분리하는 이유, Replication Lag 문제, 그리고 해결 전략을 정리합니다.&lt;/p&gt;
&lt;h2 id=&#34;왜-primaryreplica를-분리하는가&#34;&gt;왜 Primary/Replica를 분리하는가&lt;/h2&gt;
&lt;p&gt;일반적인 웹 애플리케이션은 읽기 트래픽이 쓰기 트래픽보다 훨씬 많습니다. 하나의 DB가 모든 트래픽을 처리하면 부하가 집중되고, 읽기 쿼리가 쓰기 락에 영향을 받을 수 있습니다.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[분리 전]
App → 단일 DB (읽기 + 쓰기 모두 처리)

[분리 후]
     ┌─→ Primary DB (쓰기)
App ─┤
     └─→ Replica DB (읽기)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Primary/Replica 분리의 목적은 크게 세 가지입니다.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;목적&lt;/th&gt;
          &lt;th&gt;설명&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;부하 분산&lt;/td&gt;
          &lt;td&gt;읽기 트래픽을 Replica로 보내 Primary의 부하를 줄인다&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;읽기 성능 향상&lt;/td&gt;
          &lt;td&gt;Replica를 여러 대 두어 읽기 처리량을 수평 확장한다&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;가용성&lt;/td&gt;
          &lt;td&gt;Primary 장애 시 Replica를 승격하여 새로운 Primary로 전환(failover)할 수 있다&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;replication-lag&#34;&gt;Replication Lag&lt;/h2&gt;
&lt;p&gt;Primary/Replica 분리에는 근본적인 문제가 따릅니다. Primary에 기록된 데이터가 Replica에서 조회 가능해지기까지 지연이 발생하며, 이를 Replication Lag이라 합니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>AWS ECS에서 Java &#43; Spring Boot 어플리케이션 메모리 설정</title>
      <link>https://dont.kr/posts/2026/2026-02-11-ecs-jvm-memory/</link>
      <pubDate>Wed, 11 Feb 2026 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2026/2026-02-11-ecs-jvm-memory/</guid>
      <description>&lt;p&gt;ECS에서 Java 애플리케이션을 운영할 때, JVM Heap을 얼마나 잡아야 하는지 정리합니다.&lt;/p&gt;
&lt;h2 id=&#34;컨테이너-환경의-메모리-구조&#34;&gt;컨테이너 환경의 메모리 구조&lt;/h2&gt;
&lt;p&gt;기존 서버 환경에서는 OS가 물리 메모리를 먼저 차지하고, 나머지를 JVM이 사용했습니다.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[VM/서버] 물리 메모리 → OS 커널 + 시스템 프로세스 → JVM
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ECS 컨테이너는 다릅니다. 호스트 OS 커널을 공유하기 때문에, Task에 할당된 메모리를 OS 몫 없이 컨테이너가 사용할 수 있습니다. 사이드카가 있으면 여러 컨테이너가 나눠 쓰지만, 이 문서에서는 메인 컨테이너만 있는 경우를 다룹니다.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[ECS Task] Task 메모리 ≈ JVM 전용
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&amp;ldquo;OS 몫을 남겨야 한다&amp;quot;는 상식은 컨테이너 환경에서는 불필요합니다. Fargate든 EC2든 Task 내부의 메모리 설정은 동일합니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>AWS ECS Task 메모리 설정</title>
      <link>https://dont.kr/posts/2026/2026-02-10-ecs-task-memory-allocation/</link>
      <pubDate>Tue, 10 Feb 2026 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2026/2026-02-10-ecs-task-memory-allocation/</guid>
      <description>&lt;p&gt;ECS에서 메모리 설정은 Task, Container, Application(JVM 등) 3개 레벨로 나뉩니다. 각 레벨이 어떻게 동작하는지 정리합니다.&lt;/p&gt;
&lt;h2 id=&#34;메모리-설정의-3개-레벨&#34;&gt;메모리 설정의 3개 레벨&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Task 메모리 (Task에 할당된 전체 메모리)
  └→ Container 메모리 (프로세스별 할당)
       └→ Application 메모리 (JVM Heap 등)
&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;레벨&lt;/th&gt;
          &lt;th&gt;설정 위치&lt;/th&gt;
          &lt;th&gt;역할&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Task 메모리&lt;/td&gt;
          &lt;td&gt;Task Definition&lt;/td&gt;
          &lt;td&gt;전체 메모리 한도&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Container 메모리&lt;/td&gt;
          &lt;td&gt;Task Definition &amp;gt; containerDefinitions&lt;/td&gt;
          &lt;td&gt;컨테이너별 메모리 한도&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Application 메모리&lt;/td&gt;
          &lt;td&gt;JVM 옵션 (-Xmx 등)&lt;/td&gt;
          &lt;td&gt;애플리케이션 내부 메모리&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Application 레벨(JVM 메모리 설정)은 &lt;a href=&#34;https://dont.kr/posts/2026/2026-02-11-ecs-jvm-memory/&#34;&gt;AWS ECS에서 Java + Spring Boot 어플리케이션 메모리 설정&lt;/a&gt; 에서 다룹니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>컨테이너 기초 용어 정리</title>
      <link>https://dont.kr/posts/2026/2026-02-09-container-basics/</link>
      <pubDate>Mon, 09 Feb 2026 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2026/2026-02-09-container-basics/</guid>
      <description>&lt;p&gt;물리 서버, 가상 머신 (VM), 컨테이너. 서버 환경이 어떻게 변해왔는지, 컨테이너 관련 용어들의 관계를 정리합니다.&lt;/p&gt;
&lt;h2 id=&#34;서버-환경의-변천&#34;&gt;서버 환경의 변천&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;물리 서버 → VM  → 컨테이너
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;물리 서버와 VM은 사용자 입장에서 거의 동일합니다. OS 설치하고, Java 설치하고, jar 배포하고. 차이는 하드웨어를 직접 만지느냐, 콘솔에서 클릭하느냐 정도입니다.&lt;/p&gt;
&lt;p&gt;패러다임이 바뀌는 건 VM → 컨테이너 구간입니다.&lt;/p&gt;
&lt;h2 id=&#34;컨테이너의-구조&#34;&gt;컨테이너의 구조&lt;/h2&gt;
&lt;h3 id=&#34;기존-서버-환경-물리-서버--vm&#34;&gt;기존 서버 환경 (물리 서버 / VM)&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Application (jar)
Java (JDK)
OS (Linux)
─────────────
물리 서버 / VM
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;기존 서버 환경은 각 계층을 하나하나 직접 설치합니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>데이터 저장소 용어 정리</title>
      <link>https://dont.kr/posts/2026/2026-01-21-data-storage-terms/</link>
      <pubDate>Wed, 21 Jan 2026 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2026/2026-01-21-data-storage-terms/</guid>
      <description>&lt;p&gt;데이터베이스, 데이터웨어하우스, 데이터레이크, 데이터레이크하우스. 비슷해 보이지만 각각 목적과 특성이 다릅니다.&lt;/p&gt;
&lt;h2 id=&#34;한눈에-비교&#34;&gt;한눈에 비교&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;구분&lt;/th&gt;
          &lt;th&gt;데이터베이스&lt;/th&gt;
          &lt;th&gt;데이터 웨어하우스&lt;/th&gt;
          &lt;th&gt;데이터 레이크&lt;/th&gt;
          &lt;th&gt;데이터 레이크하우스&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;목적&lt;/td&gt;
          &lt;td&gt;운영/트랜잭션(OLTP)&lt;/td&gt;
          &lt;td&gt;분석(OLAP)&lt;/td&gt;
          &lt;td&gt;원시 데이터 저장&lt;/td&gt;
          &lt;td&gt;분석 + 저장 통합&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;데이터 형태&lt;/td&gt;
          &lt;td&gt;구조화&lt;/td&gt;
          &lt;td&gt;구조화&lt;/td&gt;
          &lt;td&gt;비구조화/반구조화&lt;/td&gt;
          &lt;td&gt;모두 지원&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;스키마&lt;/td&gt;
          &lt;td&gt;Schema-on-Write&lt;/td&gt;
          &lt;td&gt;Schema-on-Write&lt;/td&gt;
          &lt;td&gt;Schema-on-Read&lt;/td&gt;
          &lt;td&gt;둘 다 가능&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;ACID&lt;/td&gt;
          &lt;td&gt;O&lt;/td&gt;
          &lt;td&gt;O&lt;/td&gt;
          &lt;td&gt;X&lt;/td&gt;
          &lt;td&gt;O&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;쿼리 패턴&lt;/td&gt;
          &lt;td&gt;단건 읽기/쓰기&lt;/td&gt;
          &lt;td&gt;대량 집계/분석&lt;/td&gt;
          &lt;td&gt;배치 처리&lt;/td&gt;
          &lt;td&gt;대량 집계/분석&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;실시간성&lt;/td&gt;
          &lt;td&gt;실시간&lt;/td&gt;
          &lt;td&gt;준실시간~배치&lt;/td&gt;
          &lt;td&gt;배치&lt;/td&gt;
          &lt;td&gt;준실시간~배치&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;대표 제품&lt;/td&gt;
          &lt;td&gt;MySQL, PostgreSQL&lt;/td&gt;
          &lt;td&gt;Snowflake, Redshift, BigQuery&lt;/td&gt;
          &lt;td&gt;S3, HDFS&lt;/td&gt;
          &lt;td&gt;Databricks&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;용어-유래&#34;&gt;용어 유래&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Database: Data + Base(기지) → 데이터를 저장하고 관리하는 기본 시스템&lt;/li&gt;
&lt;li&gt;Data Warehouse: Data + Warehouse(창고) → 정리된 물건을 체계적으로 보관&lt;/li&gt;
&lt;li&gt;Data Lake: Data + Lake(호수) → 모든 물이 흘러드는 호수&lt;/li&gt;
&lt;li&gt;Data Lakehouse: Data + Lake + House (Databricks가 2020년 제안한 신조어)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;ldquo;Data Lake Warehouse&amp;quot;가 아닌 이유? 단순히 둘을 붙여 쓰는 게 아니라, 새로운 패러다임임을 강조하기 위해서입니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kotlin의 접근 제어자 설계 철학</title>
      <link>https://dont.kr/posts/2026/2026-01-13-kotlin-access-modifier/</link>
      <pubDate>Tue, 13 Jan 2026 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2026/2026-01-13-kotlin-access-modifier/</guid>
      <description>&lt;p&gt;Java package-private 클래스를 Kotlin 테스트 코드에서 접근하려니 생성자 호출이 안 되어 reflection을 써야 했습니다. 왜 이런 문제가 발생할까요?&lt;/p&gt;
&lt;h2 id=&#34;java와-kotlin-접근-제어자-비교&#34;&gt;Java와 Kotlin 접근 제어자 비교&lt;/h2&gt;
&lt;h3 id=&#34;java&#34;&gt;Java&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;public: 전체&lt;/li&gt;
&lt;li&gt;protected: 상속 + 같은 패키지&lt;/li&gt;
&lt;li&gt;(default): 같은 패키지&lt;/li&gt;
&lt;li&gt;private: 같은 클래스&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;kotlin&#34;&gt;Kotlin&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;public: 전체&lt;/li&gt;
&lt;li&gt;internal: 같은 모듈&lt;/li&gt;
&lt;li&gt;protected: 상속 관계만&lt;/li&gt;
&lt;li&gt;private: 같은 클래스 (클래스 멤버) / 같은 파일 (최상위 선언)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;핵심-차이&#34;&gt;핵심 차이&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;&lt;/th&gt;
          &lt;th&gt;Java&lt;/th&gt;
          &lt;th&gt;Kotlin&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;캡슐화 단위&lt;/td&gt;
          &lt;td&gt;패키지&lt;/td&gt;
          &lt;td&gt;모듈&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;테스트 접근&lt;/td&gt;
          &lt;td&gt;같은 패키지 필요&lt;/td&gt;
          &lt;td&gt;같은 모듈이면 OK&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;package-private&lt;/td&gt;
          &lt;td&gt;있음&lt;/td&gt;
          &lt;td&gt;없음 (internal로 대체)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;protected&lt;/td&gt;
          &lt;td&gt;상속 + 같은 패키지&lt;/td&gt;
          &lt;td&gt;상속만&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;kotlin의-설계-철학&#34;&gt;Kotlin의 설계 철학&lt;/h2&gt;
&lt;h3 id=&#34;패키지는-캡슐화-경계가-아니다&#34;&gt;패키지는 캡슐화 경계가 아니다&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 원래 라이브러리 (example-lib.jar)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; com.example.core;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;InternalClass&lt;/span&gt; {  &lt;span style=&#34;color:#75715e&#34;&gt;// package-private&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sensitiveMethod&lt;/span&gt;() { }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 악의적 사용자 코드 (다른 프로젝트)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; com.example.core; &lt;span style=&#34;color:#75715e&#34;&gt;// 같은 패키지명 사용&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Hacker&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;access&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt; InternalClass();  &lt;span style=&#34;color:#75715e&#34;&gt;// package-private인데 접근됨&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;패키지는 &lt;strong&gt;코드 조직화 수단&lt;/strong&gt;일 뿐, 실제 캡슐화는 &lt;strong&gt;컴파일/배포 단위인 모듈&lt;/strong&gt;에서 이루어져야 합니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hugo 댓글 - giscus 적용</title>
      <link>https://dont.kr/posts/2025/2025-12-03-hugo-comment-giscus/</link>
      <pubDate>Wed, 03 Dec 2025 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2025/2025-12-03-hugo-comment-giscus/</guid>
      <description>&lt;p&gt;Hugo 블로그에 GitHub Discussions 기반 댓글 시스템 giscus를 적용합니다.&lt;/p&gt;
&lt;h2 id=&#34;사전-준비&#34;&gt;사전 준비&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;GitHub 공개 저장소 준비&lt;/li&gt;
&lt;li&gt;해당 공개 저장소에 Discussions 활성화: Settings → General → Features → Discussions&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/apps/giscus&#34;&gt;giscus 앱&lt;/a&gt; 설치 후 저장소 선택&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;giscus-설정&#34;&gt;giscus 설정&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://giscus.app&#34;&gt;https://giscus.app&lt;/a&gt; 접속&lt;/li&gt;
&lt;li&gt;저장소와 원하는 옵션 선택&lt;/li&gt;
&lt;li&gt;생성된 스크립트 코드 복사&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;hugo-적용&#34;&gt;Hugo 적용&lt;/h2&gt;
&lt;h3 id=&#34;댓글-파일-생성&#34;&gt;댓글 파일 생성&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&amp;lt;!-- layouts/partials/comment.html --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;// 스크립트 코드
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;설정-파일-수정&#34;&gt;설정 파일 수정&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# hugo.toml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;params&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;comments&lt;/span&gt; = &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>블록킹/논블록킹, 동기/비동기 개념 정리</title>
      <link>https://dont.kr/posts/2025/2025-11-28-blocking-nonblocking-synchronous-asynchronous/</link>
      <pubDate>Fri, 28 Nov 2025 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2025/2025-11-28-blocking-nonblocking-synchronous-asynchronous/</guid>
      <description>&lt;p&gt;블록킹/논블록킹은 제어권 반환 시점의 차이이고, 동기/비동기는 결과 확인 주체의 차이입니다.&lt;/p&gt;
&lt;h2 id=&#34;블록킹-vs-논블록킹&#34;&gt;블록킹 vs 논블록킹&lt;/h2&gt;
&lt;p&gt;구분 기준: 제어권을 바로 돌려주는가?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;블록킹: 작업 완료까지 제어권을 돌려주지 않음&lt;/li&gt;
&lt;li&gt;논블록킹: 작업 요청 후 바로 제어권 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;동기-vs-비동기&#34;&gt;동기 vs 비동기&lt;/h2&gt;
&lt;p&gt;구분 기준: 결과를 누가 확인하는가?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;동기: 요청한 쪽이 결과를 직접 확인&lt;/li&gt;
&lt;li&gt;비동기: 결과가 준비되면 콜백으로 알려줌&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;핵심-구분&#34;&gt;핵심 구분&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;구분&lt;/th&gt;
          &lt;th&gt;질문&lt;/th&gt;
          &lt;th&gt;블록킹&lt;/th&gt;
          &lt;th&gt;논블록킹&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;제어권&lt;/td&gt;
          &lt;td&gt;기다리는 동안 다른 일 할 수 있어?&lt;/td&gt;
          &lt;td&gt;못함 (멈춤)&lt;/td&gt;
          &lt;td&gt;가능 (안 멈춤)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;구분&lt;/th&gt;
          &lt;th&gt;질문&lt;/th&gt;
          &lt;th&gt;동기&lt;/th&gt;
          &lt;th&gt;비동기&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;결과 확인&lt;/td&gt;
          &lt;td&gt;결과를 내가 확인해? 알려줘?&lt;/td&gt;
          &lt;td&gt;내가 확인&lt;/td&gt;
          &lt;td&gt;알려줌&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;c-디바이스-io-예제&#34;&gt;C 디바이스 I/O 예제&lt;/h2&gt;
&lt;h3 id=&#34;블록킹-io&#34;&gt;블록킹 I/O&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; fd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;open&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/dev/device&amp;#34;&lt;/span&gt;, O_RDONLY);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; buf[&lt;span style=&#34;color:#ae81ff&#34;&gt;1024&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 데이터 올 때까지 멈춤
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;read&lt;/span&gt;(fd, buf, &lt;span style=&#34;color:#ae81ff&#34;&gt;1024&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 여기 도달 = buf 채워짐 보장
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;읽음: %s&amp;#34;&lt;/span&gt;, buf);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;동작:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Apache Kafka 기본 개념 정리</title>
      <link>https://dont.kr/posts/2025/2025-11-27-apache-kafka/</link>
      <pubDate>Thu, 27 Nov 2025 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2025/2025-11-27-apache-kafka/</guid>
      <description>&lt;p&gt;Apache Kafka의 핵심 개념과 동작 원리를 정리합니다.&lt;/p&gt;
&lt;h2 id=&#34;아키텍처&#34;&gt;아키텍처&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Kafka Cluster (여러 Broker의 집합)
    │
    └─ Broker (카프카 서버, 여러 대 가능)
           │
           └─ Topic (메시지 종류)
                  │
                  ├─ Partition 0 ──┐
                  ├─ Partition 1 ──┼── Consumer Group A ─┬─ Consumer 1
                  └─ Partition 2 ──┘                     ├─ Consumer 2
                          │                              └─ Consumer 3
                          │
                          └──────────── Consumer Group B ─── Consumer 1
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;구성-요소&#34;&gt;구성 요소&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Broker&lt;/strong&gt;: Kafka 서버 (여러 대로 클러스터 구성)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Topic&lt;/strong&gt;: 메시지 종류별 논리적 그룹&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Partition&lt;/strong&gt;: 토픽 내 병렬 처리 단위&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consumer Group&lt;/strong&gt;: 동일 group.id로 묶인 컨슈머들&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;설계-시-고려사항&#34;&gt;설계 시 고려사항&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;파티션 수 = 최대 병렬 처리 수&lt;/li&gt;
&lt;li&gt;파티션 수 ≥ 컨슈머 수 (컨슈머가 더 많으면 일부는 idle)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;용어-정리---여기&#34;&gt;용어 정리  ← 여기&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;동작&lt;/th&gt;
          &lt;th&gt;일반 메시지 큐&lt;/th&gt;
          &lt;th&gt;Kafka&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;메시지 보내기&lt;/td&gt;
          &lt;td&gt;Publish&lt;/td&gt;
          &lt;td&gt;Produce&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;보내는 주체&lt;/td&gt;
          &lt;td&gt;Publisher&lt;/td&gt;
          &lt;td&gt;Producer&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;토픽 구독&lt;/td&gt;
          &lt;td&gt;Subscribe&lt;/td&gt;
          &lt;td&gt;Subscribe (동일)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;메시지 받기&lt;/td&gt;
          &lt;td&gt;Push (서버가 보냄)&lt;/td&gt;
          &lt;td&gt;Poll (주기적으로 가져감)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;받는 주체&lt;/td&gt;
          &lt;td&gt;Subscriber&lt;/td&gt;
          &lt;td&gt;Consumer&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;메시지-흐름&#34;&gt;메시지 흐름&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Producer ──produce──▶ Kafka Broker ◀──poll── Consumer
                                                  │
                                                  ▼
                                              consume
                                              처리 로직
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;동작-방식&#34;&gt;동작 방식&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Producer가 메시지 전송&lt;/li&gt;
&lt;li&gt;Broker가 파티션에 메시지 저장&lt;/li&gt;
&lt;li&gt;Consumer가 주기적으로 폴링&lt;/li&gt;
&lt;li&gt;새 메시지 있으면 가져와서 처리&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;메시지-관리&#34;&gt;메시지 관리&lt;/h2&gt;
&lt;h3 id=&#34;offset-관리&#34;&gt;Offset 관리&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Offset&lt;/strong&gt;: 파티션 내 메시지 위치 (0부터 시작)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Committed Offset&lt;/strong&gt;: 처리 완료한 마지막 위치&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Latest Offset&lt;/strong&gt;: 파티션의 마지막 메시지 위치&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consumer Lag&lt;/strong&gt;: Latest - Committed (처리 지연 정도)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;commit-전략&#34;&gt;Commit 전략&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 자동 커밋 (기본값)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;enable.&lt;span style=&#34;color:#a6e22e&#34;&gt;auto&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;commit&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;auto.&lt;span style=&#34;color:#a6e22e&#34;&gt;commit&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;interval&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ms&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;5000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// 수동 커밋&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;consumer.&lt;span style=&#34;color:#a6e22e&#34;&gt;commitSync&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;consumer.&lt;span style=&#34;color:#a6e22e&#34;&gt;commitAsync&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;메시지-전달-보장&#34;&gt;메시지 전달 보장&lt;/h2&gt;
&lt;h3 id=&#34;at-most-once&#34;&gt;At-most-once&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;처리 전 commit&lt;/li&gt;
&lt;li&gt;장점: 중복 없음&lt;/li&gt;
&lt;li&gt;단점: 메시지 유실 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;at-least-once-기본값&#34;&gt;At-least-once (기본값)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;처리 후 commit&lt;/li&gt;
&lt;li&gt;장점: 메시지 유실 없음&lt;/li&gt;
&lt;li&gt;단점: 중복 처리 가능&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;중요&lt;/strong&gt;: 애플리케이션 레벨에서 멱등성 보장 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;exactly-once&#34;&gt;Exactly-once&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;트랜잭션 사용&lt;/li&gt;
&lt;li&gt;장점: 중복도 유실도 없음&lt;/li&gt;
&lt;li&gt;단점: 성능 오버헤드&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;메시지-보관&#34;&gt;메시지 보관&lt;/h2&gt;
&lt;p&gt;일반 메시지 큐와 달리 Kafka는 consume 후에도 메시지 보관:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spring Boot 설정 파일 로딩</title>
      <link>https://dont.kr/posts/2025/2025-11-26-spring-boot-config/</link>
      <pubDate>Wed, 26 Nov 2025 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2025/2025-11-26-spring-boot-config/</guid>
      <description>&lt;p&gt;Spring Boot의 설정 파일 로딩 메커니즘과 외부 라이브러리 사용 시 발생하는 문제를 다룹니다.&lt;/p&gt;
&lt;h2 id=&#34;configdata-api-spring-boot-24&#34;&gt;ConfigData API (Spring Boot 2.4+)&lt;/h2&gt;
&lt;p&gt;Spring Boot 2.4 부터 설정 로딩 방식이 ConfigData API로 변경되었습니다.&lt;/p&gt;
&lt;h3 id=&#34;주요-변경사항&#34;&gt;주요 변경사항&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Spring Cloud Bootstrap Context 대체 (bootstrap.yml → application.yml)&lt;/li&gt;
&lt;li&gt;단일 ApplicationContext 사용&lt;/li&gt;
&lt;li&gt;&lt;code&gt;spring.config.import&lt;/code&gt; 도입&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;설정-파일-로딩-기본-동작&#34;&gt;설정 파일 로딩 기본 동작&lt;/h2&gt;
&lt;h3 id=&#34;검색-위치&#34;&gt;검색 위치&lt;/h3&gt;
&lt;p&gt;Spring Boot는 다음 위치에서 설정 파일을 검색합니다 (낮은 → 높은 우선순위):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1. classpath:/application.yml
2. classpath:/config/application.yml
3. file:./application.yml
4. file:./config/application.yml
5. file:./config/*/application.yml
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;로딩-규칙&#34;&gt;로딩 규칙&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;다른 경로: 모두 로드 후 병합&lt;/li&gt;
&lt;li&gt;같은 classpath 경로: 첫 번째만 사용
&lt;ul&gt;
&lt;li&gt;Oracle Java 문서: 여러 모듈이 동일한 클래스 로더에 정의되고, 둘 이상의 모듈이 주어진 이름의 리소스를 포함하는 경우, 모듈이 검색되는 순서는 명시되지 않으며 매우 예측할 수 없을 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;우선순위&#34;&gt;우선순위&lt;/h3&gt;
&lt;p&gt;나중에 로드된 것이 우선:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spring Boot 애플리케이션 웜업</title>
      <link>https://dont.kr/posts/2025/2025-11-25-spring-boot-warmup/</link>
      <pubDate>Tue, 25 Nov 2025 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2025/2025-11-25-spring-boot-warmup/</guid>
      <description>&lt;p&gt;Spring Boot 배포 직후 첫 요청이 느린 이유를 JVM 동작 원리부터 설명합니다.&lt;/p&gt;
&lt;h2 id=&#34;컴파일러와-인터프리터&#34;&gt;컴파일러와 인터프리터&lt;/h2&gt;
&lt;h3 id=&#34;컴파일러-언어-cc&#34;&gt;컴파일러 언어 (C/C++)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;전체 코드를 한번에 기계어로 변환&lt;/li&gt;
&lt;li&gt;실행 속도 빠름&lt;/li&gt;
&lt;li&gt;플랫폼 종속적&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;인터프리터-언어-python&#34;&gt;인터프리터 언어 (Python)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;코드를 한 줄씩 해석하며 실행&lt;/li&gt;
&lt;li&gt;실행 속도 느림&lt;/li&gt;
&lt;li&gt;플랫폼 독립적&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;자바-동작-방식&#34;&gt;자바 동작 방식&lt;/h3&gt;
&lt;h4 id=&#34;자바-1990년대-설계-철학&#34;&gt;자바 1990년대 설계 철학&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;이식성: Write Once, Run Anywhere&lt;/li&gt;
&lt;li&gt;안전성: 메모리 보호, 타입 검증&lt;/li&gt;
&lt;li&gt;개발 생산성: 자동 메모리 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;HelloWorld.java (소스코드) 
→ javac (컴파일)
→ HelloWorld.class (바이트코드)
→ java (JVM)
→ 실행
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;단점&#34;&gt;단점&lt;/h4&gt;
&lt;p&gt;바이트코드 인터프리터 실행으로 성능이 느렸습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>LLM 개념 정리</title>
      <link>https://dont.kr/posts/2025/2025-11-13-llm-fundamentals/</link>
      <pubDate>Thu, 13 Nov 2025 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2025/2025-11-13-llm-fundamentals/</guid>
      <description>&lt;p&gt;LLM(Large Language Model)은 &amp;ldquo;다음 단어 예측&amp;quot;을 극한까지 잘하는 모델입니다. 이 단순한 원리로 대화, 요약, 번역, 코딩까지 가능합니다.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;입력: &amp;#34;오늘 날씨가 정말&amp;#34;
LLM: &amp;#34;좋네요&amp;#34; (가장 자연스러운 다음 단어 선택)
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id=&#34;llm의-위치&#34;&gt;LLM의 위치&lt;/h2&gt;
&lt;h3 id=&#34;ai-기술-계층도&#34;&gt;AI 기술 계층도&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;AI
└─ 머신러닝
    ├─ 전통 머신러닝
    └─ 딥러닝
        └─ Transformer
            └─ LLM ← 여기
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;multimodal-확장&#34;&gt;Multimodal 확장&lt;/h3&gt;
&lt;p&gt;최근에는 텍스트(LLM) + 이미지(Vision) + 음성(Audio)을 통합한 Multimodal AI(GPT-4V, Gemini)로 확장되고 있지만, 코어는 여전히 LLM입니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;llm의-핵심-특징&#34;&gt;LLM의 핵심 특징&lt;/h2&gt;
&lt;h3 id=&#34;large-대규모-parameter&#34;&gt;Large (대규모 Parameter)&lt;/h3&gt;
&lt;h4 id=&#34;규모&#34;&gt;규모&lt;/h4&gt;
&lt;p&gt;10¹¹ ~ 10¹³ 개&lt;/p&gt;</description>
    </item>
    <item>
      <title>머신러닝 개념 정리</title>
      <link>https://dont.kr/posts/2025/2025-11-12-ml-fundamentals/</link>
      <pubDate>Wed, 12 Nov 2025 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2025/2025-11-12-ml-fundamentals/</guid>
      <description>&lt;p&gt;머신러닝의 학습 과정을 단계별로 정리하고, Feature와 Parameter의 차이를 설명합니다.&lt;/p&gt;
&lt;h2 id=&#34;머신러닝-전체-프로세스&#34;&gt;머신러닝 전체 프로세스&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;단계&lt;/th&gt;
          &lt;th&gt;전통 머신러닝&lt;/th&gt;
          &lt;th&gt;딥러닝&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;1. 원본 데이터&lt;/td&gt;
          &lt;td&gt;텍스트, 이미지, 표 등&lt;/td&gt;
          &lt;td&gt;텍스트, 이미지, 표 등&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2. 분할&lt;/td&gt;
          &lt;td&gt;텍스트→토큰, 이미지→픽셀, 음성→프레임&lt;/td&gt;
          &lt;td&gt;텍스트→토큰, 이미지→픽셀, 음성→프레임&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;3. 벡터화&lt;/td&gt;
          &lt;td&gt;숫자로 변환 (ID, RGB, 정규화)&lt;/td&gt;
          &lt;td&gt;숫자로 변환 (ID, RGB, 정규화)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;4. Feature 추출&lt;/td&gt;
          &lt;td&gt;사람이 설계 (고정)&lt;!-- raw HTML omitted --&gt;- 긍정단어 개수&lt;!-- raw HTML omitted --&gt;- 부정단어 개수&lt;!-- raw HTML omitted --&gt;- 느낌표 개수&lt;/td&gt;
          &lt;td&gt;-&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;5. 학습 초기화&lt;/td&gt;
          &lt;td&gt;랜덤 Parameter&lt;/td&gt;
          &lt;td&gt;랜덤 Parameter&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;6. 순전파&lt;/td&gt;
          &lt;td&gt;Feature × Parameter = 예측&lt;/td&gt;
          &lt;td&gt;벡터화된 입력 × Parameter&lt;!-- raw HTML omitted --&gt;→ Layer별 Feature 자동 생성&lt;!-- raw HTML omitted --&gt;→ 예측&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;7. 손실 계산&lt;/td&gt;
          &lt;td&gt;정답과 비교&lt;/td&gt;
          &lt;td&gt;정답과 비교&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;8. 역전파&lt;/td&gt;
          &lt;td&gt;Parameter 조정&lt;/td&gt;
          &lt;td&gt;Parameter 조정&lt;!-- raw HTML omitted --&gt;→ Feature 표현도 변화&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;9. 반복&lt;/td&gt;
          &lt;td&gt;6&lt;del&gt;8 반복 (수백만&lt;/del&gt;수억 회)&lt;/td&gt;
          &lt;td&gt;6&lt;del&gt;8 반복 (수백만&lt;/del&gt;수억 회)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;10. 학습된 모델&lt;/td&gt;
          &lt;td&gt;고정 Feature + 학습된 Parameter&lt;/td&gt;
          &lt;td&gt;학습된 Parameter&lt;!-- raw HTML omitted --&gt;(Feature 표현 내장)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;11. 추론: 전처리&lt;/td&gt;
          &lt;td&gt;분할 + 벡터화&lt;/td&gt;
          &lt;td&gt;분할 + 벡터화&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;12. 추론: Feature&lt;/td&gt;
          &lt;td&gt;같은 방식으로 Feature 추출&lt;/td&gt;
          &lt;td&gt;학습된 모델로 자동 생성&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;13. 추론: 예측&lt;/td&gt;
          &lt;td&gt;학습된 Parameter로 계산&lt;/td&gt;
          &lt;td&gt;학습된 Parameter로 계산&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;14. 예측 결과&lt;/td&gt;
          &lt;td&gt;출력&lt;/td&gt;
          &lt;td&gt;출력&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;핵심-용어-정리&#34;&gt;핵심 용어 정리&lt;/h2&gt;
&lt;h3 id=&#34;데이터-data&#34;&gt;데이터 (Data)&lt;/h3&gt;
&lt;p&gt;원본 정보&lt;/p&gt;</description>
    </item>
    <item>
      <title>AI 개념 정리</title>
      <link>https://dont.kr/posts/2025/2025-11-11-ai-fundamentals/</link>
      <pubDate>Tue, 11 Nov 2025 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2025/2025-11-11-ai-fundamentals/</guid>
      <description>&lt;p&gt;AI, 머신러닝, 딥러닝, LLM — 용어가 혼용되는데, 각각의 위치와 관계를 정리합니다.&lt;/p&gt;
&lt;h2 id=&#34;ai-영역-구분&#34;&gt;AI 영역 구분&lt;/h2&gt;
&lt;h3 id=&#34;ai-모델-개발&#34;&gt;AI 모델 개발&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;직접 머신러닝으로 모델 학습&lt;/li&gt;
&lt;li&gt;추천, 예측 등 자체 모델 제작&lt;/li&gt;
&lt;li&gt;시간/비용 많이 들고, 전문 인력 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;ai-기능-통합&#34;&gt;AI 기능 통합&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;외부 LLM API 활용 (GPT, Claude)&lt;/li&gt;
&lt;li&gt;서비스에 챗봇, 요약, 검색 등 추가&lt;/li&gt;
&lt;li&gt;빠르고, 기존 개발자가 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;ai-도구-사용&#34;&gt;AI 도구 사용&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Claude Code, Copilot으로 개발 효율화&lt;/li&gt;
&lt;li&gt;AI는 보조 도구&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;데이터-마이닝--ai-관계&#34;&gt;데이터 마이닝 ↔ AI 관계&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;데이터 마이닝              AI
(패턴/인사이트 발견)    (지능적 판단·행동)
      ╲                  ╱
       ╲                ╱
        ╲              ╱
         ╲            ╱
            머신러닝
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;설명&#34;&gt;설명&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;데이터 마이닝: &amp;ldquo;왜 이런 일이 일어나는가?&amp;rdquo; (패턴 발견)&lt;/li&gt;
&lt;li&gt;AI: &amp;ldquo;이 상황에서 뭘 해야 하는가?&amp;rdquo; (문제 해결)&lt;/li&gt;
&lt;li&gt;머신러닝: AI의 한 분야이자, 데이터 마이닝에서 활용되는 핵심 도구&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;예시&#34;&gt;예시&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;데이터 마이닝: 고객 데이터 분석 → &amp;ldquo;금요일 저녁 맥주+치킨 많이 팔림&amp;rdquo; 발견&lt;/li&gt;
&lt;li&gt;AI: 고객 접속 시 → &amp;ldquo;이 사람에게 맥주 추천&amp;rdquo; 자동 판단&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;ai의-기술-체계&#34;&gt;AI의 기술 체계&lt;/h2&gt;
&lt;h3 id=&#34;ai의-목적&#34;&gt;AI의 목적&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;지능적 판단·계획·행동으로 문제 해결&lt;/li&gt;
&lt;li&gt;예측은 그 중 한 수단일 뿐&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;AI (지능적으로 판단·계획·행동하여 문제 해결)
 ├─ 규칙 기반 AI (if-then 로직)
 ├─ 탐색/최적화 알고리즘
 └─ 머신러닝 ← 요즘 AI의 핵심 (특히 딥러닝)
     ├─ 전통 머신러닝 (SVM, 랜덤포레스트 등)
     └─ 딥러닝
         ├─ CNN (이미지 인식)
         ├─ RNN (시계열 처리)
         └─ Transformer (2017~)
             ├─ BERT (양방향 이해)
             └─ LLM (대규모 언어모델) ← 요즘 가장 주목받는 분야
                 └─ GPT, Claude, Gemini
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id=&#34;머신러닝의-학습-방식&#34;&gt;머신러닝의 학습 방식&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;머신러닝 (데이터로 모델 학습)
 ├─ 지도 학습 (정답 있는 데이터로 학습)
 ├─ 비지도 학습 (정답 없이 패턴 찾기)
 └─ 강화 학습 (시행착오로 학습)
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id=&#34;핵심-프로세스&#34;&gt;핵심 프로세스&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;학습 데이터 → [학습/Training] → 모델
입력 데이터 → [추론/Inference] → 결과
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id=&#34;시대별-ai의-의미&#34;&gt;시대별 &amp;ldquo;AI&amp;quot;의 의미&lt;/h2&gt;
&lt;h3 id=&#34;1980년대-ai--규칙-기반&#34;&gt;1980년대: AI = 규칙 기반&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;한계에 부딪힘 (AI의 겨울)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2000년대-ai--머신러닝&#34;&gt;2000년대: AI = 머신러닝&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;데이터 → 특징 → 학습 → 모델 → 추론&lt;/li&gt;
&lt;li&gt;딥러닝 이론 존재, 컴퓨팅 파워 부족&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2010년대-ai--딥러닝&#34;&gt;2010년대: AI = 딥러닝&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;GPU 발달&lt;/li&gt;
&lt;li&gt;2012 ImageNet: CNN으로 이미지 인식 돌파&lt;/li&gt;
&lt;li&gt;2017 Transformer 등장&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2020년대-ai--llm-대중-인식&#34;&gt;2020년대: AI ≈ LLM (대중 인식)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;ChatGPT, Claude 등의 폭발적 성장&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;핵심-용어-정리&#34;&gt;핵심 용어 정리&lt;/h2&gt;
&lt;h3 id=&#34;ai-인공지능&#34;&gt;AI (인공지능)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;지능적으로 판단·계획·행동하여 문제 해결&lt;/li&gt;
&lt;li&gt;요즘은 사실상 머신러닝 의미로 많이 씀&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;머신러닝-기계학습&#34;&gt;머신러닝 (기계학습)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;데이터로 기계를 학습시킴&lt;/li&gt;
&lt;li&gt;AI 구현에 성공한 방법&lt;/li&gt;
&lt;li&gt;데이터 마이닝과 AI가 공유하는 핵심 도구&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;딥러닝&#34;&gt;딥러닝&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;신경망을 깊게 쌓은 것&lt;/li&gt;
&lt;li&gt;특징을 자동으로 학습 (사람이 특징 정의 불필요)&lt;/li&gt;
&lt;li&gt;GPU 발달로 2010년대 실용화&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;transformer&#34;&gt;Transformer&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;2017년 등장한 딥러닝 아키텍처&lt;/li&gt;
&lt;li&gt;병렬 처리가 가능해서 대규모 학습에 유리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;llm-large-language-model&#34;&gt;LLM (Large Language Model)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Transformer 기반 대규모 언어 모델&lt;/li&gt;
&lt;li&gt;ChatGPT, Claude 등&lt;/li&gt;
&lt;li&gt;AI 중 일부지만 최근 2-3년 폭발적 유행&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;데이터-마이닝&#34;&gt;데이터 마이닝&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;데이터에서 패턴/인사이트 찾기&lt;/li&gt;
&lt;li&gt;머신러닝을 도구로 활용&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>MySQL vs Oracle: 커서(Cursor) 동작 방식 비교</title>
      <link>https://dont.kr/posts/2025/2025-11-04-database-cursor-mysql-vs-oracle/</link>
      <pubDate>Tue, 04 Nov 2025 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2025/2025-11-04-database-cursor-mysql-vs-oracle/</guid>
      <description>&lt;h2 id=&#34;tldr&#34;&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;MySQL과 Oracle은 서버 커서 구현 방식이 근본적으로 다름&lt;/li&gt;
&lt;li&gt;MySQL: 임시 테이블 생성하여 전체 결과 저장&lt;/li&gt;
&lt;li&gt;Oracle: PGA 메모리에서 커서 상태만 유지하고 필요한 만큼 페치&lt;/li&gt;
&lt;li&gt;&amp;ldquo;클라이언트 사이드 커서&amp;quot;는 MySQL에서 공식 용어가 아님&lt;/li&gt;
&lt;li&gt;MySQL: 클라이언트 버퍼링, 스트리밍, 서버 커서 3가지 방식 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;커서란-무엇인가&#34;&gt;커서란 무엇인가&lt;/h2&gt;
&lt;p&gt;데이터베이스 커서는 쿼리 결과를 순차적으로 처리하기 위한 메커니즘입니다. 대용량 결과를 한 번에 메모리로 로드하지 않고, 필요한 만큼만 가져와서 처리할 수 있게 해줍니다.&lt;/p&gt;
&lt;p&gt;데이터베이스에서는 결과를 처리하는 위치에 따라 서버 커서와 클라이언트 커서으로 구분할 수 있습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>바이브 코딩을 넘어서 - 기획 영역에서의 AI 활용</title>
      <link>https://dont.kr/posts/2025/2025-10-02-beyond-vibe-coding-planning/</link>
      <pubDate>Thu, 02 Oct 2025 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2025/2025-10-02-beyond-vibe-coding-planning/</guid>
      <description>&lt;p&gt;바이브 코딩을 기획 단계에 적용하면 문서 초안을 빠르게 뽑을 수 있습니다. 다만 비즈니스 맥락과 우선순위는 사람이 채워야 합니다.&lt;/p&gt;
&lt;h2 id=&#34;ai가-잘하는-기획-작업&#34;&gt;AI가 잘하는 기획 작업&lt;/h2&gt;
&lt;p&gt;문서 초안 작성, 구조화, 표준 포맷 적용에서 효과적입니다. 사용자 스토리, PRD 초안, 기능 명세서 같은 정형화된 산출물을 빠르게 만들 수 있습니다.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;#34;로그인 기능에 대한 사용자 스토리를 작성해줘.
이메일/비밀번호 방식과 소셜 로그인 지원&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;#34;결제 프로세스의 상세 플로우를 단계별로 정리.
각 단계의 필요 데이터와 예외 상황 포함&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;반면 비즈니스 맥락은 이해하지 못합니다. 일반적인 요구사항은 작성할 수 있지만, 특정 도메인의 비즈니스 규칙이나 이해관계자 간 요구사항 조율은 할 수 없습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>바이브 코딩 심화편 - 실무 적용과 한계</title>
      <link>https://dont.kr/posts/2025/2025-09-24-vibe-coding-advanced/</link>
      <pubDate>Wed, 24 Sep 2025 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2025/2025-09-24-vibe-coding-advanced/</guid>
      <description>&lt;p&gt;단순한 작업에서는 바이브 코딩이 잘 먹힙니다. 다만 복잡한 비즈니스 로직이나 보안이 중요한 영역에서는 한계가 뚜렷합니다.&lt;/p&gt;
&lt;h2 id=&#34;잘-먹히는-영역&#34;&gt;잘 먹히는 영역&lt;/h2&gt;
&lt;p&gt;프로토타이핑, 데이터 변환, 문서화, 단순 테스트 코드 작성 정도가 현실적으로 효과적인 범위입니다.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;#34;React로 사용자 관리 시스템을 만들어줘.
추가, 수정, 삭제 기능과 로컬 스토리지 연동 포함&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;#34;CSV 파일을 읽어서 이메일 주소만 추출하고
중복 제거 후 JSON 배열로 변환해줘&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;명확한 입출력 구조를 가진 작업일수록 정확도가 높습니다.&lt;/p&gt;
&lt;h2 id=&#34;주의해야-하는-영역&#34;&gt;주의해야 하는 영역&lt;/h2&gt;
&lt;p&gt;보안이 가장 큰 문제입니다. AI가 생성한 코드에는 SQL 인젝션, 인증 우회 같은 OWASP Top 10 취약점이 포함될 수 있습니다. 특히 입력 검증과 권한 관리에서 치명적 오류가 발생하기 쉽습니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>바이브 코딩이란 무엇인가? - AI 시대의 새로운 프로그래밍 패러다임</title>
      <link>https://dont.kr/posts/2025/2025-09-17-what-is-vibe-coding/</link>
      <pubDate>Wed, 17 Sep 2025 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2025/2025-09-17-what-is-vibe-coding/</guid>
      <description>&lt;h2 id=&#34;바이브-코딩이란&#34;&gt;바이브 코딩이란?&lt;/h2&gt;
&lt;p&gt;바이브 코딩(Vibe Coding)이란 자연어로 의도를 설명하면 AI가 코드를 만들어주는 방식입니다. 기존 프로그래밍이 정확한 문법과 구조를 요구했다면, 바이브 코딩은 어떻게 구현할 것인가보다 무엇을 하고 싶은가에 초점을 맞춥니다.&lt;/p&gt;
&lt;h3 id=&#34;전통적인-방식&#34;&gt;전통적인 방식&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;calculate_average&lt;/span&gt;(numbers):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; len(numbers) &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; sum(numbers) &lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt; len(numbers)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;바이브-코딩-방식-의도-중심&#34;&gt;바이브 코딩 방식 (의도 중심)&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;#34;숫자 리스트의 평균을 계산해줘, 빈 리스트면 0 반환&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;완벽한 코드를 한 번에 작성하는 게 아니라, AI와 대화하면서 점진적으로 개선해 나갑니다. 단순히 코드 한 줄을 생성하는 것을 넘어서, 프로젝트 전체 맥락을 이해하고 일관성 있는 코드를 만들어내는 것이 핵심입니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>springdoc-openapi @ApiResponse 어노테이션의 useReturnTypeSchema 속성</title>
      <link>https://dont.kr/posts/2025/2025-06-26-springdoc-openapi-usereturntypeschema/</link>
      <pubDate>Thu, 26 Jun 2025 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2025/2025-06-26-springdoc-openapi-usereturntypeschema/</guid>
      <description>&lt;h3 id=&#34;apiresponse-어노테이션의-usereturntypeschema-속성&#34;&gt;@ApiResponse 어노테이션의 useReturnTypeSchema 속성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;컨트롤러 메서드의 반환 타입을 자동으로 추론하여 OpenAPI 스펙의 response schema 로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;@Operation(summary = &amp;#34;사용자 조회&amp;#34;, responses = {
    @ApiResponse(responseCode = &amp;#34;200&amp;#34;, description = &amp;#34;조회 성공&amp;#34;, useReturnTypeSchema = true)
})
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Mac zsh 설정</title>
      <link>https://dont.kr/posts/2025/2025-04-25-mac-zsh/</link>
      <pubDate>Fri, 25 Apr 2025 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2025/2025-04-25-mac-zsh/</guid>
      <description>&lt;h3 id=&#34;zsh-설치&#34;&gt;zsh 설치&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ brew install zsh
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;oh-my-zsh-설치&#34;&gt;oh-my-zsh 설치&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sh -c &amp;#34;$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ vi .zshrc
source $ZSH/oh-my-zsh.sh
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;플러그인-설치&#34;&gt;플러그인 설치&lt;/h3&gt;
&lt;h4 id=&#34;zsh-autosuggestions-설치&#34;&gt;zsh-autosuggestions 설치&lt;/h4&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ vi .zshrc
plugins=(... zsh-autosuggestions ...)
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;zsh-syntax-highlighting-설치&#34;&gt;zsh-syntax-highlighting 설치&lt;/h4&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ vi .zshrc
plugins=(... zsh-syntax-highlighting ...)
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;테마-설치&#34;&gt;테마 설치&lt;/h3&gt;
&lt;h4 id=&#34;powerlevel10k-설치&#34;&gt;Powerlevel10k 설치&lt;/h4&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ git clone --depth=1 https://github.com/romkatv/powerlevel10k.git &amp;#34;${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ vi .zshrc
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;powerlevel10k 설정 후, 커스텀하기 위해 설정파일을 복사하여 수정함.
원본 파일이 어떤건지 까먹었음. 원본파일이 어떤건지 찾아야 함. 최신버전 반영해야 함&lt;/p&gt;</description>
    </item>
    <item>
      <title>ImageMagick crop</title>
      <link>https://dont.kr/posts/2025/2025-03-26-imagemagick-crop/</link>
      <pubDate>Wed, 26 Mar 2025 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2025/2025-03-26-imagemagick-crop/</guid>
      <description>&lt;h3 id=&#34;imagemagick-설치하기&#34;&gt;ImageMagick 설치하기&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ brew install imagemagick
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;shell-script-로-이미지-자르기&#34;&gt;Shell Script 로 이미지 자르기&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ magick 원본이미지.jpg -crop {가로}x{세로}+{x좌표}+{y좌표} 잘린이미지.jpg
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ex)&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ magick a.jpg -crop 1179x1040+0+420 1.jpg
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;old-ver-shell-script-로-이미지-자르기&#34;&gt;(Old ver) Shell Script 로 이미지 자르기&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ convert 원본이미지.jpg -crop {가로}x{세로}+{x좌표}+{y좌표} 잘린이미지.jpg
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ex)&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ convert a.jpg -crop 1179x1040+0+420 1.jpg
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>IntelliJ debug variable json view</title>
      <link>https://dont.kr/posts/2024/2024-11-07-intellij-debug-variable-json-view/</link>
      <pubDate>Thu, 07 Nov 2024 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2024/2024-11-07-intellij-debug-variable-json-view/</guid>
      <description>&lt;h3 id=&#34;intellij-debug-variable-json-view&#34;&gt;IntelliJ debug variable json view&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;new com.fasterxml.jackson.databind.ObjectMapper()
.registerModule(new com.fasterxml.jackson.datatype.jsr310.JavaTimeModule()) 
.disable(com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) 
.writerWithDefaultPrettyPrinter() 
.writeValueAsString();
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Hugo 태그 설정</title>
      <link>https://dont.kr/posts/2024/2024-01-12-hugo-tags/</link>
      <pubDate>Fri, 12 Jan 2024 19:10:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2024/2024-01-12-hugo-tags/</guid>
      <description>&lt;h3 id=&#34;hugo-기본-설정으로-tags-사용&#34;&gt;Hugo 기본 설정으로 tags 사용&lt;/h3&gt;
&lt;h3 id=&#34;papermod-테마-설정&#34;&gt;PaperMod 테마 설정&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;hugo.yaml 파일 수정&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;menu:
  main:
    - identifier: tags
      name: tags
      url: /tags/
      weight: 10
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;content-에-태그-추가&#34;&gt;content 에 태그 추가&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;tags: 
- hugo
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;참고-링크&#34;&gt;참고 링크&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Hugo Taxonomies: &lt;a href=&#34;https://gohugo.io/content-management/taxonomies/&#34;&gt;https://gohugo.io/content-management/taxonomies/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PaperMod wiki: &lt;a href=&#34;https://github.com/adityatelange/hugo-PaperMod/wiki/Installation#sample-configyml&#34;&gt;https://github.com/adityatelange/hugo-PaperMod/wiki/Installation#sample-configyml&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Synology NAS ssh 설정</title>
      <link>https://dont.kr/posts/2024/2024-01-05-synology-nas-ssh/</link>
      <pubDate>Fri, 05 Jan 2024 19:10:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2024/2024-01-05-synology-nas-ssh/</guid>
      <description>&lt;h3 id=&#34;synology-nas-ssh-설정&#34;&gt;Synology NAS ssh 설정&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;DSM 7.2.1 기준&lt;/li&gt;
&lt;li&gt;제어판 - 터미널 및 SNMP - 터미널
&lt;ul&gt;
&lt;li&gt;SSH 서비스 활성화&lt;/li&gt;
&lt;li&gt;포트 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;공유기-포트포워딩&#34;&gt;공유기 포트포워딩&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Synology NAS 에서 설정한 ssh 포트로 포트포워딩 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;ssh-클라이언트에서-접속&#34;&gt;ssh 클라이언트에서 접속&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;$ ssh -p [포트] [아이디]@[시놀로지주소]&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>IntelliJ SonarLint 한글 이름 사용</title>
      <link>https://dont.kr/posts/2024/2024-01-02-intellij-sonarlint-korean-naming/</link>
      <pubDate>Tue, 02 Jan 2024 19:10:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2024/2024-01-02-intellij-sonarlint-korean-naming/</guid>
      <description>&lt;h3 id=&#34;intellij-sonarlint-플러그인-설치&#34;&gt;IntelliJ SonarLint 플러그인 설치&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://plugins.jetbrains.com/plugin/7973-sonarlint&#34;&gt;https://plugins.jetbrains.com/plugin/7973-sonarlint&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;sonarlint-설정&#34;&gt;SonarLint 설정&lt;/h3&gt;
&lt;p&gt;IntelliJ - Settings - Tools - SonarLint - Rules&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;photo&#34; loading=&#34;lazy&#34; src=&#34;https://dont.kr/posts/2024/2024-01-02-intellij-sonarlint-korean-naming/images/1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;각 룰 마다 다음 정규표현식 설정&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Class names: ^[A-Z][a-zA-Z0-9]*|[A-Z가-힣][a-zA-Z0-9가-힣_]*$
Field names: ^[a-z][a-zA-Z0-9]*|[a-z가-힣][a-zA-Z0-9가-힣_]*$
Interface names: ^[A-Z][a-zA-Z0-9]*|[A-Z가-힣][a-zA-Z0-9가-힣_]*$
Local variable and method parameter names: ^[a-z][a-zA-Z0-9]*|[a-z가-힣][a-zA-Z0-9가-힣_]*$
Method names: ^[a-z][a-zA-Z0-9]*|[a-z가-힣][a-zA-Z0-9가-힣_]*$
Test class names: ^((Test|IT)[a-zA-Z0-9가-힣_]+|[A-Z][a-zA-Z0-9_]*|[A-Z가-힣][a-zA-Z0-9가-힣_]*(Test|Tests|TestCase|IT|ITCase))$
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Legacy 테스트 - Subclass and Override Method</title>
      <link>https://dont.kr/posts/2023/2023-07-28-legacy-testing-subclass-and-override-method/</link>
      <pubDate>Fri, 28 Jul 2023 19:10:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2023/2023-07-28-legacy-testing-subclass-and-override-method/</guid>
      <description>&lt;h2 id=&#34;레거시-코드-일를-테스트하기-위해-subclass-and-override-method-방법-적용&#34;&gt;레거시 코드 일를 테스트하기 위해 Subclass and Override Method 방법 적용&lt;/h2&gt;
&lt;h3 id=&#34;subclass-and-override-method-방법&#34;&gt;Subclass and Override Method 방법&lt;/h3&gt;
&lt;p&gt;참고 링크: &lt;a href=&#34;https://youtu.be/Dct4bGKCmI8&#34;&gt;https://youtu.be/Dct4bGKCmI8&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;테스트하기 어려운 부분이 존재할 때 다루는 기법&lt;/p&gt;
&lt;h4 id=&#34;1-레거시-코드에서-테스트-대상을-방해하는-부분을-메소드로-분리한다&#34;&gt;1. 레거시 코드에서 테스트 대상을 방해하는 부분을 메소드로 분리한다.&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;레거시 코드의 의존성을 분리하기 위해 메소드 단위로 코드를 분리&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;2-분리한-메소드를-protected-로-변경한다&#34;&gt;2. 분리한 메소드를 protected 로 변경한다&lt;/h4&gt;
&lt;h4 id=&#34;3-테스트하고자-하는-클래스를-상속받아-테스트용-클래스를-만들고-분리한-메소드를-재정의-한다&#34;&gt;3. 테스트하고자 하는 클래스를 상속받아 테스트용 클래스를 만들고, 분리한 메소드를 재정의 한다.&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Stubbing&lt;/li&gt;
&lt;li&gt;실제 동작과는 다르게 테스트 코드를 쉽게 만들기 위한 작업&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;4-테스트용-클래스를-이용해서-테스트-대상을-테스트하는-코드를-작성한다&#34;&gt;4. 테스트용 클래스를 이용해서 테스트 대상을 테스트하는 코드를 작성한다.&lt;/h4&gt;</description>
    </item>
    <item>
      <title>[re] Hello World</title>
      <link>https://dont.kr/posts/2023/2023-07-10-hello-world-by-hugo/</link>
      <pubDate>Mon, 10 Jul 2023 19:10:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2023/2023-07-10-hello-world-by-hugo/</guid>
      <description>&lt;h2 id=&#34;re-hello-world&#34;&gt;[re] Hello World&lt;/h2&gt;
&lt;p&gt;[re] &lt;strong&gt;H&lt;/strong&gt;ello &lt;strong&gt;W&lt;/strong&gt;orld by &lt;a href=&#34;https://pages.github.com/&#34;&gt;GitHub Pages&lt;/a&gt; &amp;amp; &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;install-golang&#34;&gt;install golang&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ brew install golang
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;install-hugoo&#34;&gt;install Hugoo&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://gohugo.io/installation/macos/&#34;&gt;https://gohugo.io/installation/macos/&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ brew install hugo
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;github-저장소-생성&#34;&gt;github 저장소 생성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;duddns.github.io: GitHub Pages 저장소&lt;/li&gt;
&lt;li&gt;dontkr-hugo: Hogo 소스 저장소&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;create-a-site&#34;&gt;Create a site&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ hugo new site dontkr-hugo
$ cd dontkr-hugo
$ git init
$ git submodule add -b master https://github.com/adityatelange/hugo-PaperMod.git themes/PaperMod
$ git submodule add -b main https://@github.com/duddns/duddns.github.io.git public
$ echo &amp;#34;theme = &amp;#39;PaperMod&amp;#39;&amp;#34; &amp;gt;&amp;gt; hugo.toml
$ hugo server
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;configure&#34;&gt;configure&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;baseURL = &amp;#39;https://dont.kr&amp;#39;
languageCode = &amp;#39;en-us&amp;#39;
title = &amp;#39;DoNT - Do Not Think!!!&amp;#39;
theme = &amp;#39;PaperMod&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;publish&#34;&gt;publish&lt;/h3&gt;
&lt;p&gt;GitHub Pages 저장소와 Hogo 소스 저장소 두 번 push 해야 함&lt;/p&gt;</description>
    </item>
    <item>
      <title>[Backup] Visual Studio Code Regex Replace</title>
      <link>https://dont.kr/posts/2022/2022-04-30-backup-vs-code-regex-replace/</link>
      <pubDate>Sat, 30 Apr 2022 14:02:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2022/2022-04-30-backup-vs-code-regex-replace/</guid>
      <description>&lt;h3 id=&#34;-10개-마다-줄-바꿈-하기&#34;&gt;, 10개 마다 줄 바꿈 하기&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;((.+, ){10})
$1\n
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>[Backup] gradle 의존성 갱신</title>
      <link>https://dont.kr/posts/2021/2021-10-28-backup-gradle-refresh-dependencies/</link>
      <pubDate>Thu, 28 Oct 2021 09:49:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2021/2021-10-28-backup-gradle-refresh-dependencies/</guid>
      <description>&lt;h3 id=&#34;방법-1&#34;&gt;방법 1&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ rm -rf ~/.gradle/caches
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;프로젝트가 여러개 일 경우 모두 초기화&lt;/p&gt;
&lt;h3 id=&#34;방법-2&#34;&gt;방법 2&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ./gradlew build --refresh-dependencies
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>[Backup] aws ec2 인스턴스 생성후 하는 작업 v3</title>
      <link>https://dont.kr/posts/2020/2020-03-09-aws-ec2-initialize-v3/</link>
      <pubDate>Mon, 09 Mar 2020 16:24:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2020/2020-03-09-aws-ec2-initialize-v3/</guid>
      <description>&lt;h3 id=&#34;업데이트&#34;&gt;업데이트&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo apt update ; sudo apt upgrade -y
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;zsh&#34;&gt;zsh&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo apt install zsh
$ curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh
$ sudo chsh -s $(which zsh) ubuntu
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;vim&#34;&gt;vim&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo add-apt-repository ppa:jonathonf/vim
$ sudo apt update
$ sudo apt install vim
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;java-spring-boot-application-실행을-위해&#34;&gt;java (spring boot application 실행을 위해)&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ wget -qO - https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public | sudo apt-key add -
$ sudo add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/
$ sudo apt update
$ sudo apt install adoptopenjdk-13-hotspot
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;nginx-웹서버-및-ssl-적용을-위해&#34;&gt;nginx (웹서버 및 SSL 적용을 위해)&lt;/h3&gt;
&lt;h4 id=&#34;nginx-설치&#34;&gt;nginx 설치&lt;/h4&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ echo &amp;#34;deb http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx&amp;#34; | sudo tee /etc/apt/sources.list.d/nginx.list
$ curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
$ sudo apt-key fingerprint ABF5BD827BD9BF62
    pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14] 573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62 uid [ unknown] nginx signing key &amp;lt;signing-key@nginx.com&amp;gt; 
$ sudo apt-get update
$ sudo apt-get install nginx
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;nginx-설정&#34;&gt;nginx 설정&lt;/h4&gt;
&lt;h4 id=&#34;ssl-설정&#34;&gt;ssl 설정&lt;/h4&gt;
&lt;h4 id=&#34;badbot-blocker&#34;&gt;badbot blocker&lt;/h4&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/mariusv/nginx-badbot-blocker/tree/master/VERSION_2&#34;&gt;https://github.com/mariusv/nginx-badbot-blocker/tree/master/VERSION_2&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>[Backup] ngrok - secure introspectable tunnels to localhost</title>
      <link>https://dont.kr/posts/2019/2019-07-09-ngrok/</link>
      <pubDate>Tue, 09 Jul 2019 10:29:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2019/2019-07-09-ngrok/</guid>
      <description>&lt;h3 id=&#34;ngrok&#34;&gt;ngrok&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://ngrok.com/&#34;&gt;https://ngrok.com/&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>[Backup] brew - mac package manage</title>
      <link>https://dont.kr/posts/2019/2019-04-08-brew-mac-package-manage/</link>
      <pubDate>Mon, 08 Apr 2019 13:36:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2019/2019-04-08-brew-mac-package-manage/</guid>
      <description>&lt;h3 id=&#34;brew&#34;&gt;brew&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ brew install {PACKAGE_NAME}
$ brew update
$ brew upgrade
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>[Backup] 로그로 남기면 좋은 것들</title>
      <link>https://dont.kr/posts/2019/2019-01-28-%EB%A1%9C%EA%B7%B8%EB%A1%9C-%EB%82%A8%EA%B8%B0%EB%A9%B4-%EC%A2%8B%EC%9D%80-%EA%B2%83%EB%93%A4/</link>
      <pubDate>Mon, 28 Jan 2019 11:14:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2019/2019-01-28-%EB%A1%9C%EA%B7%B8%EB%A1%9C-%EB%82%A8%EA%B8%B0%EB%A9%B4-%EC%A2%8B%EC%9D%80-%EA%B2%83%EB%93%A4/</guid>
      <description>&lt;h3 id=&#34;16-log-domains&#34;&gt;1.6. Log Domains&lt;/h3&gt;
&lt;p&gt;로그를 남기는 이유는 몇가지로 분류될수 있습니다.&lt;/p&gt;
&lt;h4 id=&#34;161-개발-로그development-log&#34;&gt;1.6.1. 개발 로그(Development Log)&lt;/h4&gt;
&lt;p&gt;개발자가 디버깅 및 흐름 추적을 위해 기록하는 내용입니다.보통 debug, trace레벨로 기록합니다.&lt;/p&gt;
&lt;h4 id=&#34;162-운영-로그maintenance-log&#34;&gt;1.6.2. 운영 로그(Maintenance Log)&lt;/h4&gt;
&lt;p&gt;운영에 관련된 로그입니다. 디스크가 꽉 찼거나, 인터페이싱 과정에서 타입아웃이 발생했거나 하는등 운영을 모니터링하기 위한 용도의 로그입니다. 보통 WARNING이나 ERROR로 기록됩니다.&lt;/p&gt;
&lt;h4 id=&#34;163-비지니스-로그business-log&#34;&gt;1.6.3. 비지니스 로그(Business log)&lt;/h4&gt;
&lt;p&gt;비지니스적으로 의미가 있고 추후 추적하기 위한 로그입니다. 장바구니 상품추가, 로그인, 결제등이 대표적입니다. 보통 INFO로 기록합니다.&lt;/p&gt;
&lt;h4 id=&#34;164-감사-로그audit-log&#34;&gt;1.6.4. 감사 로그(Audit log)&lt;/h4&gt;
&lt;p&gt;감사 로그는 보안 관련 시간순 기록, 기록 집합 및 / 또는 대상 및 기록 데이터 소스입니다. 특정 작업, 절차 또는 기록에 언제든지 영향을 미친 활동 순서에 대한 증빙 자료를 제공하기 위해 기록됩니다. 보통 INFO이지만 운영자가 수정가능하지 않는 곳에 저장합니다.&lt;/p&gt;</description>
    </item>
    <item>
      <title>[Backup] MySQL 대용량 sql import 시 진행상황 확인하기</title>
      <link>https://dont.kr/posts/2018/2018-11-29-mysql-%EB%8C%80%EC%9A%A9%EB%9F%89-sql-import-%EC%8B%9C-%EC%A7%84%ED%96%89%EC%83%81%ED%99%A9-%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0/</link>
      <pubDate>Thu, 29 Nov 2018 15:53:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2018/2018-11-29-mysql-%EB%8C%80%EC%9A%A9%EB%9F%89-sql-import-%EC%8B%9C-%EC%A7%84%ED%96%89%EC%83%81%ED%99%A9-%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0/</guid>
      <description>&lt;h3 id=&#34;pipe-viewer&#34;&gt;Pipe Viewer&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.ivarch.com/programs/pv.shtml&#34;&gt;https://www.ivarch.com/programs/pv.shtml&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ pv dump.sql | mysql -uuser -ppassword database
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>[Backup] swagger-diff swagger 문서 내용 비교</title>
      <link>https://dont.kr/posts/2018/2018-11-29-swagger-diff-swagger-%EB%AC%B8%EC%84%9C-%EB%82%B4%EC%9A%A9-%EB%B9%84%EA%B5%90/</link>
      <pubDate>Thu, 29 Nov 2018 15:49:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2018/2018-11-29-swagger-diff-swagger-%EB%AC%B8%EC%84%9C-%EB%82%B4%EC%9A%A9-%EB%B9%84%EA%B5%90/</guid>
      <description>&lt;h3 id=&#34;swagger-diff&#34;&gt;swagger-diff&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;http://deepoove.com/swagger-diff/&#34;&gt;http://deepoove.com/swagger-diff/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;이전 버전의 API 와 신규 버전의 API 를 비교하여 변경 내용을 html 파일로 출력&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ java -jar swagger-diff.jar \
-old http://petstore.swagger.io/v2/swagger.json \
-new http://petstore.swagger.io/v2/swagger.json \
-v 2.0 \
-output-mode html &amp;gt; diff.html
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>[Backup] Spirng Boot embedded tomcat 매우 늦게 실행되는 문제</title>
      <link>https://dont.kr/posts/2018/2018-08-08-spirng-boot-embedded-tomcat-%EB%A7%A4%EC%9A%B0-%EB%8A%A6%EA%B2%8C-%EC%8B%A4%ED%96%89%EB%90%98%EB%8A%94-%EB%AC%B8%EC%A0%9C/</link>
      <pubDate>Wed, 08 Aug 2018 14:32:00 +0900</pubDate>
      <guid>https://dont.kr/posts/2018/2018-08-08-spirng-boot-embedded-tomcat-%EB%A7%A4%EC%9A%B0-%EB%8A%A6%EA%B2%8C-%EC%8B%A4%ED%96%89%EB%90%98%EB%8A%94-%EB%AC%B8%EC%A0%9C/</guid>
      <description>&lt;h3 id=&#34;운영-상태&#34;&gt;운영 상태&lt;/h3&gt;
&lt;p&gt;nginx + spring boot application&lt;/p&gt;
&lt;h3 id=&#34;에러-증상&#34;&gt;에러 증상&lt;/h3&gt;
&lt;p&gt;실제 spring boot application 실행 완료후 브라우저 접속하면 무한 대기상태&lt;/p&gt;
&lt;h3 id=&#34;에러-로그&#34;&gt;에러 로그&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;SessionIdGeneratorBase : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [xxx,xxx] milliseconds
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;에러-해결&#34;&gt;에러 해결&lt;/h3&gt;
&lt;p&gt;spring boot application 실행 옵션 추가&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;-Djava.security.egd=file:/dev/./urandom
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Hello World</title>
      <link>https://dont.kr/posts/1979/1979-11-10-hello-world/</link>
      <pubDate>Sat, 10 Nov 1979 00:00:00 +0900</pubDate>
      <guid>https://dont.kr/posts/1979/1979-11-10-hello-world/</guid>
      <description>&lt;h2 id=&#34;hello-world&#34;&gt;Hello World&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;H&lt;/strong&gt;ello &lt;strong&gt;W&lt;/strong&gt;orld&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
