본문 바로가기

항해99_10기/105일의 TIL & WIL

[기술면접 스터디] [230223] MAS / generics / List, Set, Map, HashTable

Q1. MSA (Microservice Atchitecture)란?
MSA는 작은 레고 블럭 여러개를 쌓아 큰 구조물을 만들 듯, 하나의 큰 어플리케이션을 여러개의 작은 어플리케이션으로 쪼개어 변경과 조합이 가능하도록 만든 아키텍쳐라고 할 수 있습니다.  각각의 서비스는 크기가 작은 모노리틱 아키텍처와 유사한 구조를 가지고, 독립적으로 배포가 가능합니다. 또, 다른 서비스에 대한 의존성이 최소화 되어 독립적 운영이 가능합니다. 마지막으로 개별 프로세스로 구동 되며, REST와 같은 가벼운 방식으로 통신되어야 합니다.

MSA의 장점으로는 서비스 별 배포가 가능하므로, 전체 서비스의 중단 없이 개별 서비스를 배포할 수 있으며, 확장이 쉽고, 클라우드 사용에 적합한 아키텍처입니다. 장애의 관점에서 부분적 장애가 전체 서비스로 확장될 가능성이 적고 부분적 장애에 대한 격리가 수월합니다. 신기술의 적용이 유연하며, 서비스를 polyglot (다양한 언어)하게 개발/운영 할 수 있습니다. 

반면, 단점으로는 MSA는 MLA 비해 복잡한 아키텍처로, 설계에 오랜 시간이 걸립니다. 성능의 측면에서도 서비스 간 호출 시 API를 사용하므로, 통신비용, latency가 늘어나게 됩니다. 또, 테스트나 트랜잭션시에 복잡도가 증가하고 많은 자원을 필요로 합니다. 마지막으로 데이터가 여러 서비스에 걸쳐 분산되기 때문에 한번에 조회하기 어렵고, 정합성 또한 관리하기 어렵습니다.

 

Q2. TypeScript에서 generics 개념을 설명해주세요.
한가지 타입보다 여러 타입에서 동작하는 컴포넌트를 생성할때 사용하는 기능으로 컴포넌트의 재사용성을 높일 수 있습니다. 예를 들어, sum이라는 함수를 선언할때, parameter로 number, string, array를 받고 싶고, return 값도 parameter 타입과 동일한 타입으로 지정하고 싶을 때 generic T를 사용할 수 있습니다.
이와 비슷한 기능을 수행하는 any 타입과 비교하자면, any는 타입 검사 자체를 수행하지 않기 때문에, 입력값과 리턴값의 타입을 보장하지 않습니다. 반면, generic은 입력값과 리턴값을 모두 T로 지정하면, 입력값의 타입과 동일한 타입으로 리턴하도록 보장합니다.

 

Q3. List, Set, Map, HashTable의 차이에 대해서 설명해주세요.
우선 List같은 타입의 변수들로 이루어져있고, 크기가 정해져있으며, 인접한 메모리 위치에 있는 데이터를 모아 놓은 자료구조입니다. 때문에, 인덱스를 이용한 읽기에는 O(1)이 걸리고, 특정 값으로 검색하는 경우 O(n), 삽입과 삭제의 경우에도 O(n)이 걸립니다.
Set중복 금지 규칙이 적용된 자료구조입니다. 따라서 읽기, 검색, 삭제는 List와 효율이 같지만, 삽입의 경우 삽입하려는 값이 중복인지 확인 후 삽입하기 때문에 효율이 떨어집니다.
Map특정 순서에 따라 키-밸류 쌍으로 형성된 자료구조입니다. key를 이용한 데이터 검색에 O(1)으로 빠른 룩업이 가능하며, 삽입과 삭제에도 또한 O(1)이 걸립니다. map은 해시 테이블을 구현할 때 쓰며 정렬을 보장하지 않는 unordered_map과 정렬을 보장하는 map 두가지가 존재합니다.
HashTable은 무한에 가까운 데이터들을 유한한 개수의 해시 값으로 매핑한 테이블입니다. Map을 사용해 HashTable을 구현하며, 삽입, 삭제, 검색 시 평균적으로 O(1)의 시간 복잡도를 가지며 unordered_map으로 구현합니다.