오늘은 공부 중/자바스크립트

[Node.js API 수업] 내용 정리

이도토리 2021. 7. 25. 18:49

노드JS의 특징
브라우저 밖에서 자바스크립트 코드를 실행할 수 있다
크롬에서 사용하는 V8 엔진을 사용한다
이벤트 기반의 비동기 I/O 프레임워크다
모듈 시스템이 있다





- v8 엔진 - 자바스크립트 코드 해석기
크롬에서 사용하는 v8엔진 이용




- 이벤트 기반의 비동기 I/O 프레임워크
-> CLIENT의 요청을 이벤트로 받아 이벤트큐에 쌓는다.


- 이벤트루프(싱글쓰레드) : 이벤트 큐의 이벤트 하나하나를 실행하는 것. JOB 처리
==> 결과를 응답해줌.

- 무거운 JOB은 직접 실행하지 않고 다른 쓰레드에 위임하여 비동기로 처리.
무거운 JOB을 실행하는 워커들은 완료되면 결과를 다시 이벤트 큐에 전달.

- 파일형태로 모듈을 관리할 수 있는 CommonJS를 구현한 모듈 시스템
웹브라우저 안에서는 파일에 접근 불가능.
node.js는 server에서 돌아가는 코드이기에 파일을 읽고
하나하나를 모듈로 만들어서 관리



- 모듈 시스템.


- 비동기 세계
: 노드는 기본적으로 비동기로 동작.
readFile(비동기) : file을 읽을 때까지 기다리지 않고 다음 명령으로 간다. 파일을 다 읽은 이벤트가 발생하면 그제야 콜백함수 반응.
파일을 제대로 못 읽으면 err에 값이 할당. 제대로 읽으면 data에 값이 할당.
! (함수를 파라미터로 넘기는) 콜백함수 많이 쓴다!
readFileSync(동기)




((req, res) => {
function(req, res){
}

204: no content 성공은 했지만 body에 내용은 없다.


-- 매개변수 2개.

$ curl -X GET 'localhost:3000' = 127.0.0.1
-> 클라이언트에게 get 메소드로 3000번으로 요청한 것.
-> curl : http 요청을 보낼 수 있는 커맨드라인 명령어

클라이언트가 요청하면 콜백함수 동작.
req res 2개의 파라미터를 가지고 옴. res를 사용하여 응답한다.


$ curl -X GET 'localhost:3000'
// 루트 경로로만 접속할 수 있는 서버. 어떤 요청에도 같은 대답을 하는 중.

console.log(req.url); // 요청객체 request url 변수에 클라이언트 요청 정보 들어가 있음.


res.statusCode = 200; // 성공 의미
res.setHeader("Content-Type", "text/plain"); // 헤더값 설정
res.end("Hello, World!\n"); //end함수로 문자열을 클라이언트에게 보내주는 중


C:\practice\nodejs>curl -X GET "localhost:3000/users/" -v


api 서버. 여러가지 요청에 여러가지 응답을 주기.
api 추가시마다 분기문으로 api 코드를 추가하게 되면 분기문의 장문화, 중복되는 코드, 파일의 증대.
==> express js 프레임워크 사용.


써드파티 미들웨어 : 다른 사람이 만들어둔 middleware. 노드 모듈 형태로 제공.



express js -> node.js로 만들어진 웹 프레임워크
5가지 개념 : 어플리케이션 / 미들웨어(함수의 배열) - 기능 추가하고 싶을 때마다 미들웨어로 서버에 기능 추가
/ 라우팅(각 경로별 설정) 기능 제공 / req (요청객체) / res(응답객체) [req, res 편리하게 사용할 수 있게끔 method 형태로 제공]


application = express 객체
=> 미들웨어 추가 가능 / 라우팅 설정 가능 / 요청 대기 상태 가능.


미들웨어는 interface가 정해져 있다.
req, res, next
==> next 함수를 호출해줘야 함. 그래야 다음 로직을 수행할 수 있다.



npm install express
==> 사실 npmjs.com 속의 express 모듈을 다운받아 오는 것.
==> node package manager



third party 미들웨어 설치 -> npm install 모듈 설치 -> app.use 함수를 통해 미들웨어 추가.


- 일반 미들웨어 (parameter 3개)
- 에러 미들웨어 (parameter 4개)




익스프레스 js 기초
// 어플리케이션
// 미들웨어
// 라우팅
- 요청 url에 대해 적정한 핸들러 함수 연결시켜주는 기능.
- 특정 요청에 해당하는 응답을 연결시켜주는 것 : 라우팅.
- app의 get(), post() 메소드 구현
- 라우팅을 위한 전용 Router 클래스 사용 [복잡한 라우팅 구조적으로 작성 가능]


// 요청객체 (req) : client의 요청정보를 담은 객체
==> http 모듈의 request 객체를 wrapping한 것.
==> 사용 쉬운 method 제공. req.params(), req.query(), req.body() 메소드 주로 사용

// 응답객체 (res) : client의 응답정보를 담은 객체
==> res.send(), res.status(), res.json()


npm init
ls
cat package.json

외부 모듈들을 node_modules을 이용해 채워주는 것.
install express --save (package.json 파일에 자동으로)


package.json이 있는 상태에서 npm install만 하게 되면 의존성에 사용 모듈이 다 적혀 있기 때문.



package.json 파일 속 scripts 안에 함수를 적게 되면 npm으로 바로 작동 가능.




get : 자원을 조회 $ curl -X GET 'localhost:3000/users'
post: 자원을 생성 $ curl -X POST 'localhost:3000/users' -data : 이 데이터를 기반으로 새로운 user를만들어달라
put : 자원을 갱신 $ curl -X PUT 'localhost:3000/users' 이미 등록되어 있는 user에 대해 정보를 수정할 때
delete : 자원을 삭제 $ curl -X DELETE 'localhost:3000/users' 서버의 유저 자원을 삭제해달라.


익스프레스 어플리케이션의 메소드로 구현되어 있다.

api 요청 제대로 -> 200 [get/ put]
201 자원생성

GET/users


> : 요청에 대한 정보
< : 응답에 대한 정보




TDD
Mocha : Testcode를 돌려주는 실행시켜주는 코드. (테스트 러너)
테스트 수트 describe() / 테스트 케이스 it()

.spec.js : specification 명세의 줄임말. 거의 테스트코드라고 보면 됨.


[test] Deprecated assert.equal should be replaced with assert.strictEqual #466
require가 import로 바뀌어 쓰이는 부분도 참조하기


devDependencies: 개발환경에서 필요한 의존성 모듈들


ASSERT : 테스트 코드에서는 사용하지 말고 third party library 사용.


// 첫 api 데이터 //
limit 파라미터를 주면 limit 개수까지만 user 목록 반환하기
limit : 응답받을 데이터의 모든 길이
offset : 스킵하는 데이터의 개수.

post : data를 body로 보내줌. send함수로 body값 입력

비동기 callback 함수

NODE_ENV=~~ 환경변수 바인딩
node에서는 process 객체에 할당이 되어 들어옴


testcode와 app 코드의 express 서버 구동부가 중복으로 일어나고 있다.
app쪽에서는 서버 구동하지 않기




//DATABASE
SQL : 테이블 형식의 DB (excel - 컬럼, 로우)
sqlite => 파일 형식 db (간단한 소규모 db) / 서버형식의 별도 운영
NOSQL : document 형식의 DB (ex. json 형식) db 형식을 쉽게 변경 가능
-- mongoDB / DynamoDB
In Memory DB : 메모리 안의 DB [재구동되면 데이터가 날아감. 서비스의 성능 향상을 위해 씀.]
==> 인증 토큰, 세션, 자주 사용하는 데이터들 ==> 인메모리 DB에 넣고 운영.


DB 관리 (쿼리)
ORM : 데이터베이스를 객체로 추상화해둔 것 (Object Relational Mapping)
쿼리를 작성하는 대신 객체의 메소드형태로 데이터 관리할 수 있는 것이 장점
app 코드를 깔끔하게 유지하는 장점 vs 성능의 이슈
노드의 sql orm => 시퀄라이져(Sequelizer)

객체 : orm에서는 모델이라고 부름.
모델 : db 테이블을 orm으로 추상화한 것.
유저 모델 만들고 메소드 사용해 관리해보기
sequelize.define(); :모델 정의
sequelize.sync(); : 데이터베이스 연동


메소드 파라미터로 키워드 추가.

SQL : Structured Query Language 데이터베이스와 대화하는 언어