-
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 인뎅식 지원
- 오픈 소스 데이터베이스
- mysql
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으로 따지면 몇정도인가요?
'공부하기 > node.js' 카테고리의 다른 글
1. NestJs & Git Actions CI/CD - [ git actions 추가 ] (0) 2023.01.31 NestJs 설문조사 미니 프로젝트 (0) 2023.01.31 typeorm 기본 구조 만들기 (5) - swagger (0) 2022.01.24 typeorm 기본 구조 만들기 (4) - auth,jwt (0) 2022.01.24 typeorm 기본 구조 만들기 (3) - repository, service, controller (0) 2022.01.24 - Node.js 서버를 사용하는 이유