기-억하기 위해 기-록을

Node와 Express 공부 정리 본문

카테고리 없음

Node와 Express 공부 정리

seopark 2021. 5. 13. 23:33

express : 노드용 라이브러리

익스프레스는 기존 라이브러리들이 여러 기능을 한데 모아놓은 형태를 취한 것과 달리 모듈 개념을 적극 채용해 딱 필요한 요소만 가져다 사용하는 방식으로 쓰이고 있음

불필요한 기능이 없으므로 가볍고, 문제가 생겼을 때도 훨씬 쉽게 원인을 찾을 수 있다는 장점

 

서버 사이드 애플리케이션 : 애플리케이션의 페이지를 서버에서 HTML,CSS, 이미지, 멀티미디어 자원, 자바스크립트 등을 결합, 즉 렌더링해서 클라이언트에 전송

클라이언트 사이드 애플리케이션 : 사용자 인터페이스를 클라이언트에서 렌더링하는 것

 

전통적인 웹 서버와 노드의 차이점 중 노드는 싱글 스레드를 사용한다는 점이 중요함

단일 스레드는 웹 앱을 만드는 작업을 단순화하며 앱에서 멀티 스레드 성능이 필요하다면 노드 인스턴스를 늘리기만 해도 멀티 스레드의 성능을 누릴 수 있음

 

노드는 완전히 플랫폼 독립적임

노드는 윈도우나 맥OS, 리눅스 같은 주요 운영체제에 쉽게 설치가 가능하며 협업하기도 쉬움

 

노드 설치 

LTS : 오랫동안 지원되는 버전

현재 버전은 최근 기능을 포함하고 있고 성능이 조금 더 개선된 버전

 

npm은 노드 패키지를 위한 패키지 매니저

패키지를 설치하고 의존성을 관리

 

npm install -g nodemon

nodemon : 소스 코드를 수정했을 때 자동으로 노드 프로그램을 재시작하는 유틸리티

-g : 패키지를 전역으로 설치하라는 의미, 시스템 전체에서 해당 패키지를 사용할 수 있음

 

nodemon 같은 자바스크립트 유틸리티는 일반적으로 전역으로 설치하고,

특정 웹 앱이나 프로젝트에서만 사용하는 패키지는 전역으로 설치하지 않음

 

node --version

컴퓨터에 설치된 노드 버전 확인

 

localhost

로컬 호스트는 보통 IPv4 루프백 주소 127.0.0.1이나 IPv6 루프백 주소 ::1 별칭으로 쓰임

다만 SSH 등을 사용하여 원격 컴퓨터에 접속했다면, localhost로 그 컴퓨터에 연결할 수 없음

 

http.createServer 메서드는 함수를 매개변수로 받음

그리고 HTTP 요청이 일어날 때마다 이 함수를 호출함

 

라우팅 routing

클라이언트가 요청한 콘텐츠를 전송하는 메커니즘

 

fs.readFile() 

파일을 비동기적으로 읽는 메서드

콜백이라고 부르는 패턴 사용

함수를 호출할 때 콜백 함수를 전달하면, 함수가 실행을 마쳤을 때 콜백 함수가 호출됨

 

fs.readFileSync()

파일을 동기적으로 읽는 메서드

 

app.METHOD

METHOD는 HTTP 동사(get 또는 post)가 들어감

이 메서드는 대소문자를 구분하지 않으며 경로 끝에 슬래시가 있든 없든 똑같이 동작하고 쿼리스트링도 무시함

 

익스프레스에서는 라우트와 미들웨어의 순서가 중요

 

사용자가 보는 것을 책임지는 부분

이미지나 CSS 파일 같은 정적 자원과 다르며 정적일 필요가 없음

각 요청에 따라 즉석에서 변할 수 있음

 

static

static 미들웨어는 하나 이상 디렉터리를 지정해서 이 디렉터리에 정적 자원 보관하고 아무런 변화 없이 클라이언트에 바로 전송함

전송하려는 정적 파일 각각에 파일을 렌더링하고 클라이언트에 반환하는 라우트를 지정한 것과 효과가 같음

 

버전 관리

  • 문서화
  • 어떤 결정을 내렸고 어떤 순서로 구성 요소를 개발했는지 확인 
  • 프로젝트 역사를 파악 
  • 작성자
  • 누가 무엇을 만들었는가
  • 코드에 주석을 읽고도 이해되지 않는 경우 본인에게 물어볼 수 있음
  • 실험
  • 프로젝트의 안정성이 떨어질 것을 걱정하지 않고 새로운 것을 시도 가능
  • 실험이 성공적 -> 반영     실패 ->철수

 

코어 모듈

node_modules에 설치되는 모듈이 아닌 이외의 모듈

fs, http, os, path 등 노드가 제공하는 코어 모듈이 존재함

 

exports

전역 변수

모듈 바깥에서 모듈에 있는 내용을 보기 위해서는 반드시 exports를 사용해야함

 

캡슐화 원칙을 지키면 잠재적인 오류나 취약한 코드를 피하기 쉬워짐



  • 버전관리 사용하면 소프트웨어 개발이 안전하고 예측 가능하게 됨
  • 모듈화는 소프트웨어의 복잡함을 관리할 수 있는 중요한 테크닉



단위 테스트

애플리케이션에 존재하는 가장 작은 기능 단위, 보통 함수를 테스트

 

통합 테스트

더 큰 기능 단위를 테스트

애플리케이션의 함수, 모듈, 서브시스템 등이 대상

 

린트

존재하는 오류가 아닌 잠재적인 오류를 찾는 작업

 

프로토콜

요청을 어떻게 전송할지 결정

http, https, file, ftp 등

 

호스트

로컬 컴퓨터나 로컬 네트워크에 있는 서버를 한 단어 또는 숫자 형태의 IP 주소로 표현

호스트 이름 앞에 서브도메인이 있을 수 있으며 서브도메인은 옵션

 

포트

각 서버에는 숫자 형태의 포트 존재

HTTP 에서는 80

HTTPS는 443 으로 간주

한 서버에서 포트 번호를 중복으로 사용할 수 없으므로 널리 사용되는 포트 번호를 선택했을 경우 변경해야하는 상황이 올 수 있음

 

경로

URL 부분

경로를 통해 유일하게 식별할 수 있어야 함

 

쿼리스트링

이름-값 쌍의 컬렉션이며 옵션

물음표(?) 기호로 시작하고 이름-값 쌍은 & 기호로 구분

이름과 값은 모두 URL 인코드 사용해야함

 

해시

서버로 전송되지 않으며 브라우저에서만 사용

단일 페이지 애플리케이션은 해시를 애플리케이션 내부의 내비게이션 용도로 사용

 

브라우저는 서버와 통신할 때 GET과 POST 메서드를 우선 사용

Content-Type 헤더

타입, 서브타입, 옵션인 매개변수로 구성된 인터넷 미디어 타입

 

요청 객체

http.IncomingMessage의 인스턴스로 시작

요청 핸들러의 첫 번째 매개변수로 전달

 

req.params

이름 붙은 라우트 매개변수가 담긴 배열

 

req.query

이름-값 쌍 형태인 쿼리스트링 매개변수(=GET 매개변수)를 담은 객체

 

req.body

POST 매개변수를 담은 객체

req.body를 사용하려면 바디 콘텐츠 타입을 분석할 수 있는 미들웨어가 필요

 

req.route

현재 일치하는 라우트에 관한 정보

 

req.path

요청의 경로 URL에서 프로토콜, 호스트, 포트, 쿼리스트링을 제외한 값



응답 객체

http.ServerResponse의 인스턴스

요청 핸들러의 두 번째 매개변수로 사용

 

res.state(code)

HTTP 상태 코드 설정

200(OK), 404(Not Found), 500(Server Error) ..

 

res.redirect([status],url)

브라우저를 리다이렉트함

기본 리다이렉트 코드는 302

 

res.send(body)

클라이언트에 응답 보냄

 

res.end()

응답 보내지 않고 연결 끊음

 

템플릿 엔진

  • 성능

가능하면 빠른 템플릿 엔진 선택 -> 템플릿 엔진으로 인해 웹사이트가 느려지는 것은 막아야 함

  • 클라이언트용, 서버용 혹은 겸용

템플릿 엔진은 서버와 클라이언트 양쪽에서 사용 가능하며 기능 차이가 없는 엔진을 고르는 것이 좋음

  • 추상화 수준



핸들바

프론트엔드와 백엔드 양쪽에서 자바스크립트와 쉽게 통합 가능, 익숙한 문법 사용 가능

 

템플릿을 렌더링할 때는 템플릿 엔진에 콘텍스트 객체를 전달하며 이를 통해 템플릿에 데이터를 삽입함

 

주석

{{! 절대 비밀인 주석}}

<!-- 알려져도 상관 없는 주석 -->

 

서버 사이드 템플릿

HTML 완성 후 클라이언트에 전송

프로그램 구성 정보를 숨기는 효과 외에도 템플릿 캐싱이 가능하므로 성능을 올릴 수 있음



HTTPS를 사용하지 않으면 침입자는 GET 요청의 쿼리스트링을 보는 것과 마찬가지로 쉽게 POST 요청의 바디를 볼 수 있음

HTTP 요청에는 서버에서 그 요청을 수행할 때 필요한 정보가 모두 들어 있다는 뜻

 

  • 사용자가 쿠키 내용을 볼 수 있음
  • 사용자가 쿠키를 삭제하거나 금지할 수 있음
  • 일반적인 쿠키는 변조될 수 있음
  • 쿠키는 공격에 사용될 수 있음
  • 쿠키를 남용하면 사용자가 눈치챔
  • 가급적 쿠키보다 세션을 사용

 

미들웨어

애플리케이션으로 들어오는 HTTP 요청 위에서 동작하는 기능을 캡슐화하는 방법

파이프라인 안에서 실행

next()를 호출하지 않으면 요청은 해당 미들웨어에서 종료됨