TIL_171030 Promise, Node.js

promise

  • 비동기식함수의 리턴을 할 수 없어서 생기는 콜백헬, 에러처리 불가능 문제를 해결하기 위한 하나의 방법
  • Promise를 사용하면 요청을 취소할수 없다는 단점이 있음
  • promise기능의 최신 -> RxJs (Angular)
  • promise 자체도 ‘값’을 반환할 순 없지만, ‘약속’을 반환
  • 후속코드에 서버가 ‘약속’을 지켰을 경우(fulfilled)의 실행, 못 지켰을 경우(rejected)의 실행을 지정
  • promise는 내부 계산을 한 후 ‘상태’를 return
1
2
3
4
5
6
7
8
9
10
11
12
//Promise는 Promise 생성자를 통해 인스턴스화
//비동기 작업을 수행할 콜백함수를 인자로 전달받음 -> 이 콜백함수는 resolve, reject콜백함수를 인수로 갖음
var promise = new Promise((resolve, reject) => {
// 비동기 작업을 수행한다.
if (/* 비동기 작업 수행 성공 */) {
resolve('resolved!');
}
else { /* 비동기 작업 수행 실패 */
reject(Error('rejected!'));
}
});

promise 후속 처리함수 then / catch

1. then

  • then 메소드는 두 개의 콜백 함수를 인자로 전달 받음
  • 첫번째 함수는 성공(fulfilled) 시 호출되는 함수
  • 두번째 함수는 실패(rejected) 시 호출 (일반적으로 throw로 에러처리를 catch문에 위임)

2. catch

fulfilled, rejected 외, 예외 발생 시 호출
또는, 두번째 함수에서 던진 throw구문 잡음


Node.js

  • 단일 thread, 모든 API는 비동기처리
  • 실무환경에서는 서버에 LTS버전을 설치하도록 (안정)
  • 서버 페이지가 변경되고, 이를 적용하려면 재실행 시켜서 확인
  • require 문은 동기식이기 떄문에 최상단에 연이어 작성을 추천

npm

  • 자바스크립트 패키지 매니저
  • Node.js에서 사용할 수 있는 모듈들을 패키지화하여 모아둔 저장소 역할 & 패키지 설치 및 관리를 위한 CLI(Command line interface)를 제공
  • npm에서 모듈 검색 가능 (단, status에 다운로드 기록이 작은 것은 되도록 비추)
  • 기본 install은 지역 (전역설치 npm install -g ####)
  • package.json에 dependencies or devDependencies 유의 (의존성. 배포 or 개발–save-dev)
  • npm install 패키지명 –save-dev 하면 -> devDependencies로
  • 한사람이 package.json을 만들어두면 그 파일을 가지고 npm install만하면 모든 팀원이 동일한 개발환경을 갖게됨

버전정보

1
2
3
^1.7.3
([caret] mojor, minor, patch)
  1. ^caret or ~tilt

    • caret] 추후 호환성을 고려해, minor버전 내 최신버전을 다운
    • tilt] 패치 버전 내 최신버전을 다운
  2. major - 호환성이 변경했을때

  3. minor - 기능을 추가
  4. patch - 버그를 수정

1. exports

  • exports 객체에는 값을 할당할 수 X
  • 공개할 대상을 exports 객체에 프로퍼티 또는 메소드로 추가
  • 추가한 프로퍼티와 메소드가 담긴 객체가 전달된다.

2. module.exports

  • module.exports를 많이 씀
  • module.exports 객체에 하나의 값(기본자료형, 함수, 객체)만을 할당
  • 하나의 값만 들어갈 수 있으나 폴더를 지정할 수도 있음 (이때 해당 index.js파일을 찾게됨)
  • module.exports 객체에 할당한 값이 전달

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    //폴더 경로
    /* project/
    ├── app.js
    └── module/
    ├── index.js
    ├── calc.js
    └── print.js */
    const myModule = require('./module');
    // -> require('./module/index.js')와 같음
    // module/index.js 내부에는 부르고싶은 모듈들을 작성
    module.exports = {
    calc: require('./calc'),
    print: require('./print')
    };
  • 코어모듈은 경로를 써주지 않아도 됨 (이미 node.js가 암 [eg] http )

  • 파일모듈은 경로를 써줘야 함

[npm package]

1. nodemon

  • npm install nodemon -g
  • 전역으로 설치한것은 package json 으로 안들어옴
    -> package.json의 script영역에 “start(임의의명)”: “nodemon app(가동할 js파일)” 기입
    -> 이후 nodemon app으로 실행 시, 수정할때마다 서버를 재가동 해야하는 불편함 없이 사용가능

2. body-parser

  • npm install body-parser
  • 클라이언트가 보낸 페이로드를 리퀘스트 객체에 바디 프로퍼티에 set해줌
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
//Static File Service
/* app.use(express.static('public')); */
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.get('/', (req, res) => res.send('Hello World!'));
app.get('/books/:id', (req, res) => {
const bookId = req.params.id;
res.status(200).send(bookId);
});
app.post('/login', (req, res) => {
const payload = req.body;
console.log(payload);
res.status(200).send(payload);
});
app.listen(3000, () =>
console.log('Example app listening on port 3000!'));

오늘의 느낀점

  • 자바스크립트 표준을 위한 움직임 Common js, AMD 을 읽고 모듈에 관한 전반적인 개요흐름을 이해하자
  • 서버로 넘어가면서 실습방식으로 진행되다보니 실습하는데에 빠져있다가 끝나고나면 무엇을 했는지 휙휙 지나가버림! 꼭 다시한번 흐름을 보면서 이걸 왜 썼는지, 이 부분에서 어떤 것을 썼는지 확인해 봐야곘다