아래는 toss-payment 연동을 하는 전체 코드 입니다. 아래 코드를 통해 express 매소드에 대해 알아보려고 합니다.
express.use는 Express.js 애플리케이션에 미들웨어를 추가할 때 사용하는 메서드입니다. 미들웨어는 요청과 응답 사이에서 동작하는 중간 소프트웨어로, 다양한 기능을 추가하거나 요청 및 응답을 수정하는 데 사용됩니다.
express.static은 미들웨어 함수입니다. 이 함수를 사용하여 정적 파일을 제공할 디렉토리를 설정하는 부분입니다. ./client는 클라이언트 측 정적 파일이 위치한 디렉토리 경로를 나타냅니다. 즉, 클라이언트 측 웹 페이지에 필요한 HTML, CSS, JavaScript 파일 등이 이 디렉토리에 저장되어 있어야 합니다.
이렇게 설정된 express.static 미들웨어는 Express 애플리케이션이 요청 경로에 따라 ./client 디렉토리 내의 정적 파일을 찾아서 클라이언트에게 제공합니다. 예를 들어, 클라이언트가 /styles.css 경로로 요청하면, 이 미들웨어는 ./client/styles.css 파일을 찾아 응답으로 반환하게 됩니다. 이를 통해 정적 파일을 쉽게 제공하고 웹 페이지를 구성할 수 있습니다.
app.get("/", (req, res) => {
const path = resolve("./client/index.html");
res.sendFile(path);
});
설정된 파일 경로에서 파일을 읽어와 클라이언트에게 전송합니다. 클라이언트의 웹 브라우저는 해당 파일을 받고 렌더링하여 화면에 표시할 것입니다.
const encryptedSecretKey = "Basic " + Buffer.from(secretKey + ":").toString("base64");
이 문자열을 바이너리 데이터로 변환하는 부분입니다. Buffer는 Node.js에서 제공되는 데이터 버퍼 클래스로, 이진 데이터를 다루는 데 사용됩니다.
https://webpack.kr/configuration/resolve/
https://www.npmjs.com/package/got
const express = require("express");
const app = express();
const { resolve } = require("path");
const got = require("got");
app.use(express.static("./client"));
app.get("/", (req, res) => {
const path = resolve("./client/index.html");
res.sendFile(path);
});
app.get("/success", async (req, res) => {
const { paymentKey, orderId, amount } = req.query;
/**
* 토스페이먼츠 API는 시크릿 키를 사용자 ID로 사용하고, 비밀번호는 사용하지 않습니다.
* 비밀번호가 없다는 것을 알리기 위해 시크릿 키 뒤에 콜론을 추가합니다.
* @see https://docs.tosspayments.com/reference/using-api/authorization#%EC%9D%B8%EC%A6%9D
*/
const encryptedSecretKey =
"Basic " + Buffer.from(secretKey + ":").toString("base64");
try {
const response = await got.post(
"https://api.tosspayments.com/v1/payments/" + paymentKey,
{
headers: {
Authorization: encryptedSecretKey,
"Content-Type": "application/json",
},
json: {
orderId: orderId,
amount: amount,
},
responseType: "json",
}
);
console.log(response.body);
// TODO: 구매 완료 비즈니스 로직 구현
const path = resolve("./client/success.html");
res.sendFile(path);
} catch (error) {
res.redirect(
`/fail?code=${error.response?.body?.code}&message=${error.response?.body?.message}`
);
}
});
app.get("/fail", (req, res) => {
var path = resolve("./client/fail.html");
res.sendFile(path);
});
app.listen(8080, () => console.log(`Node server listening on port ${8080}!`));