프로젝트3

(2) Lambda 서버 - DB 연결

FYE 2023. 2. 20. 21:49

 

 

Step 1 : Lambda 서버(Sales API) - DB 연결

 

- sales-api 디렉토리에서 Sales API를 확인할 수 있다.

- 데이터베이스 연결

- 로컬에서 .env 파일을 활용하고, 배포시에는 AWS 콘솔에서 직접 입력하기 → 코드에 credential을 넣지 않도록 주의

- serverless를 통해 lambda를 생성한다면 환경변수로 등록하는 방법을 고려해보기

- 연결 후 sales-api/init.sql을 참고하여 자신의 데이터베이스에 테이블을 생성하고 재고를 추가하기

- cURL 요청을 통해 데이터베이스의 재고 정보에 따라 다른 응답을 보내는 것을 확인하기

 

 


DB를 사용하기 전에 MySQL 설치하기

 

https://dev.mysql.com/downloads/mysql/

 

MySQL :: Download MySQL Community Server

Select Operating System: Select Operating System… Microsoft Windows Ubuntu Linux Debian Linux SUSE Linux Enterprise Server Red Hat Enterprise Linux / Oracle Linux Fedora Linux - Generic Oracle Solaris macOS Source Code Select OS Version: All Windows (x86

dev.mysql.com

 

 


시작하기 전 디렉토리 구조부터 살펴보았습니다

 

 

데이터베이스 연결

데이터베이스 접속

mysql -h HOSTNAME -u USERNAME -p DATABASE;

-u 

사용자 이름(username)을 지정하는 옵션이다. 일반적으로 MySQL을 설치하면 root 사용자가 생성되며, 이 사용자로 접속할 경우 -u root와 같이 지정한다.

 

-p

비밀번호 (password)를 지정하는 옵션이다. 이 옵션을 사용하면 MySQL 서버로 접속할 때 비밀번호를 입력해야 한다.

 

-h

MySQL 서버의 호스트 이름(host name)을 지정하는 옵션이다. 기본값은 localhost이며 만약 다른 호스트에 있는 MySQL서버에 접속하려면 -h 옵션 뒤에 해당 호스트의 이름이나 IP 주소를 지정해야 한다. 

 

 

 

이번에 사용한 MySQL 쿼리

 

SHOW DATABASES;
MySQL 서버에 있는 모든 데이터베이스의 목록을 보여준다.

 

DESC product;
product라는 이름의 테이블에 대한 구조를 보여준다. 
테이블의 각 열(column)에 대한 정보(이름, 데이터 유형, 크기, 기본값 등)를 보여준다.

 

SELECT product_id FROM product;
product 테이블에서 product_id 열의 값을 모두 선택한다.
product 테이블에서 product_id 열의값만 선택하므로 결과 집합은 product_id 열만 포함하게 된다.

 

 

SELECT * FROM product;
product 테이블에서 모든 열의 값을 선택한다.
이 쿼리는 product 테이블의 모든 열의 값을 선택하므로 결과 집합에는 product_id, product_name, product_price 등의 모든 열이 포함된다.
'*'은 모든 열을 의미한다.

 

 

 

 


 

.env에 환경변수 넣어주기

HOSTNAME=hostname
USERNAME=admin
PASSWORD=admin
DATABASE=databasename

sales-api 디렉토리안에 .env파일을 만들어주었습니다.

 

 


 

cURL 요청을 통해 데이터베이스의 재고 정보에 따라 다른 응답을 보내는 것을 확인해보자

 

npm install
npm start

먼저 npm install 후

서버실행시켜주기

 

 

 

 

GET, POST요청 결과 확인

const {
  connectDb,
  queries: { getProduct, setStock }
} = require('./database')

app.get("/product/donut", connectDb, async (req, res, next) => {
  const [ result ] = await req.conn.query(
    getProduct('CP-502101')
  )

  await req.conn.end()
  if (result.length > 0) {
    return res.status(200).json(result[0]);
  } else {
    return res.status(400).json({ message: "상품 없음" });
  }
});

app.post("/checkout", connectDb, async (req, res, next) => {
  const [ result ] = await req.conn.query(
    getProduct('CP-502101')
  )
  if (result.length > 0) {
    const product = result[0]
    if (product.stock > 0) {
      await req.conn.query(setStock(product.product_id, product.stock - 1))
      return res.status(200).json({ message: `구매 완료! 남은 재고: ${product.stock - 1}`});
    }
    else {
      await req.conn.end()
      return res.status(200).json({ message: `구매 실패! 남은 재고: ${product.stock}`});
    }
  } else {
    await req.conn.end()
    return res.status(400).json({ message: "상품 없음" });
  }
});

get 요청path  /product/donut

post 요청path  /checkout

 

 

curl -X GET localhost:8080/product/donut

curl -X POST localhost:8080/checkout