brunch

You can make anything
by writing

C.S.Lewis

by 엄지현 Jul 25. 2022

시스템 설계 면접 준비 방법

신뢰성, 확장성, 유지보수성 높은 시스템 설계하기


시스템 설계 면접은 개인적으로 기술 면접 중 가장 어렵다고 생각되는 유형입니다. 하지만 연차가 높아질수록 회사에서 시스템 설계 능력을 더 중요하게 보더라고요. 주니어 엔지니어에게는 주어진 요구 사항에 맞춰 코드를 잘 쓰는 게 주 업무라면, 시니어 엔지니어는 직접 시스템 아키텍처를 설계하고 기술적 요구 사항을 만들어 내기도 합니다. 그렇기 때문에 회사에서 시스템 설계 면접을 통해 지원자가 좋은 시스템 아키텍처를 설계할 능력이 있는지 평가하는 것이죠. 이번 글에서는 시스템 설계 면접을 준비하는 방법에 대해 소개합니다.





시스템 설계 시 고려할 것

좋은 소프트웨어 시스템을 설계하려면 어떤 점들을 고려해야 할까요? 시스템을 설계할 때 고려해야 할 부분은 여러 가지가 있는데요, <데이터 중심 애플리케이션 설계 (원제: 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)의 영역입니다.




시스템 설계 공부법

지난 몇십 년 간 소프트웨어 시스템의 사용자 수와 데이터 양은 꾸준히 증가했습니다. 그리고 이렇게 시스템이 커지면서 발생하는 문제들을 해결하기 위해 수많은 기술이 생겨났죠. 사용자 부하를 여러 서버에 분산시켜 주는 로드 밸런서(Load Balancer), 데이터에 빠르게 접근할 수 있도록 자주 사용되는 데이터를 임시로 저장하는 캐시 (Cache), 이미지가 빠르게 로딩될 수 있도록 사용자 근처의 서버에 저장하는 콘텐츠 전송 네트워크(CDN) 등 다양한 기술이 있습니다. 시스템 설계 면접에서는 이런 기술을 잘 활용해서 신뢰성, 확장성, 유지보수성이 높은 시스템을 설계해야 합니다.


시스템 설계 면접을 준비할 때는 아래 2단계를 따라 공부하시는 것을 추천드립니다.

1. 시스템 설계 기본 다지기 - 시중에 어떤 기술들이 있고, 각 기술을 어떨 때 사용하는지.

2. 케이스 스터디를 통해 실제 사용 사례 분석해 보기 - 실제 회사에서 어떤 문제를 해결하기 위해 어떤 기술을 사용했는지.


아래는 시스템 설계 공부에 도움이 되는 추천 자료입니다.


도서

데이터 중심 애플리케이션 설계 (원제: Designing Data-Intensive Applications)

가상 면접 사례로 배우는 대규모 시스템 설계 기초 (원제: System Design Interview: An Insider's Guide)

이 도서의 내용은 웹사이트(영문)로도 제공됩니다.


온라인 자료 (영문)

Grokking the System Design Interview

Deep Dive into System Design Interview

The System Design Primer


케이스 스터디 (영문)   

InfoQ: 개발 컨퍼런스 QCon의 발표 영상 및 기타 자료 모음

이외에도 유튜브나 각 컨퍼런스 사이트에서 지난 발표 영상을 찾아보면 좋습니다.




시스템 설계 면접을 위한 6가지 팁

마지막으로 시스템 설계 면접에 도움이 될만한 팁을 몇 가지 적어 보았습니다.  


1. 설계를 시작하기 전에 충분한 질문을 통해 요구사항을 정확히 이해하세요.

2. 설계 범위를 넓고 얕게 잡을지, 또는 어느 특정 영역에 집중해서 볼지 면접관과 상의하세요.

3. 대략적인 설계안을 제시한 뒤, 상세한 설계로 들어가는 흐름이 좋습니다.

4. 본인이 자신 있는 부분에 좀 더 집중해서 설명하셔도 됩니다.

5. 가능하다면 두 개 이상의 설계안을 제시하고, 각 설계안의 장단점을 비교해 보세요.

6. 동료와 함께 설계한다고 생각하고 끊임없이 소통하면서 진행하세요.




여기까지 시스템 설계  고려할 , 공부 방법, 그리고 면접 팁을 공유드렸습니다. 사실 시스템 설계 실력은 단기간의 준비로  끌어올리긴 어렵습니다. 꾸준한 공부와 실제 업무에서의 경험이 합쳐져서 조금씩 노하우가 쌓이게 되죠. 하지만 제대로 시스템 설계 지식을 쌓아 놓으면 면접 상황 외에 평소 업무에서도 많은 도움이 되니, 포기하지 말고 꾸준히 공부하시길 바랍니다!



이전글:


다음글:

매거진의 이전글 라이브 코딩 테스트 실전 5단계 가이드
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari