반응형
반응형

[System] Everything I know about good system design, 좋은 시스템 설계

 


  • 좋은 시스템 설계
    란 복잡해 보이지 않고 오랜 기간 별다른 문제가 발생하지 않는 형태
  • 상태(state) 를 다루는 것이 시스템 설계에서 가장 어려운 부분이며, 가능한 한 상태를 저장하는 컴포넌트 수를 줄이는 방향이 중요
  • 데이터베이스는 주로 상태가 보관되는 위치로, 스키마 설계와 인덱싱, 병목 해소에 중점을 둔 접근이 필요
  • 캐싱, 이벤트 처리, 백그라운드 작업 등은 성능 및 유지보수를 위해 신중하게 도입해야 하며, 남용을 피하는 것이 좋음
  • 복잡한 설계보다는 충분히 검증된 간단한 컴포넌트 및 방법론을 적절하게 사용하는 것이 지속 가능하고 안정적인 시스템 구축에 핵심

시스템 설계의 정의와 전체적인 접근

  • 소프트웨어 설계가 코드의 조립이라면, 시스템 설계는 다양한 서비스를 조합하는 과정
  • 시스템 설계의 주요 구성 요소는 앱 서버, 데이터베이스, 캐시, 큐, 이벤트 버스, 프록시 
  • 좋은 설계는 "특별한 문제가 없다", "생각보다 쉽게 끝나다", "이 부분은 신경 쓸 필요가 없다"와 같은 반응을 이끌어냄
  • 반대로 복잡하고 눈에 띄는 설계는 근본 문제를 감추거나, 과도한 설계를 나타낼 수 있음
  • 복잡한 시스템은 초기부터 바로 도입하기보다는, 최소한의 작동 가능한 단순한 구조에서 점차 발전하는 방향이 유리함

상태(state)와 무상태(stateless)의 구분

  • 소프트웨어 설계에서 가장 까다로운 부분이 바로 상태 관리
  • 정보를 저장하지 않고 즉시 결과를 반환하는 서비스(GitHub의 PDF 렌더링과 같은)는 무상태적임
  • 반면 데이터베이스에 쓰기를 수행하는 서비스는 상태를 관리함
  • 시스템 내 상태 저장 컴포넌트를 최대한 줄이는 것이 좋음. 이는 시스템의 복잡도와 장애 발생 가능성을 낮춤
  • 상태 관리를 한 서비스에서만 수행하고, 나머지 서비스는 API 호출 혹은 이벤트 발생 등 무상태 역할에 집중하는 구조가 권장됨

데이터베이스 설계와 병목 지점

스키마 및 인덱스 설계

  • 데이터 보관을 위해서는 사람이 읽기 쉬운 형태의 스키마 설계가 필요함
  • 너무 유연한 스키마(예: 전체를 JSON 컬럼에 저장)는 애플리케이션 코드 및 성능에 부담을 줄 수 있음
  • 쿼리가 빈번하게 발생할 컬럼을 기준으로 적절한 인덱스를 설정해야 함. 모든 것에 인덱스를 거는 것은 오히려 쓸데없는 오버헤드 발생

병목 해결 방법

  • 데이터베이스 접근이 종종 무거운 병목이 됨
  • 가능한 한 복잡한 데이터를 애플리케이션에서가 아닌 데이터베이스 내에서 조인(JOIN) 등으로 처리하는 것이 성능상 유리함
  • ORM 사용 시, 루프 안에서 쿼리를 발생시키는 실수를 주의해야 함
  • 필요에 따라 쿼리를 분할하여, 데이터베이스의 부담이나 쿼리 복잡도를 조절하는 것도 한 방법
  • 읽기 쿼리는 복제본(read-replica)으로 분산하여, 주(Write) 노드의 부하를 줄이는 전략이 효과적
  • 대량의 쿼리가 몰릴 때 트랜잭션 및 쓰기 연산은 데이터베이스를 쉽게 과부하 상태로 만들 수 있으므로, 쿼리 스로틀링(제한) 처리를 고려해야 함

느린 작업과 빠른 작업의 분리

  • 사용자가 인터랙션하는 작업은 수백 밀리초 내 응답이 필요
  • 시간이 오래 걸리는 작업(예: 대용량 PDF 변환 등)은 최소한의 작업만 프론트에서 즉시 제공하고, 나머지는 백그라운드로 넘기는 패턴이 효과적
  • 백그라운드 작업은 일반적으로 큐(예: Redis)와 잡 러너가 묶여 동작
  • 멀리 예약된 작업 처리는 Redis보다 DB 테이블을 별도로 만들어 관리하고, 스케줄러를 이용하여 실행하는 형태가 실용적

캐싱

  • 캐싱은 동일하거나 비싼 연산을 반복하는 경우 비용 절감과 성능 향상에 기여
  • 보통 캐시를 처음 배운 주니어 엔지니어는 모든 것을 캐시하고 싶어하고, 경험 많은 엔지니어일수록 캐시 도입은 신중
  • 캐시는 새로운 상태를 도입하므로, 동기화 이슈/오류/스테일 데이터 등의 위험이 존재
  • 먼저 쿼리의 인덱스 추가 같은 성능 개선을 시도한 뒤 캐싱을 적용하는 것이 바람직
  • 대용량 캐시는 Redis/Memcached가 아니라 S3/Azure Blob Storage와 같은 문서 저장소에 주기적으로 저장하는 방식도 활용 가능

이벤트 처리

  • 대부분의 기업은 이벤트 허브(예: Kafka) 를 갖추고, 다양한 서비스가 이벤트 기반으로 분산 처리
  • 이벤트의 남발보다는, 단순한 요청–응답 API 설계가 로깅과 문제 해결 면에서 더 유용
  • 이벤트 기반 처리는 발신자가 수신자 동작에 신경 쓰지 않아도 될 때, 혹은 고용량·지연 허용 시나리오에 적합

데이터의 전달 방식: 푸시와 풀

  • 데이터 전달에는 Pull(요청 후 응답)  Push(변경 시 자동 전달) 두 방식이 있음
  • Pull 방식은 단순하지만 반복 요청/과부하 문제가 발생
  • Push 방식은 서버에서 데이터 변경 시 클라이언트에 즉시 전달하므로, 효율적이며 최신 데이터 유지에 유리
  • 대량 클라이언트 처리에는 각각 방식에 맞게 인프라(이벤트 큐, 여러 캐시 서버 등) 확장이 필요

핫패스(Hot Paths) 집중

  • 핫패스란 시스템 내에서 가장 중요하고 데이터가 많이 흐르는 경로를 의미
  • 핫패스는 선택지가 적고, 설계 실패 시 서비스 전체에 심각한 문제를 유발할 수 있으므로, 신중한 설계가 필수
  • 옵션이 다양한 마이너 기능보다, 핫패스에 집중하여 설계 및 테스트에 자원을 배분하는 것이 효과적

로깅, 메트릭, 추적

  • 장애 발생 시 원인 진단을 위해, 비정상 경로(unhappy path)에 대한 상세 로그 기록을 적극적으로 해야 함
  • 시스템 자원(CPU/메모리), 큐 크기, 요청/작업 시간 등 기본적인 관측성 지표 수집이 필요
  • 평균값만 보는 대신 p95, p99 지연 시간 같은 분포 지표도 반드시 관찰해야 함. 상위 소수의 느린 요청이 핵심 사용자의 문제일 수 있음

킬스위치, 재시도, 장애 복구

  • 킬스위치(시스템 일시 차단) , 재시도의 전략적 활용이 중요함
  • 무작정 재시도는 다른 서비스에 부담만 주며, 사전에 회로 차단기(circuit breaker) 등으로 요청을 제어해야 효과적임
  • Idempotency Key(멱등키) 도입으로 동일 요청 재처리 시 중복 작업 방지가 가능함
  • 일부 장애 상황에서 열린 실패(fail open) 또는 닫힌 실패(fail closed) 중 선택이 필요함. 예를 들어, Rate Limiting은 fail open(허용) 쪽이 사용자 영향이 적은 방향임. 반면 인증은 fail closed가 필수임

마무리

  • 서비스 분리, 컨테이너, VM 도입, 트레이싱 등 일부 주제는 생략됐으나, 잘 검증된 컴포넌트를 적재적소에 사용하는 것이 장기적으로 가장 안정적인 시스템 구축으로 이어짐
  • 기술적으로 특별한 설계는 실제로 매우 드물며, 지루할 정도로 단순한 설계가 오히려 실무에서 가장 자주 쓰임
  • 본질적으로 좋은 시스템 설계란 눈에 띄지 않고, 충분히 입증된 방법론을 안전하게 조합하는 과정임

 

https://news.hada.io/topic?id=22580

 

좋은 시스템 설계 | GeekNews

좋은 시스템 설계란 복잡해 보이지 않고 오랜 기간 별다른 문제가 발생하지 않는 형태상태(state) 를 다루는 것이 시스템 설계에서 가장 어려운 부분이며, 가능한 한 상태를 저장하는 컴포넌트 수

news.hada.io

 

반응형
반응형

나는
내 몸과 친하지 않다.
몸은 내가 원하는 상황에서
내가 원하는 방식으로 움직여 주지
않을 때가 많다. 운동을 배우다가 거울을 보면
내 팔다리가 짐작과 다른 위치에서 허우적대고
있다. 내 몸을 믿지 못하니 빠른 반사 신경이
필요하거나 크게 다칠 수 있는 일은 두려웠다.
자동차 운전도 하지 않는다. 몸은 내가
보호할 대상인 동시에 나를 해칠
무기이기도 했다.


- 이숙명의 《발리에서 생긴 일》 중에서 -


* 몸은 두 갈래입니다.
자기 생각대로 움직여주는 갈래와
생각과 관계없이 자율적으로 움직이는 갈래입니다.
자율신경계, 면역계, 내분비계, 순환계 등등 수많은
기관들이 저마다 인체를 살게 하는 신비한
시스템입니다. 어느 순간 이 시스템의 조화가
깨지면 몸과 마음과 영혼의 소통마저 끊기게
됩니다. 내 몸의 주인이 분명 나인데
내 마음대로 되지 않습니다.

반응형

'아침편지' 카테고리의 다른 글

보지 않고도 본다  (0) 2025.06.18
충만하게 잘 산다는 것은  (0) 2025.06.17
새벽 숲  (0) 2025.06.16
엄마의 마지막 얼굴  (0) 2025.06.13
깨진 수박  (0) 2025.06.12
반응형

새가 길을 찾는 방법

 

대부분의 새는
서늘하고 바람이 적은 야간에
이동을 한다. 땅거미가 질 무렵 출발해서
열심히 날갯짓을 하다가 좋은 휴게소에 들러
다음날을 위해 연료를 보충한다. 새들은 구름이나
안개가 시야를 가려서 지면 가까이 날아야 하는 밤을
제외하면 대개는 고도 400~6000m 사이에서
이동한다. 새들은 별과 지구의 자기장을
이용해서 길을 찾는다.


- 트리시 오케인의《나는 새들이 왜 노래하는지 아네》중에서 -


* 새들에게는
본능적으로 GPS가 장착되어 있습니다.
그래서 정확하게 우주의 흐름을 읽습니다.
언제 날고 언제 쉬어야 하는지를 절로 압니다.
학습한 것도, 누군가의 지시를 받는 것도
아닙니다. 사실 자연물 거의 모두에
이런 지혜 시스템이 장착되어
있습니다. 인간만이 제대로
알아채지 못할 뿐입니다.

반응형

'아침편지' 카테고리의 다른 글

새도 사나워질 수 있다  (0) 2025.06.02
모래알  (0) 2025.06.02
단 한 표 차로 역사가 바뀌었다  (0) 2025.05.29
아버지를 이해할 수 있는 나이  (0) 2025.05.28
늙은 바위와 씨앗  (0) 2025.05.27
반응형

처음 한글을 배우듯
느낌을 몸으로 찾아보고
말로 하나씩 말해보기 시작했다.
내 몸이 말하는 신호에 이유를 찾다 보니
점점 나라는 사람과 가까워지기 시작했다.
공허한 느낌에는 존재감이 필요했고, 맥이
풀리는 느낌에는 안전을 중요하게 여기는
마음이 있었다. 이런 미세한 변화가 벅차게
다가왔다. 그리고 나의 느낌 세포들이
살아나니 다른 사람들의 느낌도
헤아려볼 여유가 생기기
시작했다.


- 김숙희 외의 《마음이 길이 된다》 중에서 -


* 몸에는 60조 개의
세포가 있다 합니다. 하나하나의 세포는
저마다 말을 합니다. 온갖 신호를 보냅니다.
생명과 연결된 정보와 에너지와 시스템이 말을
걸며 보내는 신호입니다. 하나의 세포는 이웃
세포와 정밀하게 연결돼 전체 몸을 위해
움직입니다. 자칫 몸이 말하는 신호를
놓치면 전체 움직임이 흐트러지고
여유도 리듬도 잃게 됩니다.  

반응형

'아침편지' 카테고리의 다른 글

남편에게 화난 이유  (0) 2024.10.23
식사 때 지켜야 할 수칙  (0) 2024.10.22
한강  (0) 2024.10.21
혼은 어디로 갈까  (0) 2024.10.18
지옥 같은 고통은 왜 올까  (0) 2024.10.17
반응형

언어는 행복의 문을 여는 중요한 열쇠다.
두뇌는 자신이 말한 언어를 의식 속에 넣어
자신의 인생에 반영시키는 시스템으로 이루어져 있다.
따라서 행복한 인생을 실현하기 위해서는
긍정적인 언어를 좀더 의식적으로 선택해서 사용하는 습관이 중요하다.
- 사토 도미오, ‘당신의 꿈을 이루어 주는 미래 일기’에서


백만불짜리 습관이라는 책에는
‘아마도 성공을 위해 사용할 수 있는, 가장 강력한 주문은
“나는 나를 사랑해!”라는 말이라고 쓰여 있습니다.
많은 심리학자들은 우리 감정의 95%는
그 순간 마음을 스쳐 가는 말에 의해 좌우된다고 말합니다.
긍정을 심으면 긍정이 나오고, 부정을 심으면 부정이 나옵니다

반응형
반응형

모든 내부 문제는
암과 같아서 초기에는 드러나지 않고,
구성원들은 그 심각성을 잘 느끼지 못한다.
시스템이 완전히 곪아 복구가 불가능할 때가
되어서야 깨닫게 된다. 많은 사람들이 세월호 사태를
두고 마치 우연에 의해 일어난 재해인 양 말했고
이 일을 계기로 뭔가 획기적인 개선이 있을 것처럼
굴었다. 하지만 우리 팀 대부분의 의견은 같았다.
'터질 일이 터진 것뿐이다' 그것이 우리가
보는 명확한 현실이었다.


- 이국종의《골든아워 2》중에서 -


* 가장 위험할 때는 언제인가.
심각성을 느끼지 못할 때입니다.
시스템이 망가지고 곪아 터진 다음에야
심각성을 알아차린다면 그때는 이미 늦습니다.
더 위험한 것은 일이 터진 다음에도 심각성을
깨닫지 못하는 것입니다. 획기적인 개선이
필요한데 시간이 지나면서 흐지부지되다 보니
비슷한 일이 반복되는 것입니다.
암도 초기에 대처해야 생존율을
높일 수 있습니다.

반응형

'아침편지' 카테고리의 다른 글

아이를 현명하게 키우려면?  (0) 2022.11.07
몸으로 읽는다  (0) 2022.11.07
'적정 긴장'  (0) 2022.11.03
편가르기  (0) 2022.11.02
최악의 사태는 막을 수 있었다  (0) 2022.11.01

+ Recent posts