System Design Interview
시스템 아키텍처를 설계한다는 것은 개발자만이 할 수 있는 특별한 경험 중 하나일 것이다.
하지만, 스타트업에서 일하거나 좋은 기회로 신규 서비스의 인프라를 구축하는 경우 외 대부분은 이미 구축된 기존 시스템 인프라를 그대로 이용하고, 배포하고, 운영하게 된다.
(그러면서 점차 개발자만의 특별한 경험에 대한 경험치가 낮아지고, 도태될 수도 있다.)
시스템 설계 명접 준비를 통해서 최신 동향을 파악하고, 문제점 진단과 해결 솔루션에 대해서 많이 살펴볼 수 있을 것 같다.
무엇을 원하는가?
시스템 설계 면접은 많은 테크 기업에서 채용 전형 중 하나로 포함되어 있고, 다음과 같은 능력을 살펴보기 위함이다.
- 시스템 설계 기술 능력
- 설계 과정에서 내린 결정에 대한 방어 능력
- 인터뷰이와의 소통 능력
- 동료와의 협업 능력
- 모호한 문제에 대한 건설적인 해결 능력
- 적절한 타협적인 결정 능력
- 오버-엔지니어링 자제 능력
- 개인적인 성향 파악
시스템 설계 접근 방법
무턱대고 도메인 설계하고 시스템 아키텍처 그림 그리는 것보다 당연히 차근차근 문제에 대한 인식과 설계 방향을 잡아가며 진행해야 할 것이다. 시스템 설계 면접은 보여지는 것보단 정말 개인의 업무 능력과 성향이 잘 드려내야하는 자리이기 때문이다.
그러기 위해 다음과 같은 4가지 접근 방법으로 정리해보았다.
- 문제 이해 & 설계 범위 확정
- 개략적인 설계안 제시
- 상세 설계
- 마무리
자세한 예시를 위해 다음과 같은 시스템 설계 문제를 풀어보고자 한다.
예제. 팔로우 & 포스팅 & 피드 서비스 만들기
- 회원은 다른 회원을 팔로우한다.
- 회원은 이미지와 텍스트를 작성한 피드를 포스팅한다.
- 회원은 자신이 팔로우한 회원들의 피드 목록 조회한다.
1단계. 문제 이해 & 설계 범위 확정
제일 먼저 접근해야하는 것은 바로 문제에 대한 이해이다.
요구 사항이 가진 문제를 정확하게 이해를 해야하는데, 이해하기 위해서는 인터뷰이를 적절하게 이용 방법이 중요하다.
- 구체적인 기능은 무엇인가?
- 서비스 이용 사용자 수의 대략적인 규모는?
- 서비스 성장에 대한 예상은? (ex. 3달 뒤 서비스 예상 성장 규모는?)
- 주로 사용하는 기술 스택은 무엇인가? (설계 단순화를 위해 기존 사용 중인 시스템 파악)
예제 적용해보기
- 회원 팔로우 기능은 단방향 팔로우인가?
- 회원이 팔로우하는 회원의 수 제한이 있는가?
- 피드 이미지 파일 크기 제한이 있는가?
- 피드 텍스트 길이 제한이 있는가?
- 피드 목록 조회시 정렬 기준은?
DAU
와 같은 트래픽은 얼마나 되는지?
2단계. 최초 설계안 제시
이번 단계부터, 인터뷰이를 팀원처럼 인지하여 최대한 이용한다.
- 핵심 기능 기준으로 주요 컴포넌트 다이어그램을 간단히 작성한다.
- 클라이언트, API, 웹 서버, 데이터 저장소, 캐시, 메시지 큐 같은 필요한 시스템에 대한 구성도를 대략적으로 작성한다.
- 최초 설계안을 그리고, 요구 사항을 만족할 수 있을지 검토한다.
- 구체적인 서비스 사례를 적용하면서 고려하지 못한 에지-케이스를 찾고, 해결 방안을 제시한다.
- 상세 API URL 같은 엔드포인트 또는 데이터 스키마 정의도 필요한지 확인하고 작성한다.
예제 적용해보기
APP or WEB
서비스를 통해 팔로우 또는 피드 포스팅 요청을 한다.- 요청 트래픽은 로드-밸런서과 게이트웨이를 거쳐 팔로우 서비스 또는 피드 서비스 컴포넌트에 요청 들어온다.
- 팔로우 요청인 경우, 팔로우 회원 정보를 팔로우 DB 데이터 저장한다.
- 피드 포스팅 요청인 경우, 이미지 파일은 파일 스토리지에 저장하고 파일 경로와 함께 피드 정보를 피드 DB 데이터 저장한다.
3단계. 상세 설계안 제시
- 서비스 구성 컴포넌트 우선순위를 정하여 세부 기능을 정의하고 깊이 있는 토론을 진행한다. (단, 불필요한 세부 기능에 대한 시간 허비 하지 말아야 한다.)
- 서비스 확장성, 신뢰성, 유지보수성을 고려한 설계 방향으로 상세 설계안을 제시한다.
- 데이터 저장소, 캐시 등 필요한 시스템을 다시 한번 배치한다.
- 최초 설계안 기준으로 사용할 프로그램을 무엇인지 구체적으로 제시한다.
예제 적용해보기
- 포스팅한 피드 저장과 팔로우의 피드 조회 최적화를 위해 각 피드 저장 & 조회 서비스를 분리한다.
- 피드 포스팅 저장 시, 회원의 팔로워 정보에 포스팅 피드의 정보를 추가한다.
- 피드 조회 시, 포스팅 일자 순으로 정렬하여 조회한다.
4단계. 마무리
- 병목 구간, 개선점이 있을지 인터뷰이와 함께 고민한다.
- 비판적인 시각을 가지고 최대한 시스템의 개선 포인트를 잡아낸다.
- 설계안에 대한 정리된 요약 내용을 제시한다.
- 서버 오류, 네트워크 장애에 대한 대응 방안 제시한다.
- 모니터링과 같은 운영 이슈 대응 방법 제시한다.
- CI/CD 구축에 대해서 함께 고민하고 제시한다.
예제 적용해보기
- 피드 포스팅 시, 팔로워 수가 대용량 건수인 경우
팔로워 피드 DB
저장에 문제가 없는가? - 피드 이미지 저장 스토리지 종류와 대용량 이미지 파일 저장 최적화 방안이 있는가?
- 피드 조회 시, 포스팅 일자 오름차순 정렬일 경우 최적화된 조회 방법은?
- 피드 조회 서비스에 대용량 트래픽 인입되는 경우 조치 방안은?