1. Express 소개
: 경량 HTTP 웹 프레임 워크
: 요청과 응답
: 미들웨어 사용
: 템플릿 엔진
: 설치
: npm install express
미들웨어
: 요청 분석, 처리하는 모듈
: 여러개의 미들웨어로 구성
: 미들웨어 사용설정
: app.use(미들웨어)
: app = express()
: app.use(function(){})
라우팅
: 요청 -> 요청 처리 미들웨어로 분배
: HTTPMethod 별로 라우팅
: URL 경로 별로 라우팅
: method 별로, 경로 별로 가능
Express 요청
: 요청분석
: req.query - 쿼리 문자열
: req.path - 요청 URL 중 경로
: req.params - URL의 파라미터
: req.cookie : 요청 메세지 내 쿠키(쿠키파서 필요)
: req.body : 요청 메시지 바디 분석 (바디 파서 필요)
Express 응답
다양한 응답 메소드
: res.json() - JSON 응답 메시지 전송
: res.redirect() - 리다이렉션 응답 전송
: res.render() - 템플릿으로 렌더링
: res.send() - JSON, HTML, Buffer 전송, 메시지 헤더에 Content-Type 자동설정
: res.sendStatus() : 상태 코드와 상태 메시지 전송
: res.status() : 상태 코드 설정. 응답 메소드 종료 안함
: res.download() : 파일 다운로드
2. Express 미들웨어
미들웨어
: 미들웨어 기반의 프레임 워크
: connect
: Express
: 미들웨어
: 작은 단위 모듈
: 요청과 응답 처리 함수 형태
: Express 앱
: 다수의 미들웨어 조합으로 동작
: Express 앱의 요청 다루기
: 하나의 미들웨어에서 요청 분석 응답 마무리
: HTTP 메소드 별 미들웨어 설정 가능
: 여러 미들웨어를 거쳐서 요청과 응답 마무리
> app.use(function(req,res,next){
> console.log("");
> next(); // 바로 밑에 있는 미들웨어 실행
> });
> app.use(logger, sayHello) 와 같이 두 함수를 같이 넣어도 됨.
: express의 미들웨어
: 애플리케이션 수준의 미들웨어
: 라우터 수준의 미들웨어
: 에러처리
: 빌트인
: 써드파티
: 미들웨어 동작 순서 중요
: 보통 미들웨어 동작 순서
: 파비콘 처리 미들웨어
: 로깅 - 로그 남기는 거
: 정적파일
: 서비스 미들웨어
: 에러처리
: 내장 미들웨어, 써드 파티 미들웨어
: 내장 미들웨어
: express.static
: 써드 파티 미들웨어 : 설치해야 사용 가능
: var cookieParser = require('cookie-parser');
: app.use(cookeParser());
3. 정적 파일 요청 처리 미들웨어
정적파일
: 정적 파일 처리 미들웨어
: express.static
: 미들웨어 생성
: express.static(root, [options])
: 옵션
: etag : etag 사용 여부, 기본 true
: 사용
: app.use(express.static('images')) // images 폴더에서 찾아라
: 여러개 사용 가능
: 첫번째 미들웨어에서 서비스 실패하면, 그 다음 미들웨어에서 찾음
: 가상 경로 설정
: app.use('/static',express.static('files')); // static/image.png를 files/image.png로 찾음
Express 라우팅
1. Expresss 라우팅
라우팅
: 클라이언트의 요청을 미들웨어로 분배
: 라우팅 종류
: 요청경로
: 요청 메소드
: 요청 경로 + 요청 메소드
메소드별 라우팅 함수
: app.all, get, post, put, delete(요청경로, 담당 미들웨어)
동적 파라미터
: app.get('/user/:item',[callback]);
: req.params.item 처럼 호출
: 다수의 파라미터 사용 가능
: /movies/:movieId/:actor
: 사용 주의
: /user/:item
: /user/sample
: 라우팅 경로가 겹친다
: 앞 순위 미들웨어가 담당
: 순위 조절 필요
라우팅
: 경로에 정규식 사용하기
: ? 문자 존재하거나 생략
: /ab?cd ==> /abcd, /acd
: + 1번이상 반복
: /ab+cd ==> /abcd, /abbcd, /abbbcd
: * 임의의 문자
: /ab*cd ==> /abcd, abxcd, abRABDOMcd, ...
: 괄호를 통해 묶어주면 정규식을 묶어서 사용 가능
: express의 route 함수
: 같은 경로에 대해 다양한 메소드를 정의할 수 있음
: route().get().post()..
라우터 수준의 미들웨어
라우터
> var router = express.Router();
: 라우팅 로직을 별도로 분리할 떄 사용
: router.js
> router.get(경로,미들웨어);
> router.get(경로,미들웨어);
> module.exports = router;
: 라우팅 로직 설정
: app.js
: app.use(require('./router'))
상대 경로 처리 라우터 설정
상대 경로 요청 처리 가능
* /greeting/hello 경로의 요청
: app.use('/greeting',require('./greetingRouter'))
* greetingRouter의 라우팅 코드
: router.get('/hello', sayHello); // 상대적으로 적힘
2. 에러처리 미들웨어
Express 에러 처리 방법
: 미들웨어 내부에서 처리
: 각각 미들웨어에서 에러 처리
: 에러 처리 로직이 제각각
: 에러 처리 코드 중복
: 에러 처리 미들웨어에게 위임
: 일관된 에러 처리 가능
: 가장 후순위로 설정해야함.
환경 별 에러 처리
: 개발환경 설정하기
: // Windows - 서비스 환경
: set NODE_ENV = product // node myapp.js
//LINUX - 개발환경
: NODE_ENV = product node myapp.js
: NODE_ENV = development node myapp.js
: 환경설정 읽기
: app.get('env')
Express 써드파티 미들웨어
1. 파비콘 미들웨어
파비콘 미들웨어
: 파비콘 담당 미들웨어
: serve-favicon
: 웹브라우저의 싸이트 아이콘
> npm install serve-favicon
: 미들웨어 생성
: favicon(파비콘경로, 옵션)
: 미들웨어 중 앞 순위로 설정
> var express = require('express')
> var favicon = require('serve-favicon')
> var app = express()
> app.use(favicon(__dirname + '/public/favicon.ico'));
2. 로그 남기기
로그 남기기
: 로그
: 개발용, 버그 분석
: 사용자 행위 기록
: 운영 기록
: 로그 기록 매체
: 콘솔에 출력
: 파일, 데이터 베이스에 기록
: 이메일, SMS 등....
로그 남기기 - console
: console.info, log, warn, error ()
로그 미들 웨어 - morgan
: 로그 모듈 : morgan
: 간단한 설정
: 요청과 응답을 자동으로 로그 남기기
: morgan 설정
: morgan(format, options)
: 로그 포멧
: combined
: common : addr, ,user, method, url,...
: 사용 예
> var morgan = require('morgan')
> app.use(morgan('dev'))
: 요청과 응답 자동으로 기록
: 미들웨어 중 앞 순위로 설정
로그 미들웨어, 모듈 : winston
: 다양한 형태로 로그 남기기
: 모건 보다 다양한 형태로 남길 수 있음
: 파일로 남기기, 데이터 베이스에 저장
: email, sms, 알림 서비스 사용
: 서비스 운영 시 콘솔을 항상 볼 수 없기 때문에 필요함.
: 로그 기록 매체 : Transport
: 기본제공 Transport
: Console
: File
: Http
: Transport 추가/삭제
: winston.add(winston.transport.File, {filename:'service.log'});
: winston.remove(winston.transports.Console);
: 추가한 방법 모두 출력이 됨.
: 로거를 생성해서 사용자 정의로 만들 수 있음
: 에러났을때나, 사용자 로그를 남기는 등 다양한 상황에 맞추어 다르게 사용가능
: 별도 설치 Transports
: DailyRotateFile = 매일 새로운 파일로 교체하면서 로그를 남기도록 하는거
: CouchDB, Redis, MongoDB ..
: Mail transport
: Notification Service(Amazon SNS)
3. BodyParser
: post 등 버퍼를 통해 입력을 받을때 편하게 요청 메시지 바디를 파싱할 수 있도록 하는 모듈
: 바디메시지 인코딩 타입
: JSON, Raw, Text, URL-Encoded
: 멀티파트 지원안됨
: formidable, multer 등 써드 파티 미들 웨어 사용
: 옵션을 통해 메시지 크기 여러 옵션을 적용가능
: bodyParser.json()
: bodyParser.urlencoded()
바디 파서의 결과
: 파서 결과 - req.body
4. 메소드 오버라이드
메소드 오버라이드
: HTML 폼은 GET과 POST만 가능한데, DELETE와 PUT을 사용할 수 있도록 도와줌
Express 템플릿 엔진
Express 템플릿
HTML 출력
: 클라이언트가 웹 브라우저
: 응답 메시지 형태 - HTML
: 화면 전환
: HTML 구성요소
: 문서 구조 태그, 컨텐츠, CSS, JS
템플릿
: 뷰와 제어코드(데이터) 분리, 결과물 - HTML
템플릿 엔진
: ejs, jade
: Express 템플릿 설정
: app.set('views', 템플릿 폴더)
: app.set('view engine', 템플릿 엔진)
: 템플릿에 적용 : 렌더링
: res.render(파일명, 변수, 콜백)
2. 템플릿 엔진 EJS
템플릿 엔진 EJS
: 특징
: HTML 태그 그대로 사용
: 코드 실행 : <% %>
: 결과 출력 : <%= %>
3. 템플릿 엔진 Jade
Jade
: 특징
: 간결한 문서 구조 표현
: 들여쓰기를 이용한 문서 구조
: 코드작성은 - 기호를 앞에
: 속성은 () 안에
: = 기호로 변수 출력
: = 기호와 문자열 출력, Escaped
: !=기호와 문자열 출력, Unescaped
: interpolation
: escaped : #{val}
: Unescaped : !{val}
: if 조건문
: - 없이 사용
: 들여쓰기로 종료