CS

[Architecture] (2) 시스템 요구사항의 종류

Joonfluence 2023. 6. 8.

서론

이번 글에서는 시스템 요구사항 중 6가지 (성능, 확장성, 신뢰성, 보안, 배포, 기술 스택)에 대해 자세히 알아보겠습니다.

Performance

먼저, Performance (성능)에 대해서 알아보겠습니다. 성능은 하드웨어 스펙과 작업량이 주어졌을 때, latency (대기 시간)을 최소화하고 throughput (처리량)을 최대화하는 것을 말합니다. 퍼포먼스 이슈의 원인은 요청이 쌓여서 응답이 느려지는 것이며, 이는 네트워크, db io, os run queue 등 다양한 요소에서 발생할 수 있습니다.

성능 측정 방법과 원칙

성능 측정 방법은 스펙과 작업량을 고정하는 것입니다. 성능을 향상시키기 위해서는 1) 효율성과 2) 동시성, 3) 성능, 4) 확장성의 원칙을 고려해야 합니다. 효율성은 리소스, 로직, DB Storage 등을 최적화하는 것을 말하며, IO (Memory, Network, Disk), CPU, Algorithms, DB Queries, Data Structures, DB Schema, Caching 등을 최적화해야 합니다. 동시성은 여러 요청을 처리하는 것을 말하며, 이를 처리하기 위해서는 Multi Threading (Single Machine), Multi Threading + Multi Processing or Distributed Processing (Multi Machine)를 사용해야 합니다. 성능은 CPU, Memory, Disk, Network 등 하드웨어 요인이 영향을 주기 때문에 이를 고려해야 하며, Capacity와 Scalability는 시스템이 어느정도 처리할 수 있는 능력을 말합니다.

Scalability

Scalability에는 Vertical Scalability와 Horizontal Scalability 두 가지 종류로 나뉩니다. 전자는 달성하기 쉽지만, 제한된 확장성을 갖으며 후자는 달성하기 어렵지만 제한 없는 확장성을 갖습니다. 또 Scalability를 달성하기 위해선, Decentralization과 Independence의 원칙을 따라야 합니다. Independence란 독립적인 구조가 보장되는 것을 말합니다.

달성 방법

이를 달성하기 위한 방법에는 Asynchronous Services, Caching, MSA 등이 있습니다. 하지만 이 중, MSA는 가장 마지막 옵션입니다. MSA를 하면, eventual consistency를 지키기 어렵기 때문입니다. Scalability를 달성하기 어려워져, 일관성 문제가 발생할 수 있으므로 MSA는 최후의 수단으로 삼아야 합니다.

Reliability

다음으로, 신뢰성 (Reliability)에 대해서 알아보겠습니다. 신뢰성은 시스템 내 각 구성요소를 대상으로 redundancy를 제공하고, 장애 내성을 향상시키는 것을 말합니다. 대규모 시스템에서는 불가피하게 부분적인 문제가 발생할 수 있기 때문에 신뢰성은 매우 중요합니다. 따라서, 대응하는 방식과 백업 방식 등을 고려해야 합니다. Redundancy 제공, Fault Detection, Recovery, System Stability, Circuit Brakers, Fail Fast, Shed Load 등의 방식을 사용할 수 있습니다.

Security

다음으로, 보안 (Security)에 대해서 알아보겠습니다. 보안은 시스템 접근 제어 및 인증과정에서의 보안, 데이터 전송 및 저장 보안, 서비스 및 데이터 권한 관리, 민감한 데이터 보호 등 다양한 요소를 다룹니다. 이를 위해서는 암호화, 해싱, SSL 또는 TLS, OAuth2 등의 기술을 적용해야 합니다. 시스템을 보호하기 위해서는 보안 취약점과 위협성을 파악하고 대처하는 것이 중요합니다.

Deployment

다음으로, 배포 (Deployment)에 대해서 알아보겠습니다. 배포에서는 어플리케이션, 인프라스트럭처와 운영 방법을 주의하면서 배포해야 하며, 이를 위해서는 가상화 기술과 컨테이너 (Docker), 클라우드 (AWS, Azure, GCP) 등을 사용하여 시스템을 설계할 수 있습니다. 배포 전략은 recreate 배포, 롤링 업데이트, 카나리 배포, 블루-그린 배포, A/B 테스팅 방법 등이 있으며, 각 배포 방식에 따라 사용할 기술이 달라집니다.

Technology Stack

마지막으로, 기술 스택 (Technology Stack)에 대해서 알아보겠습니다. 기술 스택은 시스템을 구현하는 데 필요한 기술들을 말합니다. 이를 선택하는 것은 시스템에 따라 달라지며, 현재 가장 인기 있는 기술 스택은 MERN (MongoDB, Express, React, Node.js), MEAN (MongoDB, Express, Angular, Node.js) 등이 있습니다.

결론

이상으로, 시스템 요구사항 6가지에 대해 알아보았습니다. 성능, 확장성, 신뢰성, 보안, 배포, 기술 스택에 대한 요소들을 잘 고려하여 시스템을 설계하면, 높은 퍼포먼스와 안정성을 갖춘 시스템을 구현할 수 있습니다.

반응형

댓글