<?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 PolarBear</title><link>https://polar7bear.dev/posts/</link><description>Recent content in Posts on PolarBear</description><image><title>PolarBear</title><url>https://polar7bear.dev/og-default.jpg</url><link>https://polar7bear.dev/og-default.jpg</link></image><generator>Hugo -- 0.160.1</generator><language>ko-kr</language><lastBuildDate>Mon, 23 Mar 2026 23:28:51 +0900</lastBuildDate><atom:link href="https://polar7bear.dev/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>300만 건의 데이터에서 대량 DELETE를 지양해야 하는 이유</title><link>https://polar7bear.dev/posts/database/300-delete/</link><pubDate>Mon, 23 Mar 2026 23:28:51 +0900</pubDate><guid>https://polar7bear.dev/posts/database/300-delete/</guid><description>&lt;h2 id="들어가며"&gt;들어가며&lt;/h2&gt;
&lt;p&gt;최근 팀장님과 데이터베이스 최적화에 대해 이야기를 나누었다. 당시 대화의 주제는 &amp;ldquo;300만 건이 넘는 대규모 로그 테이블에서 불필요한 과거 데이터를 어떻게 정리할 것인가?&amp;rdquo; 였다.&lt;/p&gt;
&lt;p&gt;나는 이 질문을 듣고 바로 조건문을 달아 DELETE 쿼리를 날리면 된다고 생각했지만, 깊게 생각해보지 않은 1차원적인 답변이었다. 내 답변을 듣고 난 후의 팀장님의 대답은 &amp;ldquo;대용량 환경에서는 DELETE 쿼리를 사용하는 것이 능사가 아니라는 것&amp;rdquo; 이다.&lt;/p&gt;
&lt;p&gt;이 내용을 주제로 해결책과 근본적인 아키텍처까지 정리해 보고자 한다.&lt;/p&gt;
&lt;br&gt;
&lt;h2 id="300만-건의-로그-정리-방법"&gt;300만 건의 로그 정리 방법&lt;/h2&gt;
&lt;p&gt;팀장님이 내게 다음과 같은 질문을 던지셨다.&lt;/p&gt;</description></item><item><title>In-Memory DB 구현 10편 - Decoder와 Checksum으로 영속화 된 데이터 불러오기</title><link>https://polar7bear.dev/posts/computer-science/in-memory-db-10-decoder-checksum/</link><pubDate>Wed, 25 Feb 2026 16:16:22 +0900</pubDate><guid>https://polar7bear.dev/posts/computer-science/in-memory-db-10-decoder-checksum/</guid><description>&lt;h2 id="들어가며"&gt;들어가며&lt;/h2&gt;
&lt;p&gt;이전 포스팅에서 구현 했던 Encoder와 SAVE 명령으로 데이터가 바이너리 파일로 저장되어 생성되긴 하지만 아직 복원 기능이 없어서 서버를 재시작하면 저장된 바이너리 파일이 있어도 해당 바이너리 파일을 역직렬화하고 로드하는 기능은 구현하지 않았기때문에 데이터는 전부 사라진다. 이번 포스팅에서는 바이너리 파일을 읽어 메모리 자료구조로 복원하는 Decoder를 구현하고 CRC32 Checksum으로 파일이 손상되지 않았는지 검증하는 메커니즘을 추가해보자. 서버 시작 시 자동으로 RDB 파일을 로드하여 영속성 사이클을 완성하는 것이 최종 목표다.&lt;/p&gt;
&lt;br&gt;
&lt;hr&gt;
&lt;br&gt;
&lt;h2 id="데이터-무결성"&gt;데이터 무결성&lt;/h2&gt;
&lt;p&gt;데이터 무결성은 데이터가 저장, 전송, 처리되는 전 과정에서 의도하지 않은 변경이 발생하지 않았음을 보장하는 성질이다. 데이터베이스 이론에서는 ACID의 Consistency와 연결되지만 여기서 다루는 것은 더 낮은 레벨의 문제인 &lt;strong&gt;파일 자체가 물리적으로 온전한가&lt;/strong&gt;에 대한 것이다.&lt;/p&gt;</description></item><item><title>In-Memory DB 구현 9편 - 데이터 영속화하기</title><link>https://polar7bear.dev/posts/computer-science/in-memory-db-9/</link><pubDate>Tue, 24 Feb 2026 00:12:30 +0900</pubDate><guid>https://polar7bear.dev/posts/computer-science/in-memory-db-9/</guid><description>&lt;h2 id="들어가며"&gt;들어가며&lt;/h2&gt;
&lt;p&gt;현재까지 구축한 데이터베이스로는 서버를 종료하거나 장애가 발생하면 저장된 데이터는 전부 사라진다. 이번 포스팅에서는 메모리의 현재 상태를 바이너리 파일로 기록하는 SAVE 명령어를 구현한다. 이 과정에서 바이너리 인코딩, 직렬화 포맷 설계, 파일 I/O의 핵심 개념을 다뤄보자.&lt;/p&gt;
&lt;br&gt;
&lt;h2 id="영속성과-스냅샷"&gt;영속성과 스냅샷&lt;/h2&gt;
&lt;p&gt;데이터베이스에서 영속성(Persistence)이란, 데이터가 프로세스의 생명주기를 넘어서 유지되는 성질이다. 인메모리 데이터베이스는 기본적으로 영속성이 없다. 메모리는 휘발성 저장장치이기 때문이다.&lt;/p&gt;
&lt;p&gt;레디스는 두 가지 방식으로 영속성을 제공한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RDB (Redis Database)&lt;/strong&gt; - 특정 시점의 메모리 상태를 통째로 파일에 덤프하는 스냅샷 방식이다. 파일이 작고 로딩이 빠르지만 마지막 스냅샷 이후의 데이터는 유실될 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AOF (Append Only File)&lt;/strong&gt; - 모든 쓰기 명령을 로그 파일에 순서대로 기록하는 저널링 방식이다. 데이터 유실이 거의 없지만 파일 크기가 크고 로딩이 느리다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;필자는 RDB 방식을 구현할 생각이다. &lt;code&gt;SAVE&lt;/code&gt; 명령을 실행하면 메모리의 모든 데이터를 바이너리 파일에 기록한다.&lt;/p&gt;</description></item><item><title>In-Memory DB 구현 8편 - TTL과 만료 전략, 최소힙으로 데이터 수명 관리하기</title><link>https://polar7bear.dev/posts/computer-science/in-memory-db-8-ttl/</link><pubDate>Thu, 19 Feb 2026 20:28:38 +0900</pubDate><guid>https://polar7bear.dev/posts/computer-science/in-memory-db-8-ttl/</guid><description>&lt;h2 id="들어가며"&gt;들어가며&lt;/h2&gt;
&lt;p&gt;지금까지 구현한 데이터베이스에서 저장된 모든 데이터는 명시적으로 삭제하지 않는 한 영구적으로 존재한다. 하지만 세션 토큰, 캐시 데이터, 인증 코드 같은 것들은 일정 시간이 지나면 자동으로 사라져야 한다. 이번 포스팅에서는 키에 만료 시간(TTL)을 설정하고 만료된 키를 자동으로 삭제하는 두 가지 전략을 구현한다. 그 과정에서 최소 힙 자료구조를 직접 구현하고 백그라운드 고루틴의 라이프사이클도 관리해보는 과정을 다뤄보겠다.&lt;/p&gt;
&lt;br&gt;
&lt;hr&gt;
&lt;br&gt;
&lt;h2 id="ttl"&gt;TTL&lt;/h2&gt;
&lt;p&gt;TTL(Time To Live)은 데이터가 유효한 시간을 의미한다. 네트워크 패킷에서는 홉 수를 제한하고 DNS 캐시에서는 레코드의 유효 기간을 정하고, CDN에서는 캐시 갱신 주기를 결정한다. 컴퓨터 시스템 전반에서 &amp;ldquo;이 데이터가 얼마나 오래 살아야 하는가&amp;quot;를 제어하는 수단으로 널리 쓰인다.&lt;/p&gt;</description></item><item><title>In-Memory DB 구현 7편 - 이중 연결 리스트로 List 명령어 구현하기</title><link>https://polar7bear.dev/posts/computer-science/in-memory-db-7-list/</link><pubDate>Wed, 11 Feb 2026 19:50:30 +0900</pubDate><guid>https://polar7bear.dev/posts/computer-science/in-memory-db-7-list/</guid><description>배열과 연결 리스트의 메모리 배치 차이를 비교하고, 이중 연결 리스트로 LPUSH/RPUSH/LPOP/RPOP 명령어를 O(1)로 구현한다.</description></item><item><title>In-Memory DB 구현 6편 - Race Condition과 뮤텍스로 동시성 안전한 저장소 만들기</title><link>https://polar7bear.dev/posts/computer-science/in-memory-db-6-race-condition/</link><pubDate>Mon, 09 Feb 2026 18:46:05 +0900</pubDate><guid>https://polar7bear.dev/posts/computer-science/in-memory-db-6-race-condition/</guid><description>Race Condition의 본질과 Data Race의 차이를 이해하고, 세마포어와 뮤텍스를 활용한 동기화 기법으로 안전한 저장소를 구현한다.</description></item><item><title>In-Memory DB 구현 5편 - 고루틴으로 동시성 서버 만들기(프로세스/스레드/컨텍스트스위칭/GMP)</title><link>https://polar7bear.dev/posts/computer-science/in-memory-db-5/</link><pubDate>Sat, 07 Feb 2026 17:43:37 +0900</pubDate><guid>https://polar7bear.dev/posts/computer-science/in-memory-db-5/</guid><description>프로세스와 스레드의 차이, 컨텍스트 스위칭 비용, Go의 GMP 스케줄러 모델을 이해하고 고루틴으로 동시성 서버를 구현한다.</description></item><item><title>In-Memory DB 구현 4편 - 저장소 구현 (해시 테이블/해시충돌/리팩터/리해싱)</title><link>https://polar7bear.dev/posts/computer-science/in-memory-db-4/</link><pubDate>Wed, 04 Feb 2026 16:58:00 +0900</pubDate><guid>https://polar7bear.dev/posts/computer-science/in-memory-db-4/</guid><description>Key-Value 저장소 구현을 통해 해시 테이블 원리, 해시 충돌 해결 전략, 로드 팩터와 리해싱의 동작 원리를 설명한다.</description></item><item><title>In-Memory DB 구현 3편 - RESP 프로토콜</title><link>https://polar7bear.dev/posts/computer-science/in-memory-db-3-resp/</link><pubDate>Mon, 02 Feb 2026 16:19:12 +0900</pubDate><guid>https://polar7bear.dev/posts/computer-science/in-memory-db-3-resp/</guid><description>Redis Serialization Protocol(RESP) 구조와 바이너리 세이프 개념을 이해하고 직접 파서를 구현하는 과정을 다룬다.</description></item><item><title>In-Memory DB 구현 2편 - TCP 스트림 파싱하기 (TCP 스트림/시스템콜/버퍼링)</title><link>https://polar7bear.dev/posts/computer-science/in-memory-db-2-tcp/</link><pubDate>Fri, 30 Jan 2026 13:05:44 +0900</pubDate><guid>https://polar7bear.dev/posts/computer-science/in-memory-db-2-tcp/</guid><description>TCP 스트림의 특성과 메시지 경계 문제를 다루고, 시스템콜과 버퍼링을 통한 스트림 파싱 구현 방법을 설명한다.</description></item><item><title>In-Memory DB 구현 1편 - HTTP 없이 TCP 소켓 직접 제어하기</title><link>https://polar7bear.dev/posts/computer-science/in-memory-db-1-http-tcp/</link><pubDate>Wed, 28 Jan 2026 15:29:53 +0900</pubDate><guid>https://polar7bear.dev/posts/computer-science/in-memory-db-1-http-tcp/</guid><description>Go로 TCP 소켓을 직접 다루며 In-Memory DB를 구현하는 과정을 다룬다. 소켓의 본질, 3-way handshake, listen/accept 동작 원리를 설명한다.</description></item><item><title>Garbage Collection 이해하기</title><link>https://polar7bear.dev/posts/java/garbage-collection/</link><pubDate>Thu, 15 Jan 2026 16:09:49 +0900</pubDate><guid>https://polar7bear.dev/posts/java/garbage-collection/</guid><description>JVM의 힙 영역 구조와 가비지 컬렉션의 동작 원리를 학습하여 자바 메모리 관리를 이해한다.</description></item><item><title>JVM 구조 이해하기</title><link>https://polar7bear.dev/posts/java/1-jvm/</link><pubDate>Thu, 08 Jan 2026 00:27:08 +0900</pubDate><guid>https://polar7bear.dev/posts/java/1-jvm/</guid><description>JVM의 전체 구조와 Runtime Data Area, JIT 컴파일러 등 자바 실행 환경의 핵심 개념을 정리한다.</description></item><item><title>Spring에서 Node.js(Fastify)으로 전환하기(5) - Playwright로 E2E 테스트 자동화</title><link>https://polar7bear.dev/posts/nodejs/spring-node-js-fastify-5-playwright-e2e/</link><pubDate>Fri, 14 Nov 2025 17:23:52 +0900</pubDate><guid>https://polar7bear.dev/posts/nodejs/spring-node-js-fastify-5-playwright-e2e/</guid><description>Playwright MCP를 활용하여 Fastify REST API의 E2E 테스트를 자동화하는 과정을 다룬다.</description></item><item><title>Spring에서 Node.js(Fastify)으로 전환하기(4) - Plan 도메인 구현하기</title><link>https://polar7bear.dev/posts/nodejs/spring-node-js-fastify-4-plan/</link><pubDate>Thu, 13 Nov 2025 22:34:52 +0900</pubDate><guid>https://polar7bear.dev/posts/nodejs/spring-node-js-fastify-4-plan/</guid><description>Zod 스키마를 사용하여 Plan 도메인의 CRUD REST API를 Fastify 환경에서 구현하는 과정을 설명한다.</description></item><item><title>Spring에서 Node.js(Fastify)으로 전환하기(3) - 환경변수와 데이터베이스 플러그인 설정 Feat. Spring vs Fastify</title><link>https://polar7bear.dev/posts/nodejs/spring-node-js-fastify-3-feat-spring-vs-fastify/</link><pubDate>Wed, 12 Nov 2025 21:25:18 +0900</pubDate><guid>https://polar7bear.dev/posts/nodejs/spring-node-js-fastify-3-feat-spring-vs-fastify/</guid><description>Fastify에서 환경변수를 타입 안전하게 관리하고 Prisma를 플러그인으로 등록하는 과정을 Spring과 비교하며 정리한다.</description></item><item><title>Spring에서 Node.js(Fastify)으로 전환하기(2) - Prisma 연동</title><link>https://polar7bear.dev/posts/nodejs/spring-node-js-fastify-2-prisma/</link><pubDate>Tue, 11 Nov 2025 21:59:31 +0900</pubDate><guid>https://polar7bear.dev/posts/nodejs/spring-node-js-fastify-2-prisma/</guid><description>Fastify 프로젝트에 Prisma ORM을 연동하고 초기 설정 과정에서 겪은 시행착오를 공유한다.</description></item><item><title>Spring에서 Node.js(Fastify)으로 전환하기(1) - 프로젝트 환경 셋업</title><link>https://polar7bear.dev/posts/nodejs/spring-node-js-fastify-1/</link><pubDate>Mon, 10 Nov 2025 19:55:35 +0900</pubDate><guid>https://polar7bear.dev/posts/nodejs/spring-node-js-fastify-1/</guid><description>Spring Boot REST API를 Node.js + TypeScript + Fastify 환경으로 마이그레이션하는 프로젝트 초기 셋업 과정을 다룬다.</description></item><item><title>Facade 패턴, SRP 원칙 기반으로 리팩토링을 해보자</title><link>https://polar7bear.dev/posts/refactoring/facade-srp/</link><pubDate>Mon, 03 Nov 2025 20:56:38 +0900</pubDate><guid>https://polar7bear.dev/posts/refactoring/facade-srp/</guid><description>387줄의 God Object로 성장한 AuthService를 SRP 원칙과 Facade 패턴을 적용하여 리팩토링한 과정을 기록한다.</description></item><item><title>템플릿 메서드 패턴을 활용하여 리팩토링을 해보자</title><link>https://polar7bear.dev/posts/refactoring/%ED%85%9C%ED%94%8C%EB%A6%BF-%EB%A9%94%EC%84%9C%EB%93%9C-%ED%8C%A8%ED%84%B4%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%98%EC%97%AC-%EB%A6%AC%ED%8C%A9%ED%86%A0%EB%A7%81%EC%9D%84-%ED%95%B4%EB%B3%B4%EC%9E%90/</link><pubDate>Thu, 30 Oct 2025 21:13:45 +0900</pubDate><guid>https://polar7bear.dev/posts/refactoring/%ED%85%9C%ED%94%8C%EB%A6%BF-%EB%A9%94%EC%84%9C%EB%93%9C-%ED%8C%A8%ED%84%B4%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%98%EC%97%AC-%EB%A6%AC%ED%8C%A9%ED%86%A0%EB%A7%81%EC%9D%84-%ED%95%B4%EB%B3%B4%EC%9E%90/</guid><description>템플릿 메서드 패턴으로 7개 도메인의 중복 코드 210줄을 제거한 리팩토링 사례를 소개한다.</description></item><item><title>외부에서 AWS ElastiCache Redis 접근하기 (SSH 터널 방식)</title><link>https://polar7bear.dev/posts/infra/%EC%99%B8%EB%B6%80%EC%97%90%EC%84%9C-aws-elasticache-redis-%EC%A0%91%EA%B7%BC%ED%95%98%EA%B8%B0-ssh-%ED%84%B0%EB%84%90-%EB%B0%A9%EC%8B%9D/</link><pubDate>Tue, 28 Oct 2025 10:39:57 +0900</pubDate><guid>https://polar7bear.dev/posts/infra/%EC%99%B8%EB%B6%80%EC%97%90%EC%84%9C-aws-elasticache-redis-%EC%A0%91%EA%B7%BC%ED%95%98%EA%B8%B0-ssh-%ED%84%B0%EB%84%90-%EB%B0%A9%EC%8B%9D/</guid><description>AWS ElastiCache Redis는 VPC 내부 전용 서비스로, SSH 터널링과 Bastion EC2를 통해 외부에서 안전하게 접근하는 방법을 설명한다.</description></item><item><title>gradle jib 플러그인으로 이미지 빌드할 때 발생한 에러</title><link>https://polar7bear.dev/posts/trouble-shooting/gradle-jib/</link><pubDate>Fri, 11 Oct 2024 15:07:03 +0900</pubDate><guid>https://polar7bear.dev/posts/trouble-shooting/gradle-jib/</guid><description>Gradle Jib 플러그인으로 Docker 이미지 빌드 시 발생한 credential 에러의 해결 방법을 공유한다.</description></item><item><title>마이크로 서비스 간 분산추적 with Zipkin</title><link>https://polar7bear.dev/posts/spring/with-zipkin/</link><pubDate>Tue, 08 Oct 2024 13:01:02 +0900</pubDate><guid>https://polar7bear.dev/posts/spring/with-zipkin/</guid><description>Zipkin을 활용한 MSA 환경의 분산 추적 구현과 서비스 간 호출 체인 분석 방법을 설명한다.</description></item><item><title>Spring Cloud로 MSA 환경 구축해보기</title><link>https://polar7bear.dev/posts/spring/spring-cloud-msa/</link><pubDate>Mon, 30 Sep 2024 20:42:03 +0900</pubDate><guid>https://polar7bear.dev/posts/spring/spring-cloud-msa/</guid><description>Spring Cloud를 활용한 마이크로서비스 아키텍처 구축 방법과 MSA의 개념을 실무 관점에서 설명한다.</description></item><item><title>N+1 문제 및 MultipleBagFetchException 해결하기</title><link>https://polar7bear.dev/posts/trouble-shooting/n-1-multiplebagfetchexception/</link><pubDate>Fri, 20 Sep 2024 21:01:29 +0900</pubDate><guid>https://polar7bear.dev/posts/trouble-shooting/n-1-multiplebagfetchexception/</guid><description>일정 조회 API에서 발생한 N+1 문제와 MultipleBagFetchException을 해결하는 쿼리 최적화 과정을 설명한다.</description></item><item><title>Spring에서 OAuth Client로 네이버 로그인 구현하기</title><link>https://polar7bear.dev/posts/spring/spring-oauth-client/</link><pubDate>Tue, 03 Sep 2024 19:31:43 +0900</pubDate><guid>https://polar7bear.dev/posts/spring/spring-oauth-client/</guid><description>Spring에서 OAuth 2.0 프로토콜을 활용하여 네이버 간편 로그인을 구현하는 방법을 안내한다.</description></item><item><title>API Versioining을 하는 여러가지 방법</title><link>https://polar7bear.dev/posts/etc/api-versioining/</link><pubDate>Mon, 02 Sep 2024 17:47:40 +0900</pubDate><guid>https://polar7bear.dev/posts/etc/api-versioining/</guid><description>API 버저닝의 필요성과 URL, 파라미터, 헤더, Accept 헤더를 활용한 4가지 버전 관리 방법을 비교 설명한다.</description></item><item><title>JUnit5 유효성 검증 테스트 중 오류</title><link>https://polar7bear.dev/posts/trouble-shooting/junit5/</link><pubDate>Fri, 26 Jul 2024 09:39:16 +0900</pubDate><guid>https://polar7bear.dev/posts/trouble-shooting/junit5/</guid><description>JUnit5로 유효성 검증 테스트 작성 중 발생한 오류 상황과 해결 과정을 다룬다.</description></item></channel></rss>