1장 시스템 설계의 기본

잘 설계된 시스템은 성능, UX, 보안, 개발 비용에 이점이 있다.

 

1.1 시스템 설계의 정의

특정 요구 사항을 이루기 위해 시스템의 아키텍처나 구성 요소, 인터페이스 및 기타 여러 특성을 정의하는 과정을 의미

1.1.1 소프트웨어 시스템

특정 작업이나 일련의 작업을 수행하려고 함께 동작하는 컴포넌트나 모듈, 프로그램의 집합

 

1.1.2 분산 소프트웨어 시스템

여러 독립적인 컴포넌트나 프로세스, 노드로 구성할 수 있는데, 이들은 서로 통신을 주고받으며 하나의 공동 목표를 달성하려고 동작한다.

 

로드밸런서 역할

리버스 프록시로 서버의 대리인 역할을 함

  • 구조상 모든 트래픽이 몰리는 단일 지점
  • 내외부의 경계

 

내부 통신은 사설 IP를 사용하며 http 통신을 함, 

외부 통신은 공인 IP를 사용하며 https 통신을 함 SSL 통신으로 내부 서버들의 부하를 줄여주는 역할

구분 캐시 (Cache) 프록시 (Proxy) 블록 스토리지 (Block Storage)
핵심 역할 속도 향상 (자주 쓰는 데이터 임시 저장) 중재 및 효율 (DB 접속 관리 및 부하 분산) 데이터 저장 (파일 시스템, 로그, OS 영역)
저장 위치 메모리 (RAM) - 매우 빠름 저장 안 함 (통로 역할) 디스크 (HDD/SSD) - 영구 보관
비유 책상 위 커닝 페이퍼 CEO 앞의 비서실장 튼튼한 금고 또는 외장 하드
실패 시 잠깐 느려짐 (DB에서 가져오면 됨) DB 접속 불가 (서비스 장애) 저장된 파일 유실 가능성

1.1.3 시스템 설계의 이해

소프트웨어 시스템의 아키텍처, 컴포넌트, 모듈, 인터페이스 및 상호 작용을 정의하여 기능적-비기능적 요구 사항을 채우는 과정

 

목표는 이해하기 쉽고 유지 보수와 확장이 용이하며 시스템의 성능, 확장성, 신뢰성, 보안 요구 사항을 지킬 수 있는 설계를 만드는 것

 

시스템 설계 과정

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



SW 시스템 설계 목표

이해하기 쉽고 유지 보수와 확장이 용이하며 시스템의 성능, 확장성, 신뢰성, 보안 요구 사항을 지킬 수 있는 설계

기능 요구사항(What 무엇을 제공할지)

시스템이 사용자에게 제공해야 하는 구체적인 기능이나 동작

비기능 요구사항(How 어떻게 제공할 것인지)

시스템의 본질적 기능이 아니라, 그 기능이 돌아가는 **품질(Quality)과 제약(Constraint)**입니다. 흔히 '품질 속성(Quality Attributes)'이라고도 합니다.

1.2 시스템 설계의 다양한 유형

크게 보면 상위 수준 시스템 설계(아키텍처 설계), 하위 수준 시스템 설계(상세 설계)

1.2.1 상위 수준의 시스템 설계

  • 시스템 아키텍처
  • 데이터 흐름
  • 확장성
  • 장애 허용 시스템

시스템 아키텍처

관계 및 통신 방식을 정의하는 아키텍처 설계하는 방법 패턴

  • 모놀리식
  • 클라이언트-서버
  • 마이크로서비스
  • 이벤트 주도

 

데이터 흐름

  • 수집
    어디에서 오는지, 어떻게 가져올지
  • 저장
    어떻게 저장할지
  • 처리
  • 검색
    처리된 데이터에 어떻게 접근할지

확장성

성능 저하 없이 증가하는 작업 부하를 견뎌야 함

  • 수직 확장성
  • 수평 확장성

 

장애 허용 시스템

장애나 오류가 발생하더라도 계속해서 정상적으로 작동할 수 있는 능력

 

복제, 중복성, 점진적 성능 저하, 모니터링, 자가 복구 등

 

1.2.2 하위 수준의 상세 설계

구현 세부 사항에 중점

알고리즘

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

  • 시간 복잡도
    연산 횟수
  • 공간 복잡도
    메모리 양
  • 트레이드오프

 

데이터 구조

메모리에서 데이터를 구성하고 관리하는 데 사용

시스템 성능과 자원 사용에 영향

  • 데이터 접근 방식
    빈도, 형태에 따른 읽기, 쓰기, 데이트
  • 쿼리 성능
    CRUD에 따른 시간 복잡도
  • 메모리 사용량

 

API

각 구성 요소가 서로 상호 작용할 수 있도록 하는 규약 정의

모듈화와 관심사 분리를 만들 수도 있음

 

  • 일관성
    이해하고 사용하기 쉬움
  • 유연성
    기존 기능 영향 없이 변경 및 확장
  • 보안
    무단 접근 방지
  • 성능

 

코드 최적화

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

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

 

1.3 업계에서 시스템 설계가 갖는 중요성

이점

  • 요구사항을 자연스럽게 이해할 수 있다.
  • 같이 참여한 인원의 경우 이해도가 높아져 협업 효율이 높아짐

 

 

+ Recent posts