__________________________________________________
1-14 Request 와 Response
=> < 04. Express.js 02>
Request, Response란
=> Request란 클라이언트가 서버에게 전달하려는 정보나 메시지를 담는 객체를 의미
=> Response란 서버에서 클라이언트로 응답 메시지를 전송시켜주는 객체
Node.js의 서버 모듈에는 대표적으로 http 모듈과 Express 모듈이 존재.
Express 모듈은 http 모듈을 확장하여 제공.
Express 모듈은 기존 http 모듈의 메서드도 사용할 수 있지만, Express가 추가 제공하는 메서드나 속성들을 사용할 수 있어.
=> 따라서 http 모듈은 별로 사용되지 않아.
——
< req 객체 >
req.app : req 객체를 통해 app 객체에 접근할 수 있움.
req.ip: 요청한 Client의 ip 주소가 담겨 있음.
req.body: Request를 호출할 때 body로 전달된 정보가 담긴 객체.
express.json() Middleware를 이용하여야 해당 객체를 사용할 수 있음.
req.params: 라우터 매개 변수에 대한 정보가 담긴 객체.
req.query: Request를 호출할 때 쿼리 스트링으로 전달된 정보가 담긴 객체.
req.cookies: Request를 호출할 때 Cookie 정보가 담긴 객체.
cookie-parser Middleware를 이용하여야 해당 객체를 사용할 수 있음.
req.get(Header): 헤더에 저장된 값을 가져오고 싶을 때 사용함.
____
=> 특히 중요한 것.
req.body, req.params, req.query
——
< res 객체 >
res.app : res 객체를 통해 app 객체에 접근할 수 있습니다.
res.status(코드) : Response에 HTTP 상태 코드를 지정합니다.
→ Http 상태 코드에 대해 자세히 알고싶다면 여기를 클릭해주세요!
res.send(데이터) : 데이터를 포함하여 Response를 전달합니다.
res.json(JSON) : JSON 형식으로 Response를 전달합니다.
res.end() : 데이터 없이 Response를 전달합니다.
res.direct(주소) : 리다이렉트할 주소와 함께 Response를 전달합니다.
res.cookie(Key, Value, Option) : 쿠키를 설정할 때 사용합니다.
res.clearCookie(Key, Value, Option) : 쿠키를 제거할 때 사용합니다.
——
=> send, json, direct, status
— req.body 사용해보기 —
——
// 모든 app 에서 동작하는 미들웨어를 사용하기 위해 app.use 를 사용할거야. 즉 전역 미들웨어로 선언.
// req 객체 안에 있는 req.body 를 사용하기 위해선 이걸 작성을 해야지만 사용할 수 있어.
app.use(express.json());
——
=> app.use(express.json()); 추가. 전역 미들웨어에서 express.json() 을 사용한다.
이래야지 프론트에서 post 로 보내는 데이터를 json 으로 받을 수 있어.
— req.query 로 쿼리 스트링 사용해보기 —
——
브라우저 주소 => localhost:3000/?id=김민수!
app.get('/', (req, res) => {
const q_id = req.query
console.log('답 : ' + q_id["id"])
res.send('Hello World!! ' + q_id["id"]);
});
// res => Hello World!! 김민수!
// console => 답 : 김민수!
——
=> 쿼리 스트링도 키와 키값으로 이루어져 있는 것은 같아.
req.query, req.params, req.body 전부 다 json 객체 형태야.
— req.params 로 라우팅 주소에 변수 받아보기 —
——
브라우저 주소 입력 : localhost:3000/가나다
app.get('/:id', (req, res) => {
console.log(req.params) // { id: '가나다' }
res.send('id는 > ' + req.params["id"]) // id는 > 가나다
})
——
=> req.params 도 객체의 형태야. 키와 키값.
— req.body 로 post 데이터 받아보기 —
——
브라우저 주소 : localhost:3000/ json content : { "id": "lololo", "user_nk": "김민수B(4기)" }
app.post('/', (req, res) => {
console.log(req.body); // { id: 'lololo', user_nk: '김민수B(4기)' }
res.send('기본 uri 의 post 메소드 : ' + JSON.stringify(req.body));
// 기본 uri 의 post 메소드 : {"id":"lololo","user_nk":"김민수B(4기)"}
})
——
=> post 로 받은 데이터 또한 객체 형태로 받는데, 똑같이 키와 키값으로 이루어져 있지.
— res.json() 사용해서 객체를 리턴해주기 —
——
브라우저 주소 입력 : localhost:3000/?id=lololo
app.get('/', (req, res) => {
const q_id = req.query
console.log('답 : ' + q_id["id"])
const obj = {
"keykey": q_id["id"],
"name": "구누두B",
"age": 28
}
res.json(obj);
});
——
=> res.json() 내가 응답해주고 싶은 객체를 바로 넣어서 리턴 가능.
— res.json() 을 돌려줄 건데, status 에 400이라는 특정한 http 상태 코드를 전달해서 “현재 response” 가 정상적인지 아닌지 알려줄 수 있어야 해 —
——
app.get('/', (req, res) => {
const q_id = req.query
console.log('답 : ' + q_id["id"])
const obj = {
"keykey": q_id["id"],
"name": "구누두B",
"age": 28
}
res.status(400).json(obj);
});
——
__________________________________________________
1-15 API 와 REST API 의 개념
=> < 04. Express.js 02>
API(Application Programming Interface)란?
=> 애플리케이션끼리 연결해주는 매개체이자 약속이라고 볼 수 있어
우리가 작성 할 API에서 원하는 데이터를 받아 데이터베이스에 데이터를 저장하고,
저장되어 있는 데이터를 읽어서 웹 어플리케이션(프론트엔드)에 데이터를 제공하는
행위를 통해 사용자가 원하는 목적을 이룰 수 있게 해야 함.
REST API 의 구성은 크게 3가지로 구성되어 있어.
- 자원(Resource) - URL
=> 우리가 만들 소프트웨어가 관리하는 모든 것을 자원으로 표현할 수 있어.
쇼핑몰이라면 상품(Goods)에 대해서 정보를 관리할것이고 또는 장바구니(Carts)에 담긴 상품들도 관리해야겠지.
- 행위 - HTTP method
=> 예를 들어 GET 메소드는 해당 자원의 조회, POST 메소드는 해당 자원의 생성 이런 식으로.
이렇게 나누어진 것을 보통 CRUD 라고 해. 자원에 대한 생성/조회/수정/삭제를 각각의 method 로 나누어 놓은 것.
- 표현
=> 해당 자원을 어떻게 표현할지에 대한 설명.
보통 JSON, XML 같은 형식을 이용해서 자원을 표현해. HTTP에서는 Content-Type 이라는 헤더를 통해 표현 방법을 명시.
__________________________________________________
1-16 REST API 개발
=> < 04. Express.js 03>
— 상품 목록 조회 API 구현하기 —
——
< app.js >
const goodsRouter = require("./routes/goods.js")
app.use("/api", goodsRouter);
< goods.js >
// 경로 : localhost:3000/api/goods
router.get('/goods', (req, res) => {
res.status(200).json({goods});
// 이러면 {"goods": goods} 이렇게 보낸 것과 같아. 같은 이름으로 키 이름이 설정된다고. 세상에;; 참고로 goods 는 객체를 담은 배열.
})
——
=> res.status(200).json({goods}) 이렇게 보내면 자동으로 goods 라는 키 이름을 설정해준다고. 세상에
— 상품 상세 조회 API 구현하기 —
——
< app.js >
const goodsRouter = require("./routes/goods.js")
app.use("/api", goodsRouter);
< goods.js >
// 경로 : localhost:3000/api/goods/goods_id
router.get('/goods/:goodsId', (req, res) => {
const {goodsId} = req.params; // 이거 신기하네. req.params 라는 객체 안의 키값만 쏙 가져옴.
let pick_good = {};
for (const obj of goods) {
if (obj["goodsId"] === Number(goodsId)) {
pick_good = obj;
}
}
res.status(200).json({"goods": pick_good});
})
——
__________________________________________________
1-17 준비하기
=> < 05. MongoDb -> mongoose 01>
데이터베이스와 MongoDB의 개념
데이터베이스란.
=> 단순히 데이터를 잘 저장하고 잘 찾기 위해 만들어진 소프트웨어를 Database Management System(DBMS) 이라 부름.
또한, DBMS가 설치된 서버 컴퓨터를 데이터베이스 서버(DB 서버)라고 부를 수 있어.
데이터베이스의 종류.
- 관계형 데이터 베이스, Relational Detabase (RDB)
=> 데이터 형식이 정해져 있고, 데이터 끼리 관계를 맺어 모순이 없는 데이터를 유지할 수 있도록 하는 것에 집중한 형태
- 비관계형 데이터베이스, Non-relational Database (NoSql)
=> 관계형 DB에 속하지 않는 모든 데이터베이스를 비관계형 데이터베이스라고.
데이터의 형태가 고정되어 있지 않아 유연하지만, 제대로 관리하지 않으면 데이터의 신뢰성이 무너지기도.
최근 스타트업에서 유연한 설계를 위해 많이 채택되기도.
특히 머신러닝을 관리할 때 유연한 데이터 형태로 저장을 위해서 많이 쓰기도.
mongoDB
=> 인기 있는 비관계형 데이터베이스 중 하나.
모든 데이터가 JSON 형태로 저장된다.
복잡한 구조를 쉽게 저장할 수 있으며, 무료다. 스케일을 쉽게 줄일 수 있다고.
웹 서버와 DB 서버는 어떤 관계인가?
=> 웹 서버는 웹 클라이언트가 원하는 데이터와 기능을 제공.
DB 서버는 데이터를 최대한 성능 좋게 저장하고, DB 클라이언트가 원하는 데이터를 제공.
즉, 두 가지 서버는 어떤 것을 제공하냐만 다를 뿐, 기본 원칙은 같아.
웹 서버는 DB 서버를 이용하는 DB 클라이언트가 될 수 있어.
즉,
브라우저 <-> 웹 서버 <-> DB 서버
이러한 관계가 형성된다고 볼 수 있어.
— mongoDB 설치하기. 맥 버전 —
- /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
=> 복붙해서 터미널에 붙여넣어 보자.
homebrew 를 설치하는 건데, 최종적으로 < brew -v > 를 입력해서 home-brew 버전이 잘 뜨면 성공.
- mongoDB 설치
=>
brew tap mongodb/brew
brew install mongodb-community
위 두 개의 명령어를 차례대로 입력.
- mongoDB 실행해보기
=>
brew services start mongodb-community
- 잘 실행되는지 확인하기
=>
접속해보기.
— Studio 3T 다운로드 —
=> mongoDB 를 CLI 가 아닌 그래픽 환경인 GUI 로 확인하기 위해 에디터를 다운받을 거야.
- Studio 3T 다운받기
=> https://robomongo.org/download
자세한 진행 사항은 교재 노션을 참조.
__________________________________________________
1-18 시작하기
=> < 05. MongoDb -> mongoose 02>
MongoDB Client: Studio 3T 학습
Studio 3T 란?
=> Studio 3T는 API의 사용을 도와주는 API Client처럼 MongoDB를 위해서 만들어진 MongoDB Client.
Studio 3T의 GUI를 통해 MongoDB에 저장된 데이터를 관리하기 쉽게 보여주는 프로그램 이라고.
— Studio 3T로 내 컴퓨터에 설치한 MongoDB에 연결하기 —
- Studio 3T 실행
=> 가장 먼저 클라이언트를 실행하면 “ connection manager “ 라는 창이 나오는데, 여기서 “ new connection “ 을 시도.
** 만약 “ connection manager “ 창이 뜨지 않는다면 클라이언트의 좌측 상단의 connect 를 클릭.
- “ new connection “ 클릭 후, “ Manually “ 를 체크하고는 next
- Connection name -> sparta_db
localhost, 27017
- 이렇게 save 하고 “ connection manager “ 창에서 커넥트 시도.
- 무사히 커넥트가 되었다면, 왼쪽 커넥트 현황 창에서 sparta_db 에 우클릭 -> 새 데이터베이스 생성 -> db 이름은 < mongodb_prac >
- < mongodb_prac > db에 우클릭 -> open intelligenceshell 클릭.
=> mysql 창으로 치면 쿼리 입력창.
— node.js express 내부에서 mongodb 이용해보기 —
=> 우선, DB Client 역할을 하는 무언가가 필요해. 따라서 mongoose 라는 라이브러리가 필요해.
폴더 : kimminsoo -> sparta -> node_js -> learning -> first_step -> spa_mall
터미널 경로 : kimminsoo@gimminsuui-MacBookPro spa_mall %
- 폴더 구조
├── app.js
├── routes
│ ├── carts.js
│ └── goods.js
└── schemas
├── index.js
├── cart.js
└── goods.js
=> 즉, spa_mall 바로 아래에( = app.js와 동일 레벨) schemas 라는 폴더를 만들어주고, 그 안에 index.js 를 만들어줘.
- npm i mongoose
__________________________________________________
1-19 코드에서 MongoDB 이용
=> < 05. MongoDb -> mongoose 02>
__________________________________________________
1-20 장바구니 구현(1)
=> < 05. MongoDb -> mongoose 03>
폴더 : kimminsoo -> sparta -> node_js -> learning -> first_step -> spa_mall -> routes -> cart.js
-> schemas -> cart.js
__________________________________________________
1-21 장바구니 구현(2)
=> < 05. MongoDb -> mongoose 04>
폴더 : kimminsoo -> sparta -> node_js -> learning -> first_step -> spa_mall
앞서서는 장바구니에 있는 정보들을 조회하는 api 를 만들었다고 한다면,
이번에는 장바구니에 상품을 추가하거나, 빼거나 하는 api 도 만들어보자.
유의 해야 할 점.
- 객체분할할당
——
const {goodsId} = req.params;
const {quantity} = req.body;
——
- 몽고DB find 로 select 할 때 찾고자 하는 필드명과 변수명이 같다면, 걍 변수만 입력해도 된다
——
const existsCarts = await Cart.find({goodsId});
——
- 몽고DB 에서 도큐먼트(=레코드) insert 할 때 필드명과 변수명이 같다면 걍 변수만 입력해도 된다.
——
await Cart.create({goodsId, quantity})
——
번외 1. 몽고DB find 찾을 때 찾기를 원하는 값들을 배열로 감싸서 보낼 수도 있어.
——
const goods = await Goods.find({goodsId: goodsIds});
// Goods 에 해당하는 모든 정보를 가져올 건데, goodsId 필드의 값이 goodsIds 배열 안에 존재하는 값일 때만 조회하라.[{}, {}, {}]
***
await Cart.deleteOne({goodsId})
=> delete 도 마찬가지로 가능.
——
번외 2. Update 의 경우 명확하게 명시.
——
await Cart.updateOne({goodsId: goodsId}, {$set: {quantity:quantity}})
// goodsId(필드) 가 goodsId(변수) 에 해당하는 도큐먼트가 있다면,
// 해당 도큐먼트의 quantity(필드)의 값을 quantity(변수) 로 수정하겠다.
——
**** mongoose 스키마 타입 속성 메소드 참고용 블로그 *****
https://blog.naver.com/rwans0397/220696586520
'내일배움캠프_개발일지 > Node.js 기초' 카테고리의 다른 글
Node.js 숙련 - 2 (0) | 2022.12.16 |
---|---|
Node.js 숙련 - 1 (1) | 2022.12.15 |
Node.js 입문-2 (1) | 2022.12.13 |
Node.js 입문 - 1 (0) | 2022.12.13 |
Node.js 첫 시작 셋팅 2 (0) | 2022.12.07 |