<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dev_harry.log</title>
        <link>https://velog.io/</link>
        <description>새로움이 두렵지 않은 탐험가</description>
        <lastBuildDate>Tue, 09 Dec 2025 02:29:32 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>dev_harry.log</title>
            <url>https://velog.velcdn.com/images/dev_harry/profile/dfb0b436-5b47-4d87-af20-6e981bd525f6/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. dev_harry.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev_harry" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[가상 면접 사례로 배우는 대규모 시스템 설계 기초 - 1장 사용자 수에 따른 규모 확장성]]></title>
            <link>https://velog.io/@dev_harry/%EA%B0%80%EC%83%81-%EB%A9%B4%EC%A0%91-%EC%82%AC%EB%A1%80%EB%A1%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EB%8C%80%EA%B7%9C%EB%AA%A8-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EC%84%A4%EA%B3%84-%EA%B8%B0%EC%B4%88-1%EC%9E%A5-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%88%98%EC%97%90-%EB%94%B0%EB%A5%B8-%EA%B7%9C%EB%AA%A8-%ED%99%95%EC%9E%A5%EC%84%B1</link>
            <guid>https://velog.io/@dev_harry/%EA%B0%80%EC%83%81-%EB%A9%B4%EC%A0%91-%EC%82%AC%EB%A1%80%EB%A1%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EB%8C%80%EA%B7%9C%EB%AA%A8-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EC%84%A4%EA%B3%84-%EA%B8%B0%EC%B4%88-1%EC%9E%A5-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%88%98%EC%97%90-%EB%94%B0%EB%A5%B8-%EA%B7%9C%EB%AA%A8-%ED%99%95%EC%9E%A5%EC%84%B1</guid>
            <pubDate>Tue, 09 Dec 2025 02:29:32 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>이 글은 <strong>〈가상 면접 사례로 배우는 대규모 시스템 설계 기초〉를 읽으며 이해한 내용을 바탕으로 정리한 개인 스터디 문서</strong>입니다.</p>
</blockquote>
<h1 id="1-단일-서버에서-시작하는-웹-서비스-구조">1. 단일 서버에서 시작하는 웹 서비스 구조</h1>
<p>우리가 흔히 만드는 서비스는 처음엔 대부분 <strong>단일 서버</strong>로 시작한다.
사용자가 웹사이트에 접속하면 다음과 같은 과정이 일어난다:</p>
<ol>
<li>사용자가 브라우저에 도메인을 입력</li>
<li>DNS가 해당 도메인을 IP 주소로 변환</li>
<li>변환된 IP로 요청이 전송</li>
<li>서버가 HTML·JSON 등을 응답</li>
</ol>
<p>여기까지만 보면 단일 서버만 있어도 충분해 보이지만, 실제로는
조금만 사용자가 늘어도 <strong>서버와 데이터베이스를 분리해야</strong> 한다.</p>
<hr>
<h1 id="2-데이터베이스-선택-rdbms-vs-nosql">2. 데이터베이스 선택: RDBMS vs NoSQL</h1>
<p>서비스가 커지면 데이터 저장 방식도 고민해야 한다.</p>
<h2 id="관계형-데이터베이스rdbms">관계형 데이터베이스(RDBMS)</h2>
<ul>
<li>MySQL, PostgreSQL 등</li>
<li>테이블 기반 구조</li>
<li>복잡한 조인, 트랜잭션에 강함</li>
</ul>
<h2 id="비관계형-데이터베이스nosql">비관계형 데이터베이스(NoSQL)</h2>
<ul>
<li>MongoDB, Cassandra 등</li>
<li>스키마 유연</li>
<li>거대한 데이터, 낮은 지연시간 등이 필요할 때 적합</li>
<li>조인보다는 단순 조회가 빠르고 확장성에 초점</li>
</ul>
<p>요약하면 <strong>구조화된 데이터 + 트랜잭션 중심이면 RDBMS</strong>,
<strong>유연함·확장성·빠른 읽기 중심이면 NoSQL</strong>이 어울린다.</p>
<hr>
<h1 id="3-규모-확장-vertical-vs-horizontal">3. 규모 확장: Vertical vs Horizontal</h1>
<p>서비스가 커질 때 선택지는 크게 두 가지다.</p>
<h2 id="수직-확장scale-up">수직 확장(Scale-up)</h2>
<ul>
<li>더 좋은 CPU·RAM을 추가</li>
<li>구조는 단순</li>
<li>하지만 서버 한 대의 한계가 명확하고 장애 시 전체가 멈춤</li>
</ul>
<h2 id="수평-확장scale-out">수평 확장(Scale-out)</h2>
<ul>
<li>서버를 여러 대로 늘리는 방식</li>
<li>현대 대부분의 대규모 서비스가 이 방식을 사용</li>
<li>단, 서버 간 트래픽을 나누기 위한 <strong>로드밸런서</strong>가 필수</li>
</ul>
<hr>
<h1 id="4-로드밸런서가-필요한-이유">4. 로드밸런서가 필요한 이유</h1>
<p>로드밸런서는 요청을 여러 서버에 나눠 보내 균형을 맞춰준다.</p>
<p>로드밸런서를 쓰면:</p>
<ul>
<li>특정 서버가 죽어도 나머지 서버에서 서비스가 계속됨</li>
<li>서버를 더 추가하기 쉬워짐 → 자연스러운 확장성</li>
<li>외부에는 로드밸런서의 IP만 노출되므로 보안에도 도움</li>
</ul>
<p>실제로 “대규모 서비스”라는 느낌이 나기 시작하는 지점이 여기다.</p>
<hr>
<h1 id="5-데이터베이스-다중화masterreplica">5. 데이터베이스 다중화(Master–Replica)</h1>
<p>읽기와 쓰기를 분리하여 성능과 안정성을 높이는 방식이다.</p>
<ul>
<li><strong>Master(주 DB)</strong>: 쓰기 전용</li>
<li><strong>Replica(부 DB)</strong>: 읽기 전용</li>
</ul>
<p>읽기 요청은 대부분 Replica가 처리하므로 부하가 줄고,
Master 장애 시 Replica를 승격시키는 식의 장애 대응도 가능하다.</p>
<p>이 구조만으로도 서비스 안정성이 상당히 좋아진다.</p>
<hr>
<h1 id="6-캐시cache-성능-향상의-핵심">6. 캐시(Cache): 성능 향상의 핵심</h1>
<p>애플리케이션이 느려지는 가장 흔한 원인은 <strong>DB 과부하</strong>다.
이를 줄이기 위해 많이 쓰는 값은 캐시에 보관한다.</p>
<h2 id="캐시-계층을-두면-생기는-장점">캐시 계층을 두면 생기는 장점</h2>
<ul>
<li>데이터 조회가 훨씬 빨라짐</li>
<li>DB의 부담이 크게 줄어듦</li>
<li>캐시 서버만 별도로 확장할 수 있음</li>
</ul>
<h2 id="대표-전략-read-through">대표 전략: Read-Through</h2>
<ol>
<li>캐시에서 먼저 검색</li>
<li>없으면 DB에서 가져오고 캐시에 저장</li>
<li>이후 요청은 캐시만 조회</li>
</ol>
<h2 id="캐시-사용-시-주의사항">캐시 사용 시 주의사항</h2>
<ul>
<li>갱신은 적고 조회가 많을 때 효과적</li>
<li>너무 작은 캐시는 잦은 eviction으로 오히려 병목</li>
<li>캐시 서버 단독 운영은 위험 → 다중화 필요</li>
<li>만료 정책은 필수(LRU, LFU 등)</li>
</ul>
<hr>
<h1 id="7-cdncontent-delivery-network">7. CDN(Content Delivery Network)</h1>
<p>정적 파일(이미지, JS, CSS)을 사용자와 가까운 서버에 저장해 빠르게 제공하는 기술.</p>
<p>CDN을 쓰면 다음이 달라진다:</p>
<ul>
<li>정적 리소스 로딩 속도 향상</li>
<li>우리 서버로 가는 요청 감소</li>
<li>글로벌 사용자가 많은 서비스에서 필수</li>
</ul>
<p>TTL, 캐시 무효화 방식, 비용 구조 등을 고려해 적용하면 된다.</p>
<hr>
<h1 id="8-무상태-웹-계층stateless-architecture">8. 무상태 웹 계층(Stateless Architecture)</h1>
<p>서버를 여러 대로 늘리려면 <strong>서버가 세션을 직접 들고 있으면 절대 안 됨</strong>.</p>
<h2 id="상태를-서버가-들고-있을-때-문제">상태를 서버가 들고 있을 때 문제</h2>
<ul>
<li>같은 사용자 요청이 항상 같은 서버로 가야 함 → sticky session 필요</li>
<li>서버 장애 발생 시 세션 날아감</li>
<li>서버 추가/제거가 어려움</li>
</ul>
<h2 id="무상태-구조">무상태 구조</h2>
<ul>
<li>세션·상태는 Redis나 DB 등 외부 저장소에 보관</li>
<li>어떤 서버가 요청을 받아도 동일한 결과 제공 가능</li>
<li>자동 스케일링과 궁합이 좋음</li>
</ul>
<hr>
<h1 id="9-여러-데이터-센터-지원">9. 여러 데이터 센터 지원</h1>
<p>전 세계 사용자에게 빠르고 안정적인 서비스를 제공하기 위해 필요한 요소들:</p>
<ul>
<li><strong>GeoDNS</strong>를 통한 위치 기반 라우팅</li>
<li>데이터센터 간 데이터 동기화</li>
<li>멀티 리전 배포 자동화</li>
<li>지역 장애 시 트래픽 우회</li>
</ul>
<p>이 단계는 글로벌 서비스를 목표로 할 때 반드시 고려해야 한다.</p>
<hr>
<h1 id="10-메시지-큐message-queue">10. 메시지 큐(Message Queue)</h1>
<p>서비스 간 결합을 느슨하게 만들어주는 핵심 요소.</p>
<h2 id="메시지-큐를-도입하면">메시지 큐를 도입하면:</h2>
<ul>
<li>서비스가 서로 직접 의존하지 않음</li>
<li>소비자가 잠시 죽어도 메시지 손실 없이 처리 가능</li>
<li>스케일 아웃 방식의 비동기 처리에 최적</li>
</ul>
<p>대규모 시스템은 거의 대부분 메시지 큐를 사용한다고 보면 된다.</p>
<hr>
<h1 id="11-로그·모니터링·자동화">11. 로그·모니터링·자동화</h1>
<p>시스템이 커지면 운영이 코드를 뛰어넘는다.</p>
<ul>
<li><strong>로그</strong>: 문제 파악 및 디버깅</li>
<li><strong>메트릭</strong>: DAU, 트래픽, 에러율 등 상태 파악</li>
<li><strong>자동화</strong>: 배포, 알람, 스케일링 등 운영 효율 극대화</li>
</ul>
<p>운영 기반이 튼튼해야 장애 대응과 확장이 수월해진다.</p>
<hr>
<h1 id="12-데이터베이스의-본격-확장-샤딩sharding">12. 데이터베이스의 본격 확장: 샤딩(Sharding)</h1>
<p>DB의 수평 확장 전략으로, 데이터를 여러 DB로 나누는 방식.</p>
<h2 id="특징">특징</h2>
<ul>
<li>각 샤드는 스키마는 같지만 데이터는 서로 다름</li>
<li>샤딩 키 설계가 성패를 가름</li>
<li>부하 분산 + 저장 용량 확보 가능</li>
<li>운영 난이도는 높아짐(조인 불가, 재샤딩 등)</li>
</ul>
<p>규모가 진짜 커지기 시작하면 DB 샤딩을 고민하게 된다.</p>
<hr>
<p><img src="https://velog.velcdn.com/images/dev_harry/post/976935e9-bd23-4586-ad8f-2b873f4141ab/image.png" alt=""></p>
<hr>
<h1 id="마무리">마무리</h1>
<p>이번 스터디에서 느낀 점은, <strong>대규모 시스템 설계는 특정 기술을 아는 것보다 ‘문제를 단계별로 분해하는 사고 방식’을 익히는 게 중요하다</strong>는 것이다.</p>
<ul>
<li>처음엔 단일 서버</li>
<li>트래픽이 늘면 웹/DB 분리</li>
<li>더 늘면 로드밸런싱</li>
<li>캐시, CDN, 메시지 큐, 무상태 아키텍처로 확장</li>
<li>지역 확장, 샤딩으로 초대규모 대응</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>