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
'프로젝트3' 카테고리의 다른 글
Q&A (0) | 2023.02.21 |
---|---|
(2) “재고없음” 메세지 전달 시스템 구성 / 메세지를 Factory API로 전송하는 Lambda 구성 및 DLQ 추가 (0) | 2023.02.20 |
(2) 프로젝트 3 : MSA (0) | 2023.02.20 |
(1) DLQ 연결 및 K6 성능테스트 (0) | 2023.02.19 |
(1) Serverless를 이용한 Lambda - SQS - Lambda 구조 생성 (0) | 2023.02.18 |