노트

저장소 역할 분담 (DB·캐시·큐·검색)

Backing Services (Database, Cache, Message Broker, Search Engine)

인프라#architecture#db · 연결된 개념 14개

쉽게 말하면

서버 옆의 저장소들은 사무실의 공식 장부, 포스트잇, 사내 우편함, 색인 카드처럼 잘하는 일이 서로 달라요. 잃으면 안 되는 건 DB에, 빨리 볼 건 캐시에, 전할 건 브로커에, 찾을 건 검색 엔진에 맡겨요.

비유가 깨지는 곳 실제로는 장부 말고 나머지는 대부분 DB의 복사본이에요. 복사본이 생기면 원본과 맞추는 일이 따라와서 CDC, 트랜잭셔널 아웃박스, 최종 일관성 같은 동기화 문제를 함께 떠안아요.

서버 애플리케이션 옆에는 거의 늘 관계형 DB, 인메모리 캐시, 메시지 브로커(message broker), 검색 엔진이 붙는다. 하나로 다 하지 않는 이유는 데이터의 성격(영구성·속도·전달·검색)마다 잘하는 도구가 다르기 때문이다.

관계형 DB (PostgreSQL)캐시 (Redis)브로커 (Kafka)검색 (OpenSearch)
저장 위치디스크(영구)메모리(휘발)디스크(로그)디스크(색인)
잘하는 것정확한 저장·트랜잭션초고속 읽기·임시값서비스 간 비동기 전달텍스트 검색·관련도
잃으면치명적다시 채우면 됨재처리 가능DB에서 재색인
비유공식 장부포스트잇사내 우편함도서관 색인 카드
  • 관계형 DB: 주문·회원처럼 잃으면 안 되는 데이터의 원본. ACID 트랜잭션으로 정확성을 지킨다. 읽기가 많아지면 읽기 복제본을 둔다
  • 캐시: 자주 읽는 값, 세션, 요청 카운터를 메모리에 둔다(Redis (인메모리 저장소), 읽기 캐시 전략)
  • 브로커: "주문 생성됨" 같은 이벤트를 던지고 끝내면 재고·알림·통계가 각자 받아 처리한다. 서비스끼리 직접 알 필요가 없다(Kafka)
  • 검색: DB 데이터를 복사해 역색인(inverted index)을 만들어 두고 검색만 맡긴다(역색인과 검색 엔진)

설정은 환경변수로 주입

DB 주소·캐시 주소·비밀키처럼 환경마다 달라지는 값은 코드나 이미지에 넣지 않고 환경변수로 바깥에서 주입한다. 그러면 같은 이미지를 로컬·개발·운영에 그대로 쓰고 연결할 저장소만 바꿀 수 있다. 12-Factor App(The Twelve-Factor App)이 "Config"와 "Backing services" 원칙으로 정리한 내용이다. 스프링 부트는 SPRING_DATASOURCE_URL 같은 환경변수를 설정 파일보다 우선해 프로퍼티(spring.datasource.url)에 묶어 주므로, 이미지 안의 값을 코드 수정 없이 덮을 수 있다(스프링 설정 외부화와 프로파일). 컨테이너 안에서 주소를 어떻게 적는지는 컨테이너 네트워킹를 본다.

대가

원본(DB) 외의 저장소는 대부분 복사본이다. 복사본이 생기는 순간 둘을 맞추는 일이 생긴다. 그래서 이 구조에는 CDC (변경 데이터 캡처), 트랜잭셔널 아웃박스 패턴, 최종 일관성 같은 동기화 문제가 따라온다. "읽기를 빠르게 하는 거의 모든 기법은 쓰기 비용이나 정합성으로 값을 치른다"는 DB 인덱스와 트레이드오프의 법칙이 시스템 수준에서 다시 나타나는 것이다.

규모가 커지며 이 구성요소가 하나씩 추가되는 과정은 사용자 수에 따른 규모 확장에서 볼 수 있다.

참고: The Twelve-Factor App — Config · Backing services · Spring Boot — Binding From Environment Variables

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 데이터베이스 다중화

    같은 데이터를 여러 DB 서버에 복제해 두는 것. 가장 흔한 형태는 원본을 가진 주(Primary) 서버가 쓰기를 받고, 사본을 받는 부(Replica) 서버들이 읽기를 나눠 맡는 구조다.

  • 로컬 퍼스트 아키텍처

    클라이언트 기기의 로컬 데이터를 진실의 원천(Source of Truth)으로 삼고, 서버는 동기화와 백업을 맡는 설계 방식. 전통적인 "서버가 원천, 클라이언트는 요청해서 그린다" 구조를 뒤집어 로컬 DB → UI 렌더링 → 백그라운드 동기화 순서로 흐른다.

  • localStorage와 sessionStorage

    브라우저에 문자열 키-값을 저장하는 Web Storage API의 두 가지. 쿠키와 달리 요청에 자동으로 실리지 않고, 출처 단위로 나뉘며(same-origin-policy), 보통 출처당 5MB 안팎을 쓸 수 있다. 동기 API라 큰 데이터를 자주 읽고 쓰면 메인 스레드를 막는다.

  • 데이터 무결성

    데이터 무결성(data integrity)은 저장된 데이터가 정확하고 일관되며 믿을 수 있는 상태로 유지되는 것이다. 재고가 100개로 보이는데 실제로 50개라면 무결성이 깨진 것이다. 관계형 DB는 이를 제약 조건(constraint)으로 강제한다.

보기 옵션