<?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>Persistence on Kelly Dev</title><link>https://kelly-chui.github.io/tags/persistence/</link><description>Recent content in Persistence on Kelly Dev</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 10 Aug 2026 17:42:56 +0900</lastBuildDate><atom:link href="https://kelly-chui.github.io/tags/persistence/index.xml" rel="self" type="application/rss+xml"/><item><title>devbox-light-server (6). Json 영속성</title><link>https://kelly-chui.github.io/posts/devbox-light-server-06-persistence/</link><pubDate>Mon, 10 Aug 2026 14:14:08 +0900</pubDate><guid>https://kelly-chui.github.io/posts/devbox-light-server-06-persistence/</guid><description>&lt;p&gt;MVP의 마지막 기능으로 서버를 재시작해도 데이터가 사라지지 않도록 영속성을 추가했다.&lt;/p&gt;
&lt;p&gt;이번 포스트에서는 devbox-light-server에 DB, Storage, Token Storage에서 영속성을 가진 저장 방식을 구현해서 in-memory 대신 사용할 수 있도록 만든다.&lt;/p&gt;
&lt;p&gt;프로토타입이었던 dev-data-server에서는 시작부터 SQL 의존성을 가지고 시작했지만, devbox-light-server는 아주 얇은 in-memory 구현만 가지고 있다.&lt;/p&gt;
&lt;p&gt;MVP 마지막에 영속성을 넣는 이유는 서버를 구현할 때, 특정 구현에 휘둘리지 않기 위해서다. dev-data-server에서 SQL을 빠르게 들여와서, 결국 프로젝트가 SQL 래퍼가 된 느낌이 있다.&lt;/p&gt;
&lt;p&gt;당연히 Service 레이어는 Repository의 인터페이스에만 의존하므로 어떤 방법을 쓰든 단순히 구현체만 갈아 끼우고, 의존성 생성, 연결 부분을 제외하고는 어떠한 코드에도 변화가 없어야 한다.&lt;/p&gt;</description></item><item><title>devbox-light-server (7). Dockerizing, MVP 마무리</title><link>https://kelly-chui.github.io/posts/devbox-light-server-07-dockerizing/</link><pubDate>Mon, 10 Aug 2026 17:42:56 +0900</pubDate><guid>https://kelly-chui.github.io/posts/devbox-light-server-07-dockerizing/</guid><description>&lt;h2 id="도커라이징"&gt;도커라이징&lt;/h2&gt;
&lt;p&gt;영속성까지 추가했으므로 이제 서버를 하나의 실행 단위로 묶을 차례다.&lt;/p&gt;
&lt;p&gt;지금까지는 로컬에서 Node.js를 설치하고, 의존성을 설치하고, TypeScript를 빌드한 다음 서버를 실행했다. 혼자 개발할 때는 큰 문제가 없지만, 이 서버를 다른 환경에서 실행하려면 매번 같은 준비 과정을 반복해야 한다.&lt;/p&gt;
&lt;p&gt;도커라이징은 이 과정을 이미지 안에 고정하는 작업이다. 이 프로젝트에서는 Express 서버를 빌드하고, 실행에 필요한 파일만 담은 뒤, &lt;code&gt;.data&lt;/code&gt; 디렉터리를 기준으로 데이터를 유지할 수 있도록 구성했다.&lt;/p&gt;
&lt;h3 id="dockerfile-작성하기"&gt;Dockerfile 작성하기&lt;/h3&gt;
&lt;p&gt;Dockerfile은 두 단계로 나눴다.&lt;/p&gt;
&lt;div class="code-theme-github"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:24-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;build&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; package.json package-lock.json ./&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; npm ci&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; tsconfig.json tsconfig.build.json ./&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; src ./src&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; npm run build&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;첫 번째 &lt;code&gt;build&lt;/code&gt; 단계에서는 개발 의존성을 포함해서 설치하고 TypeScript를 빌드한다. &lt;code&gt;npm run build&lt;/code&gt;를 실행하면 &lt;code&gt;dist&lt;/code&gt; 디렉터리가 만들어진다.&lt;/p&gt;</description></item></channel></rss>