ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • nodejs backend 면접 질문 정리
    공부하기/node.js 2023. 1. 18. 11:41
    • Node.js 서버를 사용하는 이유
      • 논블로킹i/o와 단일 스레드 이벤트 루프를 통한 높은 처리 성능
      • 개발자라면 누구나 알고 있는 자바스크립트로 서버 개발 가능
    • 논블로킹i/o 
      • 일단 요청을 전부 다 받는다.
      • 그 다음 처리 속도가 빠른것부터 빨리 처리한다.
      • 먼저 도착하든 말든 상관하지 않는다.
      • 서버는 중간에 요청을 받는것을 멈추지 않는다.
      • 요청이 굉장히 많은 서비스의 경우 유리하다.
      • 주로 웹 서비스를 만드는데 많이 사용한다.
      • 이미지처리 또는 수학적 계산이 많이 들어간 서버로는 적합하지 않다.
    • 이벤트루프 : 콜백 큐에 할당된 함수를 순서에 맞춰 콜 스택에 할당해준다.
      • 메모리 힙 : 구조화 되지 않은 저장 공간, 우리가 선언한 변수등이 저장된다.
      • 콜 스택 : 자바스크립트는 인터프리터 언어로 한 줄 단위로 코드를 읽고 실행하는데 실행될 코드의 한 줄 단위로 할당된다.
        • 호출 스택으로 동기적 작업을 담당 비동기 작업이 없다면 콜 스택만으로 동작시킬 수 있다.
        • 호출이 될 때 콜 스택에 담김 -> 호출된 작업 단위가 담기고 실행은 아님
        • 스택의 가장 윗 부분부터 실행되면서 빠져나간다.
      • 콜백 큐 : 비동기 처리가 끝난 후 실행되어야 할 콜백 함수가 차례로 할당된다. 
      • 실행과정 설명
        • 실행파일과 각각의 실행단위가 콜스택에 쌓인다.
        • 동기처리는 실행됨과 동시에 콜스택을 빠져나가고 비동기 작업은 조건이 만족할 때까지 백그라운드에서 대기한다.
        • 조건이 완료된 비동기 작업은 콜백 큐로 이동한다.
        • 콜백 큐는 taskQueue, microtaskQueue, animationQueue등이 존재하고 각각 구성 큐마다 우선순위가 존재한다.
        • 비동기 처리 작업은 콜백 큐 내부에 존재하는 여러개의 큐중 하나에 쌓이고 콜 스택이 비었을경우 우선순위대로 콜스택에 쌓여 작업이 실행된다.

     


    • 관계형 데이터베이스
      • mysql
        • sql에 기반을 둔 관계형 DBMS 중 하나
        • 무료였으나,,, 현재는 유료
        • 리눅스, 유닉스, 윈도우 등 거의 모든 운영체제에서 사용가능
        • 처리 속도가 상당히 빠르고 대용량에 데이터도 처리 용이
        • 설치 방법이 쉽고 초보자도 익히기 쉽다.
        • 보안성이 좋다
      • oracle -> 관심이 없어서 정리 x 물어보면 모른다고 할거임
      • mariadb 
        • 무료
        • mysql과 거의 비슷
      • postgresql
        • 대용량 데이터 처리를 위한 기능이 구현되어 있음
        • 보안을 위해 데이터 암호화, 접근 제어, 접근 감시 3가지로 구성이 되어있음
        • 스크립트 언어 지원이 가능
        • 신뢰성과 안정성이 매우 높다.
        • 무료
        • 업데이트가 자주 일어나면 성능이 불안정 하다고 함
        • 복잡한 쿼리를 요구할 때 사용하기 좋다
        • 대용량 운영이 편하고 빠르다
        • json 및 xml 지원
        • nosql 지원 기능
        • 병령처리 지원
        • partial index 지원
        • json 인뎅식 지원
        • 오픈 소스 데이터베이스

    nest.js

     

    • 내가 nestJs를 사용한 이유
      • 내가 프로젝트 구조를 짜지 않아도 기본적으로 훌룡한 구조를 갖고 있다.
      • 여러명이 협업하는데 이미 짜여진 구조가 있는 프레임 워크와 보편적인 기능이 이미 구현되어 있기 때문에 개발이 빠르다.
      • 협업하는 과정에서 모듈 단위로 github branch를 나눠 작업하고 merge하기 편하다.
      • spring과 비슷한 구조이기 때문에 개발자가 뽑히지 않을 경우 스프링 개발자를 뽑아서 nestJs에 바로 투입할 수 있다.
      • 여러명이서 작업하는 경우 서로의 코드 스타일이 다르기 때문에 큰 혼동이 발생할 수 있는데 어느정도 그 부분을 완화할 수 있다.
    • 프로바이더는 무엇? : 의존성 주입의 대상이다
      • 의존성 주입이란? 내가 직접 필요한 클래스를 생성하는 것이 아닌 애플리케이션이 상황과 선언한 클래스 타입에 따라 알아서 넣어줌
      • 의존성 주입의 핵심은 ? 추상과 구현이 분리되므로 코드가 유연해지고 테스트하기에도 용이해진다.
      • @Inject 데코레이터를 통해 유연하게 di 를 조절할 수 있다 ( 큰 장점이라고 하더라구요,,, )

     


    typeorm

     

    • orm( Object Relational Mapping )이란 무엇인가?
      • 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는것
      • 작은 서비스에서 필요한 대부분의 sql문이 자바스크립트 함수형으로 내장되어 있음
      • 이로 인해 개발자는 비즈니스 로직에 집중할 수 있음
      • 내장되어 있는 함수를 사용하기 때문에 새로운 sql을 선언하지 않고 코드를 재사용함
      • 데이터베이스 교체 작업이 필요한 경우 orm의 type이 바뀌는것 뿐 비교적 간단하게 데이터베이스를 교체할 수 있음
    • active record pattern이란?
      • typeorm에 내장된 BaseEntity를 상속받아 내장된 sql 기능들을 해당 엔티티에서 바로 사용하는 것
    • data mapper pattern이란?
      • 레파지토리라는 클래스에 필요한 모든 쿼리 메서드를 정의
    • 시퀄라이즈, 타입오알엠, 프리즈마 중 왜 타입 오알엠?
      • 프리즈마는 솔직히 있는지도 몰랐음
      • 원래 orm은 시퀄라이즈로 시작했으나 공식 문서와 예제등 그대로 적용해도 작동하지 않는 문제를 여러번 겪고
      • 결국 스택오버플로 같은 사이트에 의존해서 개발을 진행하다보니 다른 orm을 찾게 됌
      • typeorm은 공식문서도 너무 잘 되어 있어서 구지 다른 사이트를 참고할 이유가 없음
      • 내가 느끼기에는 타입오알엠이 더 쉬웠음
      • 실행 속도가 평균적으로 typeorm이 더 빠르다는 글을 본적이 있음

     


     

    • graphql 면접에 대한 내 생각 정리
      • 사용 이유
        • 원하는 프로퍼티만 선택해서 받을 수 있음
        • swagger 문서를 만들어보면 알겠지만 생각보다 오래걸림, graphql은 문서를 자동으로 생성해준다.
      • 특징
        • endpoint가 하나밖에 없다.
        • 한번에 요청에 필요한 데이터를 전부 불러올 수 있다.
      • 구현 -> apollo ( graphql 사용을 도와주는 라이브러리 )

     

    • 나 자신이 의사소통이 활발하다고 생각하는 점
      • 일상 생활의 대화가 아닌 업부에 있어서 효율적인 방법이 있다면 적극적으로 어필하는 편
      • 내 일이 늘어나도 프로젝트 전체적으로 이득이 되는 작업이라면 타 직군들에게 이야기하고 야근하는 편
      • 문제가 발생했을 경우 확실하게 전달하고 대처방법까지 생각해서 전달하는 편
      • 회사가 나아가고 있는 방향에 걸맞는 기술 스택이 존재하는 경우 어필하는 편
    • 타직무와의 협업 경험
      • 프론트엔드 개발을 진행할 당시에는 의뢰 회사의 CTO node.js 백엔드 개발자분과 서로 소통하며 프론트엔드 개발을 마무리 했음
      • 처음 백엔드를 개발할 당시 풀스택으로 개발을 진행했고 같은 회사의 프론트엔드 개발자분과 서로 업부를 분담하고 프론트엔드부터 백엔드 배포까지 진행했음
      • 백엔드 팀을 이뤄 3~4명이서 한개의 프로젝트를 개발한 경험도 있음
    • ERD 설계 경험
      • 데이터베이스 스키마를 먼저 구글 시트에 정의해두고
      • 필요한 스키마를 전부 정의한 이후 조인 관계를 생각하고 구글 시트에 조인 관계 컬럼들을 업데이트한 후 
      • 구글 시트에 명시한 스키마 데이터를 orm의 엔티티로 정의하면서 작업을 진행했음

    aws 사용경험

     

    • aws-rds 
      • 거의 대부분의 프로젝트에 t4.micro, t4.small 데이터베이스를 사용
      • 퍼블릭 엑세스를 허용하고, 자동백업, 스냅샷같은 기능은 사용하지 않음
      • 실제 운영이 아닌 개발용으로 사용했기 때문에 모니터링또한 하지 않음
    • aws-s3 & aws-cloud-front
      • s3를 이미지 또는 비디오 저장소로 사용
      • s3와 cloud-front를 연결해서 유저가 직접 s3에 접근할 수 없도록 함
      • cloud-front를 통해 url, 쿠키, ip등 접근을 제한할 수 있음
      • cloud-front는 캐싱 기능을 지원하여 첫번째 요청 이후 요청들이 현저하게 빠름
    • aws-ec2 (우분투)
      • 배포 서버로 사용
      • nginx 적용
      • 무료 ssl 적용 (crontab 명령으로 3개월에 한번씩 인증서 갱신)
      • jenkins와 github를 연동
    • aws-eb (우분투)
      • 배포 서버로 사용
      • 기본적으로 nginx가 적용되어 있음
      • git-actions와 연동해서 ci/cd 구축
      • 로드벨런싱, 스케일 업, 스케일 아웃, 모니터링, 로그 확인등, 보편적인 기능을 쉽게 사용할 수 있음

    typescript

    • 컴파일시간이 조금 거리더라도 안정성을 보장한다.
    • 자동 완성기능이 존재해 편함
    • 에러 캐칭이 편함

    TDD

    경험이 아에 없어서 잘 모름


    성능개선

     

    ->

    비슷한 경험으로 아트룸즈라는 프로젝트에서 relation된 테이블의 갯수가 많을 경우 쿼리가 심각하게 느려지는 경우가 발생했었음

    이때 여러개의 조인을 한개의 쿼리로 요청하는것이 아닌 2~4개로 분해하여 쿼리를 요청했고 그 결과 api 속도가 100배 이상 차이나는걸 경험한 적이 있음

     


     

    회사에 할 질문 정리

    • nodejs를 사용하여 서버를 개발한 이유는?
    • 회사가 nestjs를 사용한 이유는?
    • 회사에 개발자는 몇명이고 백엔드 개발자는 몇명인지?(연차는?)
    • 사내 디자이너, 기획자님이 존재하는지? (연차는?)
    • 면접관님이 생각하시는 클린 코드는 무엇인가요?
    • 회사의 업무 난이도 및 업무량의 정도를 1~10으로 따지면 몇정도인가요?
Designed by Tistory.