[기술 면접 대비] CS는 어디에 써먹을 수 있을까요? - 네트워크편
F-Lab : 상위 1% 개발자들의 멘토링
안녕하세요! F-Lab의 대표멘토 Fitz라고 합니다.
CS공부는 너무 지겨운데 정말 어디에 써먹을 수 있을까요..?
제가 상담을 하다보면 자주 듣는 이야기 중 하나가 “CS 공부는 하는데 어디에 써먹어야할지 모르니 동기부여도 안돼고 막막하다..” 라는 말을 자주 듣습니다.
그래서 IT서비스 기업과 빅테크 기업으로 취업/이직 준비를 하시는 분들을 위해 CS 지식의 활용처를 알 수 있는 꼬리질문 컨텐츠를 만들어보았습니다 🔥
이번 편에서는 네트워크의 기본적인 내용에 대한 얘기와 그 지식을 활용하여 어떤 문제들을 해결할 수 있는지를 소개하고 있습니다. 토글로 접혀있어 적어보일 수 있지만, 펼쳐보시면 여러 키워드들을 얻으실 수 있으실겁니다. 💪
많은 분들께 도움이 되길 바랍니다!
본질적인 질문
네트워크 통신은 성능을 상당히 저하시키는 작업이라고 알려져 있습니다. 왜 그럴까요?
빛의 속도는 1초에 지구를 몇 바퀴 돌 수 있을까요?
지구 반대편에 있는 미국에 있는 서버와 TCP 통신을 하려면 우리는 어느 정도의 성능 저하를 감수해야할까요?
TCP로 통신을 하려면 어떤 과정들을 거치게되나요?
3way handshake → 요청 → 응답 → 4way handshake
여러분이 지금 사용하고 있는 인터넷의 대역폭은 얼마인가요? 즉 초당 어느 정도의 데이터를 주고받을 수 있나요?
우리가 개발하면서 네트워크를 통해 주고받는 데이터는 어떤것들이 있을까요?
- 웹, 모바일에서 사용되는 이미지, 폰트, 동영상
- 웹, 모바일에서 서버에 요청하는 JSON 데이터
- 서버에서 데이터베이스와 주고받는 데이터
- 마이크로서비스에서 다른 서비스를 호출할 때 주고받는 데이터
위와 같은 데이터를 주고받을 때 데이터의 용량이 커지면 어떤 문제가 발생할까요?
- 주어진 대역폭보다 큰 데이터를 주고받으면 지연이 발생합니다.
위의 이론을 활용해 해결할 수 있는 문제
지그재그, 에이블리와 같은 쇼핑몰 모아보기 서비스를 만들려합니다. 그럼 아주 많은 쇼핑몰들을 크롤링해야하는데 크롤링 속도를 어떻게 튜닝할 수 있을까요?
크롤링을 할 때는 어떤 자원들을 고려해야할까요? 네트워크 자원도 상관이 있을까요?
- HTML을 파싱하기 위한 CPU 자원
- 쇼핑몰 서버를 호출해서 데이터를 받아오기 위한 네트워크 자원
- 파싱한 쇼핑몰 데이터를 데이터베이스에 저장하기 위한 네트워크 자원
- 쇼핑몰 서버에서 가져온 방대한 데이터를 담아두기 위한 메모리 자원
크롤링 속도를 튜닝할 때 네트워크 자원을 어떻게 쥐어짜서 성능을 높힐 수 있을까요?
데이터를 최대한 많이 발송하고, 많이 수신하여 네트워크 대역폭을 최대한 활용해야합니다.
- Blocking 방식을 이용할 경우 스레드의 개수를 늘려 동시 요청의 개수를 늘립니다.
- Non-Blocking 방식을 이용하면 많은 요청을 빠르게 던질 수 있어 동시 요청의 개수를 편하게 늘릴 수 있습니다.
- (RDB를 사용할 경우) Blocking 방식으로 통신하기 때문에 Connection 1개당 1개씩밖에 요청을 보내지 못합니다. 그래서 Connection Pool을 사용하여 동시에 많은 요청을 보낼 수 있도록 합니다.
네트워크 통신 자체가 비싼 작업이므로 통신하는 횟수를 줄여야합니다.
- 반복문을 돌며 DB에 1개씩 Insert 작업을 시키기보단 Bulk Insert를 활용해야합니다.
(보너스) 다른 자원들은 어떤 것들을 고려해야할까요?
CPU를 쥐어짜려면 어떤 것들을 고려해야할까요?
- 멀티 스레딩과 멀티 프로세싱을 활용하여 멀티코어를 활용할 수 있어야합니다.
- 스레드가 Block되지 않도록 하여 CPU 활용률을 높혀야합니다.
- 너무 과도한 스레드를 사용하지 않게 하여 컨텍스트 스위칭 비용을 줄입니다.
메모리는 무엇을 고려해야할까요?
- 어쩌다 갑자기 너무 많은 양의 데이터가 메모리에 쌓여버려서 Out of memory 에러가 발생하면 어플리케이션이 죽어버릴 수 있지 않을까요?
웹페이지를 만들었는데 접속했을 때 페이지가 뜨는 속도가 느립니다. 빠르게 하려면 어떻게 해야할까요?
폰트, 이미지들의 파일 용량이 크면 네트워크로 전송하는데에 시간이 오래 걸려 성능이 저하될 수 있습니다.
- Image Compressor 를 검색해보시면 이미지의 용량을 줄일 수 있습니다.
- 이미지나 동영상의 사이즈를 줄이는 것도 방법입니다. 대부분의 상황엔 초고화질의 이미지가 필요 없기 때문입니다.
- 폰트도 저용량버전이 있습니다.
- 개발자 도구를 켜셔서 네트워크 탭을 보시면 어떤 것들이 용량이 큰지 확인하실 수 있습니다.
서버를 운영중인데 유저가 많아져 대용량 트래픽을 처리해야합니다.
- API에서 제공되는 json의 크기를 줄이는 것도 방법입니다. 예를 들자면 개행과 공백은 필수적인게 아니기에 지우면 용량을 줄일 수 있습니다. 일반적으로 프레임워크를 사용할 경우엔 내부적으로 이런 옵션이 내장되어 있습니다.
여기까지 준비해봤습니다. 긴 질문 보느라 고생 많으셨습니다.
감사합니다!
이 컨텐츠는 F-Lab의 고유 자산으로 상업적인 목적의 복사 및 배포를 금합니다.