(TIL) 2024-11-19
(TIL) 2024-11-19
Express.js 통신 흐름
- 클라이언트는 특정 URL과 데이터를 담은 요청(Request)을 서버에 전송합니다.
- 서버는 받은 데이터에 따라 필요한 비즈니스 로직을 수행합니다.
- 서버는 처리된 결과를 클라이언트에게 응답(Response)으로 보내줍니다.
Express.js 흐름 분석
- 서버 시작: Express.js는 지정된 포트 번호(Port)를 사용하여 서버를 시작
1 2 3
app.listen(PORT, () => { console.log(PORT, '포트로 서버가 열렸어요!'); });
- 라우터 등록: 연결하려는 모든 라우터들을 /api 주소에 연결
```javascript import goodsRouter from ‘./routes/goods.js’; import newsRouter from ‘./routes/news.js’;
// 2. 라우터를 등록 합니다. app.use(‘/api’, [goodsRouter, newsRouter]);
1
2
3
4
5
3. API 정의: 등록된 각 라우터를 순서대로 검토하여, HTTP Method와 URL이 일치하는 API를 찾아 해당 API를 수행
```javascript
router.get('/news', (req, res) => {
...
});
- 결과 반환: API에서 모든 비즈니스 로직 처리가 완료된 후, 클라이언트(ex: 웹 브라우저)에게 결과를 전달
1 2 3 4 5 6
router.get('/news', (req, res) => { // 4. 사용자의 요청에 맞는 데이터를 반환합니다. return res // Express.js의 res 객체를 반환합니다. .status(200) // API의 상태 코드를 200번으로 전달합니다. .send('뉴스 목록 조회 API 입니다.'); // API의 결과값을 '뉴스 목록 조회 API 입니다.'로 전달합니다. });
req, res 객체
- req 객체
- req.app : req 객체를 통해 Express.js의
app객체에 접근할 수 있습니다. - req.ip: 요청한 Client의 ip 주소가 담겨 있습니다.
- req.body: Request를 호출할 때
body로 전달된 정보가 담긴 객체입니다.
express.json()Middleware를 이용하여야 해당 객체를 사용할 수 있습니다.- POST, PUT과 같은 Http method에서 사용
1 2 3
// Express에서 req.body에 접근하여, body 데이터를 사용할 수 있도록 설정하는 미들웨어 app.use(express.json()); app.use(express.urlencoded({ extended: true }));
1 2
- **req.params**: **라우터 매개 변수(Path Params)**에 대한 정보가 담긴 객체입니다. - **req.query**: Request를 호출할 때 **쿼리 스트링**으로 전달된 정보가 담긴 객체입니다.
GET과 같은 Http method에서 사용됩니다. - req.cookies: Request를 호출할 때 Cookie 정보가 담긴 객체입니다.cookie-parserMiddleware를 이용하여야 해당 객체를 사용할 수 있습니다. - req.get(Header): 헤더에 저장된 값을 가져오고 싶을 때 사용합니다.
- req.app : req 객체를 통해 Express.js의
- res 객체
- res.app : res 객체를 통해 Express.js의
app객체에 접근할 수 있습니다. - res.status(코드) : Response에 HTTP 상태 코드를 지정합니다.
- res.app : res 객체를 통해 Express.js의
- res.send(데이터) : 데이터를 포함하여 Response를 전달합니다.
- ex)
res.send('Hello, World');
- ex)
- res.json(JSON) : JSON 형식으로 Response를 전달합니다.
- ex)
res.json({ message: 'Hello, World' });
- ex)
- res.end() : 데이터 없이 Response를 전달합니다.
- res.redirect(주소) : 리다이렉트할 주소와 함께 Response를 전달합니다.
- ex)
res.redirect('https://naver.com');
- ex)
- res.cookie(Key, Value, Option) : 쿠키를 설정할 때 사용합니다.
- res.clearCookie(Key, Value, Option) : 쿠키를 제거할 때 사용합니다.
객체 구조 분해 할당
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const name = req.body.name;
const thumbnailUrl = req.body.thumbnailUrl;
const category = req.body.category;
const price = req.body.price;
// 객체 구조 분해 할당 적용하기.
const { name, thumbnailUrl, category, price } = req.body;
const goodsItem = {
goodsId: goodsId,
name: name,
thumbnailUrl: thumbnailUrl,
category: category,
price: price,
};
// 객체 구조 분해 할당 적용하기.
const goodsItem = {
goodsId,
name,
thumbnailUrl,
category,
price,
};
데이터베이스
데이터베이스(Database) : ‘데이터의 집합’이라고 할 수 있습니다. 실제 데이터가 저장되는 저장소의 역할을 수행 DBMS(Database Management System) : 데이터베이스(Database)를 실제로 운영하고, 관리하는 소프트웨어
데이터베이스의 종류 관계형 데이터베이스 - Relational Database (RDB):
- 관계형 데이터베이스는 데이터의 형식이 정해져있고, 데이터 간의 관계를 맺어 모순이 없는 데이터를 유지할 수 있도록 도와주는 데이터베이스를 관계형 데이터베이스라고 부릅니다.
이런 특성 때문에 은행과 같이 정확하고 일관된 데이터가 중요한 경우에 주로 사용됩니다.
모순이 없는 데이터: 무결성과 정합성이 높은 데이터
비관계형 데이터베이스 - Non-relational Database (NoSQL):
- 데이터의 형식이 고정되어 있지 않고, 유연하게 확장할 수 있는 데이터베이스를 비관계형 데이터베이스라고 부릅니다.
- 이런 유연성 덕분에 SNS 서비스, 빅데이터와 같이 다양한 형식의 데이터를 빠르게 저장하고 검색해야 하는 경우에 주로 사용됩니다.
- 비관계형 데이터베이스는 유연하게 저장되는 만큼 저장되는 데이터를 제대로 관리하지 않으면 데이터베이스에 저장된 데이터를 신뢰할 수 없게 되기도 합니다.
MongoDB
비관계형 데이터베이스 (NoSQL) 중 하나 모든 데이터가 JSON 형태로 저장 복잡한 데이터 구조를 쉽게 저장할 수 있는 장점 데이터베이스 서버의 확장을 손쉽게 줄이고 늘일 수 있다
몽구스 연결
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import mongoose from "mongoose";
const connect = () => {
mongoose
.connect(
"mongodb+srv://sparta-user:sparta@express-mongo.vq7ln.mongodb.net/?retryWrites=true&w=majority&appName=express-mongo",
{
dbName: "spa_mall", // spa_mall 데이터베이스명을 사용합니다.
}
)
.catch((err) => console.log(err))
.then(() => console.log("몽고디비 연결 성공"));
};
mongoose.connection.on("error", (err) => {
console.error("몽고디비 연결 에러", err);
});
export default connect;
미들웨어(Middleware)
웹 서버에서 요청을 받을때, 모든 요청에 대한 공통적인 처리를 하고싶을 수 있습니다. 이때 필요한 것이 바로 미들웨어(Middleware)입니다.
1
2
3
// Express에서 req.body에 접근하여, body 데이터를 사용할 수 있도록 설정하는 미들웨어
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
next: 다음 스택으로 정의된 미들웨어를 호출합니다.
1
2
3
app.use((req, res, next) => {
// 필요한 코드
});
app.use(Middleware): 모든 요청에서 미들웨어가 실행된다.app.use(’/api’, Middleware): /api로 시작하는 모든 요청에서 미들웨어를 실행한다.app.post(’/api’, Middleware, (req,res,)=>{} ): /api로 시작하는POST요청에서 미들웨어를 실행한다.
데이터 유효성 검증 라이브러리 Joi
Joi는 JavaScript 유효성 검증을 위한 라이브러리입니다. Joi는 여러 타입과 규칙을 이용해 유효성을 검증할 수 있으며, 유효성 검증에 실패하면 오류를 발생시킨다.
- 설치 : yarn add joi
에러 처리 미들웨어
1
2
3
4
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Something broke!');
});
This post is licensed under CC BY 4.0 by the author.

