좋은 소프트웨어 시스템을 설계하려면 어떤 점들을 고려해야 할까요? 시스템을 설계할 때 고려해야 할 부분은 여러 가지가 있는데요, <데이터 중심 애플리케이션 설계 (원제: Designing Data-Intensive Applications)>에서 저자 Martin Kleppmann은 이 중 세 가지를 가장 중요한 점으로 꼽았습니다.
1️⃣ 신뢰성(Reliability)
소프트웨어 시스템에는 여러 가지 장애가 생길 수 있습니다. 시스템 장애는 하드웨어나 소프트웨어 결함, 또는 사람의 실수(human error)로 인해 발생합니다. 어느 날 잘 작동하던 인스타그램이 로딩되지 않거나, 넷플릭스가 먹통이 된 현상을 경험하신 적이 있으실 거예요. 이런 에러가 반복되면 사람들이 서비스에 대한 신뢰를 잃게 되고, 최악의 경우 이 서비스를 떠나게 되겠죠. 따라서 소프트웨어 시스템은 어떠한 장애가 있더라도 정상적으로 작동해야 하도록 신뢰성(Reliability)이 높게 설계되어야 합니다.
2️⃣ 확장성(Scalability)
소프트웨어 시스템은 끊임없이 진화합니다. 카카오톡을 예로 들어볼게요. 카카오톡을 처음 출시했을 때 목표로 잡은 가입자 수는 10만 명이었다고 합니다. 그런데 예상과 달리 5일 만에 가입자 수 10만 명이 넘었고, 출시 6개월 뒤에는 100만 명을 돌파했습니다. 지금은 월간 사용자 4,500만 명(2021년 6월 기준)에 달하는 온 국민의 메신저가 되었죠. 이렇게 빠르게 늘어나는 사용자 부하와 그 사용자들이 주고받은 방대한 양의 데이터를 어떻게 처리할 수 있었을까요? 이런 문제를 고민하는 것이 확장성(Scalability)의 영역입니다.
3️⃣ 유지보수성(Maintainability)
소프트웨어 시스템은 한 번 개발한다고 끝이 아닙니다. 경쟁사의 서비스는 계속 신기능을 개발해 사용자를 늘려가는데 우리 서비스만 가만히 있을 수 없겠죠. 계속 새로운 기능을 추가하고, 기존 기능이 잘 작동하도록 보살펴 줘야 합니다. 이런 작업을 유지보수라고 하는데요, 시스템이 크고 복잡해질수록 유지보수도 더 어려워집니다. 이런 유지보수 작업을 보다 쉽고 간편하게 만드는 것이 유지보수성(Maintainability)의 영역입니다.
📕 책 정보: https://search.shopping.naver.com/book/catalog/32466573690
📔 함께 읽어보면 좋은 글
- 시스템 설계 면접 준비 방법: https://careerly.co.kr/comments/67313
위 내용은 저의 브런치 글 <시스템 설계 면접 준비 방법>의 일부를 정리한 내용입니다.