Node Package Manager
노드 플젝을 관리하는 필수 도구
npm init
프로젝트 디렉터리 생성 후 사용하면 package.json 파일 생성하고, Node.js 프로젝트로 만들어준다.
npm install
node_modules
는 용량이 커서 코드 관리나 배포 시에 업로드하지 않는다.
해당 명령어를 사용하면 package.json
의 dependecies
를 보고 다운 받는다.
--production
을 붙이면 devDependencies
를 제외하고 내려받는다.--global
을 붙이면 전역 패키지 디렉터리에 내려받아 전역 패키지로 추가해서 사용 가능 → 명시되지 않는 것. 명시되는 것이 더 좋다.npm remove
의존성 패키지를 삭제할 수 있다. 정보와 modules에서도 사라진다.
스크립트 실행하기
간단한 동작을 수행하는 코드로, package.json
의 scipts에 선언된 스크립트를 npm run [script-name]
명령어로 실행할 수 있음
test
, start
, stop
도 사용할 수 있는 스크립트. npm이 내부에 코드를 제공하는 것은 아니다.package.json
key와 value로 이루저여, 프로젝트에 대한 정보가 저장돼있다.
package-lock.json
프로젝트에 의존성을 추가시 해당 파일 생성됨
자동으로 최신버전을 추가하는데, 의존성 버전이 갑자기 변경되지 않도록 설치된 버전을 고정함
의존성 관리 dependencies
프로젝트 내 라이브러리를 관리 하는 법. 여기에 의존하기에 의존성이라고 한다.
npm install
프로젝트 의존상 관리. 사용법에 따라 여러 용도로 사용할 수 있다. package.json
의 dependencies
안에 추가 되고, node_modules
디렉터리에 저장된다. 개발 의존성을 분리 할 수 있다. 배포 전까지만 사용하는 의존성. devDependencies
에 추가됨npm install [pkg-name]@[version]
라이브러리
특정 기능을 수행하는 코드의 묶음. 다른 사람이 구현한 것을 사용하는 방법
npm 패키지를 설치하지 않고 사용할 수 있는 도구. 한번씩 사용하고 마는 것에 사용 함
Node.js의 특정 버전을 사용하여 실행할 수 있음. 버전 별 실행환경을 확인시 유용
간단한 코드 조각인 gist를 다운 받지 않고 실행할 수 있다.
복잡해질 수록 기능에 맞게 코드를 분리하는 것이 중요하다.
모듈은 코드를 분리하기 위한 방법이다. → 반복되는 코드는 모듈을 분리하기
console
디버깅 도구, 로그 레벨 표시와 시간 추적 가능
process
현재 실행 프로스세스 관련 기능 제공
arch, argv, env 등 실행 환경 및 변수, abort, kill, exit 등 프로세스 동작 관련 함수 제공
fs
파일 입출력을 하기 위해 사용.
readFile, writeFile 함수로 파일 읽기, 쓰기, -Sync 함수 제공 등 동기 동작
watch로 파일/디렉터리 변경 이벤트 감지 → 콜백을 제공한다.
http
http 서버, 클라이언트를 위해 사용
createServer → 서버 생성 / Request 함수로 http 요청 생성
이외 다양하게 있다.
기본
module.exports = {
name,
age,
nationality
};
모듈이 load될 때 사용될 값을 module.exports
로 내보낸다.
변수명으로 export
exports.name = name;
exports.age = age;
모듈을 object로 만들고, 각 key-value를 지정하여 내보낸다.
함수를 export
module.exports = (name,age,nationality) =>{
return {
name,
age,
nationality
};
}
모듈 사용시에 값을 정하여 내보낸다.
require
함수를 통해 모듈을 로드함
의존성 패키지, 직접 작성한 모듈 모두 사용 가능
⭐️ require 동작의 이해
require시 모듈 코드가 실행된다.
첫 require시 cache되어 이후에 다른 파일에서 require해도 캐시된 걸 이용한다.
모듈 코드를 여러 번 실행하기 위해선 함수 모듈로 작성해야 한다.
node_modules
에 내려받아져 있어야 한다.인터넷 상에서 동작하는 모든 서비스. 웹브라우저로 접속해서 이용하는 서비스. 웹사이트를 주로 말함
웹 서비스는 HTTP 요청과 응답의 반복으로 이루어진다.
⭐️ 백엔드와 프론트엔드
CSR Client-Side Rendering
프론트엔드에서 사용자가 보는 동적인 부분을 대부분 처리
프론트가 대부분의 리소스를 가지고 페이지를 표현하고,
백엔드는 API 통신으로 데이터만 주고 받는다.
SSR Server-Side Rendering
백엔드에서 페이지 대부분의 영역을 처리해 프론트로 전달하는 방식
백엔드가 필요한 데이터가 포함된 페이지를 만들어 응답에 전달한다.
프론트는 응답을 받아 화면에 표시한다.
- 변하는 부분을 백엔드에서 처리
- 백엔드에서 HTML 파일을 작성하여 프론트엔드로 전달한다
- 쉬운 구성과 개발 사이즈가 작다
- 로딩이 완료되면 페이지와 데이터가 한번에 표시되지만, 로딩이 느리다.
- 페이지 이동마다 다시 로딩하여 페이지가 깜빡 거린다.
Node.js의 웹 프레임워크
웹 서비스에 필요한 기능을 제공하는 다양한 도구들의 모음
웹을 만들기 위해 많은 기능이 필요하지만, 많은 부분이 정형화 돼있음
프레임워크를 이용하면 정형화된 부분을 간단하게 구현할 수 있어, 필요한 부분만 집중하여 개발할 수 있음
HTTP 요청 처리 : 필요로 하는 데이터와 사용자의 정보가 있음
HTTP 응답 처리 : 어떤 형식의 데이터인지와 응답 상태 정보가 있음.
라우팅 : HTTP 요청을 분기하는 방법 제공, 알맞은 응답의 경로를 미리 설정하여 응답이 적절하게 이루어지도록 함
HTML Templating
SSR을 구현하기 위한 방법
미리 페이지의 뼈대를 작성할 수 있음
가장 유명한 웹 프레임워크로 커뮤니티의 도움을 받기 좋다.
필요에 따라 유연하게 구조 설정이 가능하다. 미들웨어로 필요한 기능을 간단히 추가할 수 있다.
모든 동작이 명시적으로 구성되어 동작 방식을 이해하기 좋다.
npm init
: 처음부터 작성
express-generator 이용 → npx 이용하기
- 프로젝트 생성기로 기본 구조를 자동으로 생성
- 빠르게 프로젝트를 시작하기 좋다
app.js
: 가장 기본이 되는 파일로, 웹 어플리케이션의 기능을 정의
bin/www
: 실행을 담당. 포트와 실행 오류 등을 정의
package.json
: 프로젝트 의존성 및 스크립트 정의
public
: 코드 없이 직접 제공되는 파일 디렉터리
routes
: 라우팅 파일 디렉터리
views
: HTML Template 디렉터리
app 객체 생성
var express = require('express')
var app = express()
Express.js의 기능을 모두 담은 객체로 모든 동작이 정의돼있다.
app 객체에서 시작해서 모든 요청을 처리한다.
app.use() | 미들웨어를 사용하기 위한 함수 |
---|---|
app.listen() | http 서버를 생성하는 함수. |
app.locals | app에서 사용할 공통 상수로, global을 선언하지 않고 이 값을 사용할 수 있다. |
라우팅
app 라우팅
app 객체가 HTTP 메소드를 이용해 라우팅 할 수 있다.
all 함수를 이용하면 메소드에 상관없이 라우팅이 가능하다. → 어떤 요청이든 처리하는 것
→ 라우팅의 핵심인 그룹화를 지원하지 않음. 그래서 Express.Router을 통해 라우팅을 모듈화할 수 있다.
Express.Router
const express = require('express')
const router = express.Router()
router 객체를 생성하여 http 메서드를 사용한다.
모듈로 만들어서 사용하게 된다.
...
const userRouter = require('./routes/users')
app.use('/users',useRouter)
app.use()
를 이용하여 연결한다. router도 하위 라우터를 설정할 수 있다.
⚡️ path parameter을 제공한다.
주소의 일부를 변수처럼 사용하는 것
/users/:id
로 url을 이동하면 id에 값이 들어간다.
⚡️ Request Handler
라우팅에 적용되는 함수를 부르는 말
http method 함수의 가장 마지막 인자로 함수가 전달 된다.
req.params | /path/:id 에서 :id를 req.params.id로 추출 가능하다 |
---|---|
req.queries | /path?page=2에서 page를 req.queries.page로 추출 가능하다 |
req.body | post 요청의 요청 데이터를 담고 있다. |
req.get('') | request의 헤더 값을 가져온다. 헤더의 이름을 넣어주면 됨 |
res.send() | text 형식으로 http 응답을 전송함 |
---|---|
res.json() | json 형식으로 http 응답을 전송함 |
res.render() | HTML Template을 사용하여 화면 전송 |
res.set() | 응답의 헤더를 설정 |
res.status() | 응답의 상태 값을 설정 |