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와 일치하는 상품을 조회
  • 응답
    • 조회된 상품 정보는 { 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