본문 바로가기
Software Engineering/시스템 설계

시스템 설계 시작하기

by 부뚜기 2023. 5. 5.
반응형

시스템 설계 

시스템 설계(System design)는 특정 비즈니스 요구사항을 충족시키기 위해 소프트웨어 시스템의 아키텍처와 구성 요소를 설계하는 과정이다. 이 프로세스는 시스템의 아키텍처, 구성 요소, 모듈 및 인터페이스를 정의하고, 시스템을 구현하는 데 사용될 기술과 도구를 식별하는 작업들을 수행한다.

 

시스템 설계를 시작하는 몇 가지 단계는 다음과 같다.

 

1. 요구사항 이해: 시스템을 설계하기 전에 요구사항을 이해해야 한다. 이를 위해서 이해 관계자 및 사용자와 대화를 나누고 기존 문서를 검토하며 시스템이 지원할 비즈니스 프로세스를 분석해야 한다.

 

2. 시스템 아키텍처 정의: 요구사항을 명확하게 이해한 후, 시스템 아키텍처를 정의할 수 있다. 이는 시스템의 주요 구성 요소와 그들 사이의 인터페이스를 식별하는 것을 포함한다.

 

3. 기술 스택 선택: 요구사항 및 시스템 아키텍처를 기반으로 기술 스택을 선택할 수 있다. 이에는 시스템을 구현하는 데 사용될 프로그래밍 언어, 데이터베이스, 프레임워크 및 라이브러리를 선택하는 것이 포함된다.

4. 모듈 디자인: 이제 시스템을 구성하는 모듈을 설계해야 한다. 이는 각 모듈이 수행할 기능과 조작할 데이터를 정의하는 것을 포함한다.

5. 확장성 계획: 시스템을 설계하는 동안 확장성을 고려해야 한다. 이는 잠재적 병목 현상을 식별하고 시스템에 증될 부하를 처리할 수 있도록 설계하는 것을 포함한다.

6. 보안 및 개인정보 보호 고려: 보안과 개인정보 보호는 시스템 디자인에서 주요 고려 사항이 되어야 한다. 이는 잠재적인 보안 위협을 식별하고 시스템을 완화하기 위한 설계를 하는 것을 포함한다.

7. 테스트 및 검증: 시스템 디자인이 완료되면 테스트와 검증을 수행해야 한다. 이는 실제 사용 상황을 시뮬레이션하는 테스트 케이스 및 시나리오를 만들고 시스템이 요구사항을 충족하는지 확인하는 것을 포함한다.

 

시스템 설계는 세심한 계획과 세부 사항에 대한 주의가 필요한 복잡한 프로세스다. 이러한 단계를 수행하면 사용자와 비즈니스의 요구를 충족하는 시스템 설계를 할 수 있다.

 

728x90

설계 문제에 대한 접근 방법

문제 분해: 설계 문제가 주어지면 작은 구성 요소로 분해한다. 이러한 구성 요소는 시스템에 구현해야 하는 서비스 또는 기능일 수 있다. 초기에는 시스템에 많은 기능이 있을 수 있으며, 인터뷰인 경우 모든 것을 설계할 필요는 없다. 시스템에 넣을 계획인 기능에 대해 인터뷰어에게 물어본다. 거기에 추가해야 할 기능이 있습니까? 어떤 서비스?...

 

아이디어 전달: 인터뷰어와 원활하게 의사소통을 한다. 시스템을 설계할 때 인터뷰어를 계속해서 참여시킨다. 플로우차트와 다이어그램을 사용해 설계를 명확하게 보여주어야 하며 확장성 문제를 어떻게 해결할지, 데이터베이스를 어떻게 설계할지 등 설계 아이디어를 인터뷰어에게 설명해 준다.

 

합리적인 가정 : 시스템을 설계할 때 합리적인 가정을 해야 한다. 예를 들어, 시스템이 하루에 처리하는 청 수, 한 달에 수행되는 데이터베이스 호출 수 또는 캐싱 시스템의 효율성 등을 가정해야 한다. 이러한 숫자들을 합리적으로 유지하려고 노력해야 한다. 당신의 가정을 명확한 사실과 숫자로 뒷받침해야 한다.   

 

확장 가능한 시스템을 성공적으로 구축하려면 시스템이 신뢰성 있고 가용성이 있으며 확장 가능하며 유지 관리 가능하도록 보장해야 한다. 그래서 이러한 용어가 무엇을 의미하며 장기적으로 시스템에 어떤 영향을 미치는지 알고 있어야 한다.

 

시스템 설계의 신뢰성

시스템은 최종 사용자 요구 사항을 충족할 수 있을 때 신뢰할 수 있다. 시스템을 설계할 때는 시스템에 일련의 기능과 서비스를 구현할 계획을 세워야 한다. 시스템이 모든 기능을 손실 없이 제공할 수 있다면, 그 시스템은 신뢰성이 있다고 할 수 있다. 장애 허용 시스템은 장애가 발생해도 계속해서 신뢰성 있게 작동할 수 있는 시스템이다. 장애는 시스템의 특정 구성 요소에서 발생하는 오류이다. 장애의 발생은 시스템의 실패를 보장하지 않는다. 실패는 시스템이 예상대로 동작하지 않는 상태로, 최종 사용자에게 일부 서비스를 제공할 수 없게 된다. 

 

시스템 설계의 가용성

가용성은 가동 시간이라고도 하는 합의된 수준의 운영 성능을 보장하는 것을 목표로 하는 시스템의 특성이다. 사용자의 요청을 처리하기 위해서는 시스템이 높은 가용성을 보장하는 것이 중요하다. 가용성의 정도는 시스템마다 다르다. 예를 들어, 소셜 미디어 애플리케이션을 설계하고 있다면 높은 가용성이 크게 필요하지 않을 수 있다. 몇 초의 지연은 허용될 수 있다. 인스타그램에서 즐겨 찾는 유명인의 게시물을 5-10초 지연 후에 볼 수 있다면 큰 문제가 되지 않을 것이다. 그러나 병원, 데이터 센터, 뱅킹 시스템을 설계하고 있다면 시스템이 높은 가용성을 보장해야 한다. 서비스에 대한 지연은 큰 손실을 초래할 수 있기 때문이다.

시스템의 가용성을 보장하기 위해 다음과 같은 다양한 원칙을 따라야 한다.

  • 시스템에 단일 장애 지점(Single Point of Failure)이 없어야 한다. 기본적으로 시스템은 모든 요청을 처리하기 위해 단일 서비스에 의존해서는 안 된다. 그 서비스가 실패하면 전체 시스템이 위태롭고 가용하지 않아 질 수 있다.
  • 장애를 감지하고 해당 시점에서 해결한다.

시스템 설계의 확장성

확장성은 시스템이 증가하는 부하에 대처할 수 있는 능력을 말한다. 시스템을 설계할 때는 시스템이 경험하는 부하를 염두에 두어야 한다. 시스템을 X 부하용으로 설계해야 한다면, 10X까지 설계하고 100X까지 테스트할 계획을 세워야 한다고 한다. 예를 들어, 전자상거래 애플리케이션을 설계한다면, 플래시 세일이나 새로운 제품 출시 시 부하가 급증할 수 있다. 이 경우 시스템은 부하를 효율적으로 처리할 수 있어야 하며, 이것이 확장 가능한 시스템이다. 확장성을 보장하려면 시스템이 경험할 부하를 계산할 수 있어야 한다. 시스템의 부하를 설명하는 다양한 요인이 있다.  

  • 시스템에 들어오는 처리 요청 수
  • 시스템에서 수행되는 데이터베이스 호출 수
  • 시스템에 대한 캐시 히트 또는 미스 요청 양
  • 시스템에서 활성 사용자 수
반응형

다음은 소프트웨어 시스템을 설계할 때 고려해야 할 몇 가지 중요한 사항이다.

 

ㆍ확장성: 시스템은 증가하는 부하를 처리하고 수평적 또는 수직적으로 확장할 수 있도록 설계되어야 한다.
ㆍ성능: 시스템은 최소한의 대기 시간과 응답 시간으로 효율적이고 효과적으로 실행될 수 있도록 설계되어야 한다.
ㆍ신뢰성: 시스템은 최소한의 다운타임 또는 시스템 장애로도 신뢰적이고 사용 가능해야 한다.
ㆍ보안: 시스템은 보안을 고려하여 설계되어야 하며, 불법적인 액세스를 방지하고 중요한 데이터를 보호하는 조치가 포함되어야 한다.
ㆍ유지보수성: 시스템은 문서화가 잘 되어 있으며, 코드가 잘 구성되어 유지보수와 업데이트가 쉽도록 설계되어야 한다.
ㆍ상호운용성: 시스템은 다른 시스템 및 구성 요소와 매끄럽게 작동하도록 설계되어야 하며, 명확하고 잘 정의된 인터페이스가 필요하다.
ㆍ사용성: 시스템은 사용자 친화적이고 직관적인 사용자 인터페이스를 갖추도록 설계되어야 한다.
ㆍ비용 효율성: 시스템은 요구 사항을 충족하는 동시에 개발 및 운영 비용을 최소화하도록 설계되어야 한다.

 

소프트웨어 시스템을 설계할 때 고려해야 할 몇 가지 장점과 단점.

 

장점:
ㆍ향상된 효율성: 잘 설계된 시스템은 반복적인 작업을 자동화하고 오류를 줄이며 생산성을 향상시키는 데 도움이 될 수 있다.
ㆍ확장성: 잘 설계된 시스템은 비즈니스 요구 사항이나 사용자 수요의 변화에 대응하여 필요에 따라 쉽게 확장할 수 있다.
ㆍ개선된 사용자 경험: 잘 설계된 시스템은 더 나은 사용자 경험을 제공하여 사용자가 목표를 달성하기 쉽고 사용자 만족도가 높아질 수 있다.
ㆍ향상된 보안: 잘 설계된 시스템은 보안 및 데이터 보호를 위한 최선의 방법을 구현하여 보안을 향상시키는 데 도움이 될 수 있다.
ㆍ향상된 통합: 잘 설계된 시스템은 다른 시스템이나 애플리케이션과 쉽게 통합될 수 있어 상호 운용성이 개선되고 복잡성이 줄어든다.

 

단점:
ㆍ복잡도 증가: 시스템이 더 복잡해지면 설계, 개발 및 유지보수가 더 어려워질 수 있다.
ㆍ비용 증가: 복잡한 시스템을 설계하는 것은 비용이 많이 들며, 많은 자원과 전문성이 필요하다.
ㆍ개발 시간 증가: 복잡한 시스템을 설계하는 것은 간단한 시스템보다 더 오래 걸릴 수 있으며, 이로 인해 시스템의 제공이 지연될 수 있다.
ㆍ고장 발생 위험 증가: 시스템이 더 복잡해지면 고장 발생 가능성이 더 높아져 문제를 진단하고 해결하는 데 추가 자원이 필요할 수 있다.
ㆍ변화에 대한 적응 어려움: 복잡한 시스템은 비즈니스 요구사항이나 기술 동향의 변화에 대응하기 어려울 수 있다.


시스템을 설계할 때 이러한 장단점을 고려하고 비즈니스와 사용자의 특정 요구사항에 대비해야 합니다.

반응형

'Software Engineering > 시스템 설계' 카테고리의 다른 글

시스템 설계 가이드  (0) 2023.05.05

댓글