그저 내가 되었고

🌟신입 백엔드 개발자 기술 면접 질문&답변(11~20) 본문

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

🌟신입 백엔드 개발자 기술 면접 질문&답변(11~20)

hyuunii 2022. 12. 20. 23:55

11. JS; 🔥async/await 설명

async와 await은 자바스크립트의 비동기 처리 패턴 중 가장 최근에 등장한 문법입니다. 기존의 비동기 처리 방식인 콜백함수와 프라미스의 단점을 보완하고 직관적인 코드를 작성할 수 있게 도와줍니다.
async 키워드를 함수 선언할 때 붙여주면 자동으로 Promise객체로 인식되며, return값은 resolve()값이 되어 비동기 작업을 쉽게 만들 수 있습니다.
await은 비동기로 처리되는 부분 앞에 붙여주면 됩니다. 그러면 프라미스가 처리될 때까지 기다립니다. 그리고 프라미스 처리가 완료되어 resolve되면 값만 따로 추출해서 리턴합니다.
그러나 async/await이 Promise를 완벽히 대체하는 것은 아닙니다. 비동기는 Promise객체로 처리하고 async/await은 비동기를 동기식으로 처리하는 기법입니다.
(참고: https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-%EB%B9%84%EB%8F%99%EA%B8%B0%EC%B2%98%EB%A6%AC-async-await)

 

12. JS; Arrow function 설명

function이라는 키워드 없이 화살표 기호(=>)를 이용해 함수를 생성하는 ES6 문법입니다. 
함수 본연의 입출력기능을 아주 잘 표현하는 문법입니다.
또한 파라미터가 하나라면 소괄호 생략이 가능하며, 
출력 부분의 중괄호 안에 return 한 줄 뿐이라면 중괄호와 return 역시 생략이 가능합니다.
화살표 함수를 사용하면 내부에서 this 값을 쓸 때, 밖에 있던 this 값을 그대로 사용합니다.
함수를 쓸 때 원래대로라면 함수가 쓰인 위치에 따라서 내부의 this 값이 계속 변합니다.
그러나 화살표 함수는 어디서 쓰든간에 내부의 this값이 변하지 않습니다. 그러므로 바깥에 있던 this의 의미를 그대로 내부에서도 사용합니다.
이는 항상 장점이지는 않습니다. 내가 예측하던 this값과 달라질 수도 있으니 단점이 될 수도 있습니다.
이렇게 일반 function과 용도가 완전히 같지는 않기 때문에 일반 functiong을 항상 대체할 수 있는 문법은 아닙니다.
(참고: https://codingapple.com/unit/es6-3-arrow-function-why/)

 

13. JS; ==와 ===연산자의 차이 설명

==는 Equal Operator이고 ===는 Strict Equal Operator입니다.
equal operator은 값만 같으면 true를 반환하며, strict equal operator은 값과 data type 모두 같아야 true를 반환합니다.
예컨대 기본 자료형(primitive)의 경우, data type이 숫자인 1과 문자열인 1은 값은 같지만 data type은 다르기 때문에
equal operator에서는 true, strict equal operator에서는 false를 반환합니다.
null과 undefined는 둘 모두 값이 없음을 뜻하지만, 값의 종류는 다르기 때문에 equal operator에서는 true, strict equal operator에서는 false를 반환합니다.
배열, 객체 등의 경우는 조금 다릅니다.
array나 object 두 개를 비교할 경우, 그 안의 property가 전부 같더라도 각각의 array나 object를 할당하는 각 변수가 메모리의 다른 주소를 참조하기 때문에 equal operator과 strict equal operator 모두 false를 반환합니다.

 

15. Node.js; Express란 무엇이고 왜 필요하며 대안은 무엇이 있는지 설명

Node.js를 위한 백엔드 프레임워크중 하나로, MIT 허가서로 라이선스되는 자유-오픈소스 소프트웨어입니다.(이때 MIT 허가서에는 수정, 배포가 자유로우며 실무 혹은 상업적으로 이용해도 되지만, 이 소스로 인한 피해는 전적으로 사용자가 감수해야 됨이 적힌 소프트웨어 라이선스입니다)
웹 어플리케이션, API 개발을 위해 설계되었으며, 그 가운데 필요한 각종 라이브러리와 미들웨어 등이 내장되어 있어 개발하기 편하고 개발 규칙을 강제하여 코드 및 구조의 통일성을 향상시킬 수 있습니다.
사실상 Node.js의 표준 서버 프레임워크로 불릴만큼 많은 곳에서 사용하고 있습니다.
대안으로 Koa 등이 차세대 프레임워크로 떠오르고 있습니다. 또한 Express를 기본으로 채택하여 JS 뿐만 아닌 TS를 완벽하게 지원하는 NestJS 또한 효율성, 안정성, 확장성 측면에서 환영받고 있습니다. 

 

16. Node.js; npm이란 무엇인지 설명

Node Package Manager은 Node.js로 만들어진 패키지를 관리해주는 틀입니다. 패키지는 모듈이라고도 불리는데 이들은 프로그램보다는 조금 작은 단위의 기능들을 의미합니다.
이름처럼 npm은 Node.js로 만들어진 모듈을 웹에서 받아서 설치하고 관리해주는 프로그램입니다. 이를 이용해 좀 더 효율적으로 서버를 구축할 수 있습니다.
일반적으로 프로젝트에서 Express, dotenv, Nodemon, cors 등등의 다양한 패키지를 사용하는것이 일반적이며, 또한 패키지들의 버전 업데이트가 빈번하게 이루어지므로 프로젝트가 의존하고있는 패키지들이 관리될 필요가 있습니다.
npm에서는 package.json 파일로 프로젝트의 정보와 패키지들의 의존성을 관리합니다. 이때 의존성이란 모듈이 다른 모듈을 사용할 수 있는 것처럼, 패키지도 다른 패키지를 사용할 수 있기 때문에 생겨납니다.
package.json은 npm init을 하여 npm을 사용하는 초기 환경을 설정하면 자동으로 생성됩니다.
(참고: https://poiemaweb.com/nodejs-npm)

 

17. Web?; 사용자 패스워드를 전송하고 보관하는 방법 설명

첫째로 개인정보의 암호화는 법률로 지정되어 있습니다.
그러므로 개발자는 이를 안전하게 보관하여야 하며, 특별한 처리를 하여 만약 개인정보가 저장된 DB가 해킹되더라도 중요한 정보를 해독하지 못하도록 해야합니다.
이를 위해서 '단방향 해싱'이라는 방법을 사용할 수 있습니다.
해싱은 어떠한 수학적 연산 또는 알고리즘에 의해 원본 데이터와는 완전히 다르게 암호화된 데이터 즉 다이제스트로 변환시키는 것이며, 단방향이기에 누구도 원본 데이터를 구할 수 없습니다. 이를 개발한 개발자 역시 복호화 할 수 없다는 뜻입니다.
그러나 동일한 값은 동일한 다이제스트를 가진다는 단점이 있습니다. 이를 보완하기 위해 salt를 활용할 수 있는데요, 원문 패스워드에 임의의 문자열을 추가하여 해싱하는 방법으로 같은 패스워드임에도 다른 다이제스트가 도출된다는 특징이 있습니다.

 

19. Algorithm; 포트폴리오에서 시간복잡도를 낮춘 사례가 있다면 설명

특별한 사례는 없습니다. 중첩 루프는 사용하게되면 Big-O 표기법에 따라 시간복잡도가 O(n^중첩 횟수)가 되므로 는 사용하지 않는다던지, 가능한 루프를 적게 사용한다든지 등으로 시간복잡도를 낮추려 했지만 성과가 두드러지진 않는다고 생각됩니다.
(참고_루프: https://hoon-in-seoul.tistory.com/67)

추가+

알고리즘이란

  • 어떤 목적을 달성하거나 결과물을 만들어내기 위해 거쳐야 하는 일련의 과정들을 의미
  • 목적지로 가는 루트는 다양하며 여러가지 상황에 따른 알고리즘은 모두 다르다. 따라서 시간복잡도가 가장 낮은 알고리즘을 선택하여 사용한다.
  • 즉 효율적인 알고리즘이란, 입력값이 커짐에 따라 증가하는 시간의 비율을 최소화한 알고리즘 을 구성했다는 것이다.

 

20. Web; 웹 서버란 무엇인지 NGiNX와 Apache를 비교하여 설명

웹서버는 웹브라우저와 같은 클라이언트로부터 HTTP request를 받아들이고, 그림/CSS/JS를 포함한 html 문서와 같은 웹 페이지를 응답하는 컴퓨터 프로그램입니다.
이때 이용되는 웹서버에 해당하는것이 Apache와 NGiNX 등입니다.
NGiNX는 Apache의 웹 서버 성능 제한을 해결하기 위해 대용량 트래픽을 처리를 목적으로 등장하였으며, 가벼움과 높은 성능을 목표로 하는 경량 웹 서버입니다. 
NGiNX는 이벤트 중심 접근 방식으로 하나의 스레드 내에서 여러 요청을 처리합니다. 코어 모듈이 Apache보다 적은 리소스로도 많은 트래픽을 효율적으로 처리 가능하게 만들어졌습니다.
Apache는 프로세스 기반 접근 방식으로 하나의 스레드가 하나의 요청을 처리합니다. 매 요청마다 스레드를 생성 및 할당해야 하기 때문에 리소스를 많이 잡아먹습니다. 그러나 다양한 OS에서 안정적 사용이 가능하며, 모듈을 추가할 수 있는 확장성이 있습니다.
(참고: https://ssdragon.tistory.com/60)