그저 내가 되었고

🌟신입 백엔드 개발자 기술 면접 질문&답변(41~50)(작성중) 본문

개발/BE 일반*개발 이야기

🌟신입 백엔드 개발자 기술 면접 질문&답변(41~50)(작성중)

hyuunii 2022. 12. 23. 15:48

Node.js란? Node.js는 Chrome의 V8엔진을 이용하여 javascript로 브라우저가 아니라 서버를 구축하고, 서버에서 JavaScript가 작동되도록 해주는 런타임 환경(플랫폼)

 

41. JS; 깊은 복사와 얕은 복사의 차이는 무엇이고 JS에서 각각을 구현하는 방법은 어떻게 되는지 설명

얕은 복사(shallow copy)는 객체를 복사할 때 복사된 값과 원래값이 같은 참조를 가리키고 있는 것을 말합니다. 
같은 메모리 주소를 참조하기 때문에 해당 메모리 주소의 값이 변경되면 다른 객체의 변수 값 역시 동일하게 변경됩니다.
깊은 복사(deel copy)는 복사된 값이 복사하는 값과 또다른 독립적인 메모리 공간에 할당되는, 객체의 실제 값 복사를 말합니다.
데이터 참조가 아닌 객체 형태를 그대로 복사해서 동일한 객체를 만들어내기 때문에 한 객체가 변경되어도 다른 객체의 데이터에는 영향을 주지 않습니다.
객체를 복사할 때 등호(=)키워드를 사용해서 복사를 하면 얕은 복사가 되어 기존 변수 또한 수정됩니다.
그러므로 JS를 사용할 때 의도적으로 얕은 복사와 깊은 복사를 구분하여 사용할 줄 알아야 합니다.
얕은 복사의 대표적인 예로는 slice()메소드 등등이 있습니다.
slice()메소드는 start부터 end 인덱스까지 기존 배열에서 추출하여 새로운 배열을 리턴하는 이 메소드는, 배열 안에 원시값만 존재할 경우 기본적으로 원시값이 깊은 복사가 이루어지므로 복사를 할 경우 깊은 복사처럼 보이는 결과를 보여줍니다.
그러나 원시값만 갖는 1차원 배열이 아닌 중첩 구조를 갖는 2차원 배열이면 복사를 할 경우 얕은 복사를 수행하게 됩니다.
깊은 복사의 방법으로는 전개연산자(Spread Operation) 등등이 있습니다. 
전개연산자(Spread Operation)은 ES6에서 새로 추가된 JS 문법으로, 닷닷닷(...)을 이용해서 배열이나 객체 형태를 펼칠 수 있게 해줍니다.
그러나 전개연산자를 활용하더라도 두단계 이상의 depth부터는 깊은 복사가 이루어지지 않습니다. 즉, 객체 안에 또다른 객체가 존재한다면 그 내부 객체는 깊은 복사가 되지 않습니다.
이렇게 중첩된 경우에는 JSON을 이용하여 깊은 복사를 할 수 있습니다. 
JSON.stringify를 씌워서 객체를 JSON 문자열로 바꾼 후 JSON.parse를 다시 씌워 JSON문자열을 객체로 바꿔주면 됩니다.
그러나 이 방식은 성능이 느리고 만약 프라퍼티 value가 function이라면 JSON.stringify중 undefined로 처리되므로 역시나 완벽한 deep copy의 방법은 아닙니다.
이 때 손쉽고 정확하게 deep copy를 하기 위해 Lodash 라이브러리의 도움을 받을 수도 있습니다.
(참고: https://wlswoo.tistory.com/38)

 

42. JS; JS의 Passed by Value와 Passed by Reference에 대해 아는 만큼 설명

값에 의한 전달 방식과 참조에 의한 전달 방식은 값을 저장하는 방식과 거의 동일합니다.
또한 값을 저장하는 방식의 이해는 자료형에 대한 이해에 의존합니다.
JS의 자료형은 크게 원시타입과 참조타입으로 나눌 수 있습니다.
원시 타입에는 String, Number, Boolean, null, undefined 등이 있으며, 참조 타입에는 Object, Array, Function 등이 있습니다.
원시 타입 데이터는 변수에 할당될 때 메모리 상에 고정된 크기로 저장이 되며, 해당 변수가 원시 데이터의 값을 보관합니다.
원시 타입 자료형은 변수 초기화, 할당 시 값이 저장된 메모리 영역에 직접 접근합니다. 변수에 새 값이 할당될 때 변수에 할당된 메모리 블록에 저장된 값을 바로 변경하는 것입니다.
반면에 참조 타입 데이터는 크기가 정해져 있지 않고 변수에 할당된 값이 직접 해당 변수에 저장될 수 없으며 변수에는 데이터에 대한 참조(주소)가 저장됩니다.
참조 타입은 변수의 값이 저장된 메모리 블록의 주소를 가지고 있고, JS 엔진이 변수가 가지고 있는 메모리 주소를 이용해서 변수의 값에 접근합니다.
원시타입들은 Passed by Value 방식을 사용해서 변수를 넘겨줍니다. 그러므로 값을 수정해도 원본 데이터에는 영향이 없습니다.
참조타입들은 Passed by Reference방식으로 변수를 넘겨줍니다. 즉 주소 값을 전달하기 때문에 값을 수정하면 원본 데이터 역시 수정됩니다.

 

43. JS; 고차 함수란 무엇인지 설명

고차 함수(高次函數, higher-order function)는 수학과 컴퓨터 과학에서 하나 이상의 함수를 인수로 취하거나 또는 함수를 결과로 반환하는 함수입니다. 다른 모든 함수들은 일차(first order) 함수입니다. 
JS는 함수형 프로그래밍(함수를 다른 함수의 파라미터로 넘길 수도 있고 리턴값으로 함수를 받을 수도 있는 프로그래밍 형태)을 구현한 언어이며, 이때 함수는 일급 객체(1급 객체, First Class Object)입니다.
일급 객체란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킵니다.
예컨대 변수에 할당 가능하다거나 다른 함수를 인자로 전달받는다거나 다른 함수의 결과로서 리턴될 수 있는 것입니다.
즉 함수를 string/number/boolean/array/object와 같은 데이터 다루듯이 다룰 수 있습니다.
그러므로 JS에서 고차함수를 만들 수 있습니다. 
JS 빌트인 고차함수로는 map, filter 등이 있습니다.
(map() 메소듣는 입력으로 들어온 배열 내 모든 엘리먼트를 인자로 제공받는 콜백 함수를 호출함으로써 새로운 배열을 만들어냅니다. filter() 메소드는 콜백 함수에 의해 제공된 테스트를 통과한 모든 엘리먼트를 가진 새로운 배열을 만들어냅니다. 

➜함수 선언식:

function 함수명() {

    로직

}

함수 표현식(유연한 자바스크립트의 특징을 활용한 선언 방식):

var 함수명 = function () {

    로직

};

+ 함수 선언식은 호이스팅 O, 표현식은 X

 

45. Web; JWT에 대해 설명. 구체적으로 JWT를 어디서 처리하는지, 어떠한 방식으로 검증하는지, 재발급 방식과 주기는 어떻게 처리하는지, 다른 API 서비스 호출시 어떻게 잡아서 인증 처리하는지

JWT(JSON Web Token)란 인증에 필요한 정보들을 암호화시킨 JSON 토큰을 의미합니다.
토큰은 세션과는 달리 서버가 아닌 클라이언트에 저장되기 때문에 메모리나 스토리지 등을 통해 세션을 관리했던 서버의 부담을 덜 수 있습니다.
이때 JWT(Acceess Token)를 HTTP 헤더에 실어 보내는 방식으로 서버가 클라이언트를 식별합니다.
일반적으로 JWT를 이용하는 순서는 가장 먼저로써 클라이언트 사용자가 아이디, 패스워드를 통해 웹서비스를 인증한 후 서버에서 서명된 JWT를 생성하여 클라이언트에 응답으로 돌려줍니다. 이후 클라이언트가 서버에 추가적인 데이터를 요구할 때 JWT를 HTTP Header에 실어 보냅니다. 서버에서는 클라이언트로부터 온 JWT를 검증 후 완료되면 요청한 응답을 돌려줍니다.
따라서 사용자가 JWT를 서버로 전송하면 서버는 서명을 검증하는 과정을 거치게 되며 검증이 완료되면 요청한 응답을 돌려줍니다.
이때 Access Token만을 통한 인증 방식을 사용한다면 만약 해당 토큰이 제3자에게 탈취당할 경우 보안에 취약하다는 문제가 있습니다.
그러나 JWT는 발급 후 삭제가 불가능하므로 접근에 관여하는 토큰에 유효시간을 부여하는식으로 탈취 문제에 대응 해야 합니다.
토큰의 유효기간을 짧게 하면서 효과적인 방법은 Refresh Token을 함께 사용하는 것입니다.
로그인시 Access Token과 Refresh Token을 함께 발급하고, Access Token이 만료되면 사용자는 Refresh Token과 Access Token을 함께 서버로 보냅니다. 서버는 Access Token 조작여부를 체크하고 Refresh Token과 미리 저장해놓은 사용자 DB의 Refresh Token을 비교하여 두 개가 동일하고 유효기간도 남아있다면 새로운 Access Token을 발급해줍니다.
다른 API에서 호출시에는 req header에 Authorization 값으로 Bearer를 명시하여 JWT를 넣고 인증처리를 합니다.

 

47. Node.js; Node.js는 싱글 쓰레드 기반 JS 런타임. 이에 대해 아는 만큼 설명

 

 

48. Node.js; Node.js는 non-blocking, asynchronous 기반 JS 런타임. 이에 대해 아는 만큼 설명

 

 

49. Node.js; Node.js의 이벤트 루프란 무엇이고 왜 필요하며 어떻게 작동하는지 아는 만큼 설명

 

 

50. JS; 트랜스파일러와 번들러에 대해 설명