TIL/Today I Learned
[TIL] 23.08.03 Today I Learned / node.js, express, SQLite
임성장
2023. 8. 3. 18:04
728x90
요약: express와 SQLite를 활용한 상품 관리 웹애플리케이션 백엔드 부분 제작
일시: 23.08.03
장소: 더휴먼컴퓨터아트아카데미
배운 점:
CORS
- CORS는 Cross-Origin Resource Sharing의 약자로, 웹 브라우저에서 발생하는 보안 상의 정책 중 하나
- 웹 브라우저는 보안 상의 이유로 동일한 출처(Same Origin)가 아닌 서버로부터 리소스를 요청하는 것을 제한
- CORS는 이러한 정책을 우회하기 위한 메커니즘이며, 서버가 웹 브라우저에게 특정 출처(도메인, 프로토콜, 포트)에서 온 요청을 허용하는 것을 의미
- 이를 통해 도메인 A의 웹 애플리케이션에서 도메인 B의 서버로 리소스를 요청하고 응답을 받을 수 있음
코드 설명
미들웨어 설정
app.use(express.json());
- JSON 파싱을 위해 express.json() 미들웨어를 사용
상품 조회(GET) API
app.get("/products", (req, res) => {
models.Product.findAll(
// {limit: 1}
{ order: [
["createdAt", "DESC"]
],
attributes:["id", "name", "price", "seller", "imageUrl", "createdAt"]
}
)
.then((result) => {
console.log("PRODUCT:", result);
res.send({
product: result,
});
})
.catch((error) => {
console.error(error);
res.send("에러발생");
});
});
- 라우팅
- app.get("/products", ...)으로 HTTP GET 메서드에 대한 /products 엔드포인트를 정의
- 즉, 클라이언트가 서버의 /products 경로에 GET 요청을 보낼 때 이 핸들러 함수가 호출
- 데이터베이스 조회
- models.Product.findAll(...)을 사용하여 데이터베이스의 Product 모델에서 모든 상품 정보를 조회
- findAll 메서드는 데이터베이스에 있는 모든 레코드를 조회하는 메서드
조회된 상품 정보는 result에 저장
- 조회 옵션
- order 속성은 상품을 어떤 순서로 정렬할지를 설정
- attributes 속성은 조회 결과에서 어떤 필드들을 선택할지를 설정
- 응답
- 조회된 상품 정보는 { product: result }와 같은 형태로 클라이언트에게 응답
상품 생성(POST) API
app.post("/products", (req, res) => {
const body = req.body;
const { name, price, seller, imageUrl, description } = body;
models.Product.create({
name,
price,
seller,
imageUrl,
description,
})
.then((result) => {
console.log("상품생성 결과:", result);
res.send({ result });
})
.catch((err) => {
console.error(err);
});
res.send({
body,
});
});
- 라우팅
- app.post("/products", ...)으로 HTTP POST 메서드에 대한 /products 엔드포인트를 정의
- 즉, 클라이언트가 서버의 /products 경로에 POST 요청을 보낼 때 이 핸들러 함수가 호출
- 요청 바디 파싱
- req.body를 통해 클라이언트가 POST 요청으로 보낸 데이터를 받아옴.
- const { name, price, seller, imageUrl, description } = body;를 통해 요청 바디에서 필요한 상품 정보를 추출
- 상품 생성
- models.Product.create(...)를 사용하여 데이터베이스에 새로운 상품을 생성
- create 메서드는 데이터베이스에 새로운 레코드를 추가하는 메서드
- 응답
- 생성된 상품 정보는 { result }와 같은 형태로 클라이언트에게 응답되고, result라는 키로 생성 결과 확인
특정 상품 조회(GET) API
app.get("/products/:id", (req, res) => {
const params = req.params;
const { id } = params;
models.Product.findOne({
where: {
id,
},
})
.then((result) => {
console.log("product:", result);
res.send({
product: result,
});
})
.catch((err) => {
console.error(err);
res.send("상품조회 중 에러 발생");
});
});
- 라우팅
- app.get("/products/:id", ...)으로 HTTP GET 메서드에 대한 /products/:id 엔드포인트를 정의
- 즉, 클라이언트가 서버의 /products/상품ID 경로에 GET 요청을 보낼 때 이 핸들러 함수가 호출
- ":id"는 파라미터로 동적인 상품 ID를 의미
- 파라미터 추출
- req.params를 통해 클라이언트가 요청한 URL에 있는 파라미터들을 받아옴.
- 이 코드에서는 id 파라미터를 추출
- 예를 들어, 클라이언트가 /products/123과 같이 요청하면, id 변수에는 "123"이 저장
- 상품 조회
- models.Product.findOne(...)를 사용하여 데이터베이스에서 해당 id를 가진 상품을 조회
findOne 메서드는 데이터베이스에서 특정 레코드를 찾는 메서드 - where 속성을 사용하여 id 필드가 클라이언트가 요청한 id와 일치하는 상품을 조회
- models.Product.findOne(...)를 사용하여 데이터베이스에서 해당 id를 가진 상품을 조회
- 응답
- 조회된 상품 정보는 { product: result }와 같은 형태로 클라이언트에게 응답
- 클라이언트는 product라는 키로 조회 결과를 얻을 수 있음
서버 시작
app.listen(port, () => {
models.sequelize
.sync()
.then(() => {
console.log("DB 연결 성공");
})
.catch((err) => {
console.error(err);
console.error("db연결 에러");
process.exit();
});
});
- 서버 실행
- app.listen(port, ...)을 사용하여 서버를 실행
- port 변수에 저장된 포트 번호로 서버가 실행
- 데이터베이스 연결
- models.sequelize.sync()를 호출하여 데이터베이스와의 연결을 설정
- sequelize 객체는 Sequelize 라이브러리를 사용하여 데이터베이스와 상호작용하는데 사용되는 객체
- sync() 메서드는 Sequelize 모델과 데이터베이스 간의 동기화를 수행
- 즉, 모델을 데이터베이스에 테이블로 생성하거나 테이블 간의 관계를 설정하는 등의 작업을 수행
- 연결 성공/실패 처리
- sync() 메서드는 Promise를 반환하며, 성공적으로 연결되었을 때 then() 블록이 실행
- 연결에 실행하면 process.exit()를 호출하여 서버를 강제로 종료
- 이렇게 서버를 종료하는 이유는 데이터베이스 연결이 필수적이므로, 연결에 실패한 경우 서버를 계속 실행할 필요가 없기 때문
부족한 점:
728x90