내일배움캠프 Node.js 본캠프 50일차

김선우·2024년 10월 21일
post-thumbnail

알고리즘 문제풀기

이진 변환 반복하기

문제 설명

0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.

x의 모든 0을 제거합니다.
x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.

0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.

제한사항

s의 길이는 1 이상 150,000 이하입니다.
s에는 '1'이 최소 하나 이상 포함되어 있습니다.

풀이 코드

function solution(s) {
    var zerocount = 0;
    var count = 0;
    while (s.length > 1){
        count++;
        var div = 0;
        var answer = s.split("").filter(x => {
            if( x == 0){
                zerocount++;
            }else{
                div++;
            }
        });
        s = div.toString(2);
    }
    return [count, zerocount];
}

풀이 과정

이진변환해서 1이 될때까지 반복 수행할 반복문을 만든 후 반복문이 실행될때마다 count값을 증가시킨다. s값을 검사했을때 0의 개수만큼 zerocount 증가, 나머지의 개수만큼 div를 증가시켜주고 div를 이진법으로 전환해준다. 해당 행동을 s가 1이 될때까지 반복하고 얻은 count값과 zerocount값을 반환해준다.

모의 면접 준비

1. Q) 전송 계층 프로토콜에 대해 설명해주세요.

A) 종단 호스트 간 애플리케이션 데이터를 전송해주는 역할을 한다.
메시지의 오류를 제어하고 메시지가 클 경우 이를 나눠서 네트워크 계층으로 전달한다. 이후 받은 패킷을 재조립해서 상위 계층으로 전달한다.
데이터의 단위는 segment이고, 대표적으로 TCP, UDP 프로토콜이 있고, TCP는 연결 지향형 통신을, UDP는 비연결형 통신을 제공한다.

  • 꼬리질문

    Q) IP의 한계

    • A) 크게 비연결성, 비신뢰성, 프로그램 구분 불가능이 있다.
      비연결성은 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷을 전송하는 것이다.(ex) 컴퓨터가 꺼진 경우)
      비신뢰성은 중간에 패킷이 사라지는 경우(패킷 손실)나 클라이언트에서 패킷이 보낸 순서대로 서버에 오지 않는 경우를 말한다.
      => 순서대로 오지않는 경우 : 메시지가 약 1500byte가 넘으면 메시지를 나눠서 보내게 되고 이 메시지가 인터넷 망에서 다른 노드를 타고 서버로 전달되 서버에 도착하는 순서가 달라질 수 있다.
      프로그램 구분 불가능은 한 PC에서 여러개의 애플리케이션들이 같은 IP를 쓰는 상황에서 전송받은 패킷이 어떤 애플리케이션에 해당하는지 알 수 없는것을 말한다.

      Q) 오류 제어, 흐름 제어

    • A) 둘 다 TCP의 제어 중 하나이다.
      오류 제어는 TCP가 통신 중에 오류가 발생하면(프레임이 손상되었거나 손실 되었을 경우.) 해당 데이터를 재전송을 통해 오류를 복구하는 것인데, 이는 ARQ(Automatic Repeat Request)기법을 사용한 것이다.
      전송 도중 발생한 부호 오류를 검출하고 정확한 정보를 재현하는 기술.
      흐름제어는 송신 측과 수신 측의 데이터 처리 속도가 다를 때 송신 측의 속도가 빠르다면 수신 측 버퍼가 넘치는 오버플로우 문제가 발생하게 되는데, 이러한 상황에서 문제를 줄이기 위해 자신이 처리할 수 있는 데이터의 양으로 송신 측의 데이터 전송량을 조절하는 것이다.
      (데이터 패킷을 전송할 때 수신 한도를 넘는 과도한 패킷의 입력으로 분실이 발생하지 않도록 흐름의 양을 조절하는 것.)

2. Q) 대칭키, 비대칭키 암호화에 대해 설명해주세요.

A) 대칭키 암호화 방식은 암복호화에 사용하는 키가 동일하지만 비대칭키 암호화는 암복호화에 사용하는 키가 서로 다르다.
대칭키는 암호화방식에 속도가 빠르고 대용량 Data 암호화에 적합하지만 키를 교환해야하는 문제, 탈취 관리 걱정과 확장성 면에서 사람이 증가할수록 키관리가 어렵다는 단점을 가지고 있다. => 기밀성을 제공하지만 무결성/인증/부인방지를 보장하지 않는다.
대표적으로 SEED, DES, 3DES, AES, ARIA등이 있다.
비대칭키는 공개키라고도 하고 키분배를 해줄 필요 없고, 기밀성/인증/부인방지 기능을 제공하지만 속도가 느리다.
암호 모드와 인증 모드로 나뉘는데 암호 모드는 송신자 공개키로 암호화 후 송신자 사설키로 복호화하는 방식으로 소량의 메시지 암호화가 목적이고 주로 키 교환의 용도로 사용된다.
인증모드는 송신자 사설키로 암호화 후 송신자 공개키로 복호화하는 방식으로 메시지를 인증 하는 것이 목적이다.
대표적으로 Diffie Hellman, RSA, DSA, ECC가 있다.

  • 꼬리질문

    Q) 대칭키/비대칭키 혼합 사용

    • A) 대칭키는 키의 보관이 어렵고 비대칭키는 시간이 오래 걸린다는 단점을 가지고 있는데 서로의 장점이 자신의 단점이므로 혼합 사용을 통해 해결할 수 있다.
      우선 대칭키를 생성하고 생성한 대칭키를 사용해 암호문을 생성하고, 서버의 공개키로 암호화한다. 이 두가지 암호문을 서버에 보낸 후 서버의 개인키로 대칭키를 구하고 해당 대칭키를 사용해 암호문을 평문으로 복호화한다.

      Q) HTTPS

    • A) HTTPS는 HTTP(HyperText Transfer Protocol)의 보안 취약점을 해결하기 위한 프로토콜로 뒤의 S는 Secure Socket의 약자이다.
      HTTP와 기본 골격이나 사용 목적등은 동일하지만 보안 요소가 추가되었다는 차이점이 있는데, HTTPS를 사용하면 서버와 클라이언트 사이의 모든 통신 내용이 암호화된다.
      이때 암호화 방식으로는 대칭키와 비대칭키를 혼합해서 사용한다.
      네트워크 상에서 열람, 수정이 불가능하므로 안전하다는 장점이 있지만 암호화 과정이 웹 서버에 부하를 주고, HTTP보다 느리며, 인터넷의 연결이 끊긴 경우 재인증 시간이 소요되는 등의 단점을 가지고 있다.

3. Q) 로드밸런싱에 대해 설명해주세요.

A) 컴퓨터 네트워크 기술의 일종으로 둘 혹은 셋 이상의 중앙처리장치 혹은 저장장치와 같은 컴퓨터 자원들에게 작업(Work), 즉, 부하(Load)를 나누는 것을 의미한다. 이로써 가용성 및 응답시간을 최적화시킬 수 있다.
주요기능으로는 부하 분산, 조건에 맞춰 필요시 서버에 컴퓨터 수를 늘리거나 줄여서 부하 관리가 가능하게하는 오토 스케일링, 해당 포트에 트래픽을 보내 어플리케이션이 올바르게 작동하는지 여부를 판별하는 헬스 체크(Health Check), 웹의 비정상 트래픽을 탐지하고 차단하기 위한 방화벽인 WAF(Web Application Firewall)과 외부 연결에 노출되는 IP를 관리해 위험을 최소화하는 Cloud NAT(Network Address Translation) 보안서비스가 있다.

  • 꼬리질문

    Q) 로드밸런싱 알고리즘

    • A) 서버로 들어온 요청을 순서대로 돌아가며 배정하는 방식인 라운드 로빈 방식(Round Robin Method), 각각의 서버마다 가중치를 매기고 가중치가 높은 서버에 클라이언트 요청을 우선적으로 배분하는 가중 라운드로빈 방식(Weighted Round Robin Method), 클라이언트의 IP주소를 특정 서버로 매핑해서 요청을 처리하는 IP 해시 방식(IP Hash Method), Request가 들어온 시점에 가장 적은 연결 상태를 보이는 서버에 우선적으로 트래픽을 할당하는 최소 연결 방식(Least Connection Method), 서버의 현재 연결 상태와 응답시간을 모두 고려해 가장 짧은 응답 시간을 보내는 서버로 트래픽을 할당하는 최소 응답시간 방식(Least Response Time Method), 서버들과의 대역폭을 고려해 서버에 트래픽을 할당하는 대역폭 방식(Bandwidth Method)이 있다.

    Q) 헬스체크

    • A) 서버의 상태를 주기적으로 확인해 서버가 정상 작동하는지 여부를 판단하는 과정이다.
      여러 방식이 있지만 일반적으로는 Passive Health Checks, Active Health Checks, Agnet-based Health Checks 세가지로 나뉜다.
      Passive Health Checks는 서버에서 수신한 요청에 대해 응답을 제대로 보낼 수 있는지를 검사하는 방식으로 서버에 문제 발생시 요청에 대한 응답이 지연되거나 실패 가능성이 있으므로 이를 감지하기 위해 사용되는 방식이고 로드 밸런서같은 프록시 서버에서 주로 사용된다.
      Active Health Checks는 주기적으로 서버에 대한 요청을 보내고 응답을 받아 서버가 정상적으로 작동하는지 여부를 판단하는 방식으로 대표적으로 ICMP, TCP, HTTP, HTTPS 프로토콜을 이용한 체크방식을 사용한다. 서버의 로드 밸런싱, 데이터베이스 연결, API서비스 등에서 사용된다.
      Agnet-based Health Checks는 서버에 에이전트를 설치하고, 에이전트가 서버 내부의 상태 정보를 수집해 체크하는 방식으로 서버의 리소스 사용량, 디스크 용량 등 세밀한 정보를 수집할 수 있어 정확한 서버 상태 파악이 가능하다. 주로 대규모 서버 환경에서 사용된다.

게임서버개발 주특기 플러스

프로젝트에서 사용할 라이브러리

dotenv : 환경 변수를 파일에 저장해놓고 접근할 수 있게 도와주는 라이브러리.
lodash : 효율적인 계산 툴. 객체, 배열등의 데이터 구조를 간편하게 함수형으로 다룰 수 있고 쉽게 변환하고 쉽게 값을 추출할 수 있게 해줌.
long : 큰 숫자를 처리하게 해주는 라이브러리
=> 프로젝트에서 타임 스탬프를 사용(초 단위로 시간을 나타내는 것)
mysql2 : mysql DB와 연결을 위한 라이브러리
protobufjs : 패킷 구조를 정의할 수 있게 해주는 라이브러리
uuid : 고유한 키 값을 만들어주는 라이브러리

TCP 서버를 만들기 전에 알고 들어가면 좋은 것

  • 네트워크에 대한 전반적인 지식
    • IP
    • TCP /UDP
    • 등....
  • 게임 서버
    • 클라이언트 - 서버 모델
    • 동기화와 상태 관리
    • 통신 방식
  • ★버퍼와 스트림
  • 패킷 처리 및 데이터 전송
    • 패킷의 구조
    • 직렬화와 역직렬화(Serialization & Deserialization)
    • 프로토콜 버퍼 (Protocol Buffers)
  • 레이턴시(지연시간)
    • 개념
    • 성능최적화
    • 레이턴시 마스킹

소켓의 이벤트들

자주 사용되는 이벤트

  • data - 클라이언트로부터 데이터가 수신될 때 발생. 이 이벤트를 통해 받은 데이터 처리 가능.
socket.on('data', (chunk) => {
  console.log('Received data:', chunk.toString());
});

데이터는 버퍼 형태로 제공되고, 이를 문자열로 변환이나 원하는 형식으로 처리 가능. 주로 요청을 처리하거나 응답을 준비할 때 사용.

  • end - 소켓의 다른 쪽에서 FIN 패킷을 보내 데이터 전송이 완료되었음을 나타낼 때 발생. 소켓의 읽기 측면이 닫힘.(연결의 한쪽이 종료된 경우.) => TCP에서 FIN 패킷을 보낸다 = 데이터를 더 보내지 않겠다 = 연결의 끝.
socket.on('end', () => {
  console.log('Connection ended');
});

연결이 정상적으로 종료되었는지 확인 가능. 주로 자원을 정리하거나 로그를 남길때 사용.

  • close - 소켓이 완전히 닫힐 때 발생. 연결의 양쪽 끝이 모두 종료된 경우.
socket.on('close', () => {
  console.log('Socket closed');
});

end이벤트와 달리 양쪽이 모두 닫힘을 의미, 주로 리소스 해제나 후속 작업을 처리할 때 사용.

  • error - 에러가 발생했을 때 발생. 해당 이벤트 이후에 close이벤트가 바로 호출됨.
socket.on('error', (err) => {
  console.error('Socket error:', err);
});

예외 상황을 처리하고 적절한 로그를 남기거나 에러 대응을 할 때 중요.

덜 자주 사용되는 이벤트

  • connect - 소켓 연결이 성공적으로 설정되었을 때 발생. 주로 클라이언트측 소켓에서 사용.
socket.on('connect', () => {
  console.log('Connected to server');
});
  • drain - 쓰기 버퍼가 비워졌을 때 발생. => 더 많은 데이터를 써도 안전함을 의미.
socket.on('drain', () => {
  console.log('Write buffer drained');
});
  • lookup - 호스트 이름을 해결한 후 연결 전에 발생. 주소 패밀리와 주소에 대한 정보 제공.
socket.on('lookup', (err, address, family, host) => {
  console.log(`Address: ${address}, Family: ${family}`);
});
  • ready - 소켓이 사용 준비가 되었을 때 발생.
socket.on('ready', () => {
  console.log('Socket is ready');
});
  • timeout - 소켓이 비활성 상태로 인해 타임아웃 되었을 때 발생. 타임아웃이 설정된 경우에만 관련이 있음.
socket.on('timeout', () => {
  console.log('Socket timeout');
  socket.end();
});

내일 할 것

  • 강의 듣고 프로젝트 완성하고 과제 시작하기.
  • prettier 오류 고치기.

0개의 댓글