시스템 설계의 기본

Song·4일 전
0

시스템 설계 요약 및 정리

📘 출처: 『요즘 개발자를 위한 설계 수업 1부 1장』


💡 시스템 설계란?

시스템 설계(System Design)
소프트웨어 시스템의 아키텍처, 구성 요소, 인터페이스, 데이터 관리 전략을 효율적으로 정의하는 과정입니다.

좋은 설계는 다음을 가능하게 합니다:

  • 사용자 경험 향상
  • 보안 강화
  • 개발 및 운영 비용 절감
  • 개발 시간 단축

🧱 시스템 설계의 정의

  • 소프트웨어 시스템의 아키텍처, 구성 요소, 인터페이스, 데이터 관리 전략을 포함
  • 복잡한 프로세스를 자동화하고 성능을 최적화

시스템 설계란?

작업을 수행하기 위해 함께 동작하는 컴포넌트, 모듈, 프로그램의 집합
예) 데이터 관리, 트랜잭션 처리, 서비스 제공 등

설계 과정에서 고려해야 할 질문들:

  • 어떤 언어로 개발할까?
  • 어떤 에디터나 프레임워크를 사용할까?
  • 테스트와 배포는 어떻게 할까?
  • 유지보수는 어떤 방식으로 할까?

시스템 설계(System Design)
소프트웨어 시스템의 아키텍처


🌐 분산 시스템 설계

목적

확장성, 가용성, 장애 허용성을 보장해야 하는 대규모 애플리케이션에서 활용
예)

  • 클라우드 컴퓨팅 플랫폼 (AWS)
  • P2P 네트워크
  • 분산 DB
  • CDN (Content Delivery Network)

특징

  • 독립적인 컴포넌트, 프로세스, 노드로 구성
  • 서로 통신하며 공동의 목표를 달성
    • RPC (Remote Procedure Call)
    • Message Passing (nats 사용 중이지만 휘발되는 메세지)
    • Publish / Subscribe (예: Redis)
  • 지리적으로 분산된 환경에서 동작
  • 기능적 & 비기능적 요구사항을 모두 충족해야 함

⚙️ 시스템 설계의 기본 단계

  1. 요구사항 분석
    **2. 상위 수준 아키텍처 설계
  2. 하위 수준 상세 설계**
  3. 사용자 인터페이스 설계
  4. API 설계
  5. 데이터베이스 설계

🏗️ 시스템 설계의 다양한 유형

1️⃣ 상위 수준의 아키텍처 설계

🔸 시스템 아키텍처

정의

  • 시스템의 전체 구조와 구성 요소 간의 관계, 통신 방식을 정의
  • 요구사항에 부합하는 적절한 아키텍처 선택이 핵심

유형

  • 모노리식
  • 클라이언트-서버
  • MSA (Microservices Architecture)
  • 이벤트 기반 아키텍처

    💬 현재 우리 회사는 이 모든 구조를 일부씩 사용 중입니다.

고려 요소

  • 확장성: 트래픽/데이터 증가 시 문제없이 기능 추가 가능한가?
  • 유지보수성: 버그 수정, 성능 개선이 용이한가? (테스트 용이성 포함)
  • 신뢰성: 장애 발생 시에도 안정적으로 동작하는가?
  • 지연시간: 응답 속도 및 성능에 미치는 영향은?

🔸 데이터 흐름 설계
정의

  • 데이터를 수집, 저장, 처리, 검색하는 전체 과정을 효율적으로 설계하는 것

고려 요소

  • 수집: API / 실시간 스트리밍 / 배치 중 어떤 방식을 택할지
  • 저장: 접근 빈도, 검색 성능, 데이터 일관성
  • 처리: 변환, 분석, 요약 과정 중 지연이나 병목은 어떻게 해결할지
  • 검색: 캐싱 전략, 요청 부하 대응 방법

🔸 확장성 (Scalability)
정의

  • 성능 저하 없이 증가하는 부하를 처리할 수 있는 능력

유형

  • 수직 확장 (Vertical Scaling): 서버 자원 증설
  • 수평 확장 (Horizontal Scaling): 여러 서버로 분산 처리 (예: 클러스터)

🔸 장애 허용성 (Fault Tolerance)
정의

  • 일부 구성 요소가 실패해도 전체 시스템이 정상 동작할 수 있는 능력

핵심 요소

  • 복제 및 중복성
  • 점진적 성능 저하 설계
  • 모니터링 및 알림
  • 자가 복구 메커니즘

2️⃣ 하위 수준의 상세 설계

목적: 성능, 메모리 사용, 코드 유지 보수성을 최적화하기 위한 설계

알고리즘

정의

  • 계산, 데이터 처리, 문제 해결을 수행하는 단계별 절차

고려할 점

  • 시간 복잡도, 공간 복잡도, 트레이드 오프

데이터 구조

정의

  • 메모리에서 데이터를 구성하고 관리하는데 사용
  • 시스템의 성능과 자원 사용에 영향을 미치는 요소

고려할 점

  • 데이터 접근 방식
  • 쿼리 성능
  • 메모리 사용량

유형

  • 배열, 연결 리스트, 해시 테이블, 그래프 etc

API

정의

  • 시스템 내 여러 구성 요소 간 통신에 필요한 요소

고려할 점

  • 일관성
  • 유연성
  • 보안
  • 성능

코드 최적화

정의

  • 코드의 성능, 가독성, 유지 보수정을 향상시키는 기법

구분

  • 리팩토링, 루프 언롤링, 메모이제이션, 병렬ㄹ 처리

결론

좋은 시스템 설계란,

  • 시스템의 성능, 확장성, 신뢰, 보안 요구 사항을 지키기 위한 설계
  • 또한, 시간이 지나 변경된 요구 사항이나 실행 환경을 유연하게 대응하기 위함

시스템 설계의 중요성

  • 설계를 진행하며 요구사항을 명확히 이해
    • 설계를 하며 시스템의 핵심 기능, 성능, 보안 지침등을 고려하기 때문
  • 이해 관계자와의 원활한 협업을 할 수 있게 해줌
  • 피드백 과정이 용이 -> 확장성, 성능, 유지 보수성 보장

🧩 우리 팀의 현재 상태

보완이 필요한 부분

  • 장애 허용(Fault Tolerance)

잘하고 있는 부분

  • 하위 수준 설계 과정에 이해관계자들이 함께 참여하고 있음
    → 시스템 이해도와 협업 품질을 높이는 좋은 문화
profile
Learn From Yesterday, Live Today, Hope for Tomorrow

0개의 댓글