Simple E-Commerce Web Application
2024.4. ~ 2024. 5.

URL : https://pjc1991.dev/
๐ Summary
์๋ก์ด ์คํ์ ์ตํ๊ธฐ ์ํด์ ๊ฐ์ฅ ๋จ์ํ ํํ์ ์น ์๋น์ค๋ฅผ ๋ค์ ํ๋ฒ ์ฒ์๋ถํฐ ๋ง๋๋ ์ฐ์ต์ ์งํํ์ต๋๋ค. NodeJs + ExpressJs๋ฅผ ์ด์ฉํ ์น ์ดํ๋ฆฌ์ผ์ด์
์ MongoDB์ ํตํฉํด์ ๊ฐ๋ฐ์ ์งํํ์ต๋๋ค. ์ดํ๋ฆฌ์ผ์ด์
๊ตฌ์กฐ๋ ์ฌํํ๊ฒ ๊ฐ์ ธ๊ฐ๋ฉด์๋, ์๋น์ค ๋ฐฐํฌ ๋ฐฉ์ ๋ฑ์ ๋ค๋ฅด๊ฒ ๊ฐ์ ธ๊ฐ๊ฒ ๋์์ต๋๋ค.
์ด๋ฒ ์ดํ๋ฆฌ์ผ์ด์
์ ์ด๋๊น์ง๋ ์ฐ์ต์ธ๋งํผ ์ค์ ์๋น์ค๋ฅผ ๋ชฉํ๋ก ํ์ง ์๊ณ ๊ฐ๋ฐํ๊ฒ ๋์์ต๋๋ค.
๐ฌ Main Works
- ๋ฐฐํฌ ๋ฌธ์
- ์ต์ํ AWS ๋ด์ ๊ฐ์ฅ ์ ๋ ดํ ์๋น์ค(EC2 ํน์ Lightsail) ๋ฅผ ์ฌ์ฉํ์ฌ๋ ์ 5๋ฌ๋ฌ ์ ๋์ ๋น์ฉ์ ๊ฐ์ํด์ผํ์ต๋๋ค. ๊ทธ๋ฌ๋, ์ด๋๊น์ง๋ ์ฐ์ต ์ฐจ์์ ์๋น์ค๋ฅผ ๊ตฌํํ๋๋ฐ์ ์ด๋ฐ ๋น์ฉ์ ์ง๋ถํ ํ์๋ ์์์ต๋๋ค.
- Glitch ๋ฑ์ ์ /๋ฌด๋ฃ ํธ์คํ
์๋ฒ๋ฅผ ์ฌ์ฉํ๋ ์ ํ์ง๋ ์์๋ค. ๋จ ํธ์คํ
์๋ฒ ํน์ ์ ์๋ฒ ์์ ๋ ๋ฌธ์ ๊ฐ ์๋ค๋ ์ , ์๋ฒ ์์ง๋์ด๋ง์ ๋ํ ๊ฒฝํ์ ํ๋ณดํ ์ ์๋ค๋ ์ ์์ ํธ์คํ
์๋ฒ๋ ์ฌ์ฉํ์ง ์๊ธฐ๋ก ํ์ต๋๋ค.
- ๊ธฐ์กด์ ๊ฐ์ง๊ณ ์๋ ์ ์ ๋ ฅ SBC(Odroid N2+)๋ฅผ ์ด์ฉํด์ ๋ฏธ๋ ์๋ฒ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ผ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ๋ก ํ์ต๋๋ค. ์ฌ์ฉ๋์ ์๊ฐํ๋ฉด ์๊ฐ๋น ์ ๋ ฅ์๋ชจ๋์ 3Wh ๋ก ์ ์ฝ 500์ ์ ๋์ ๋น์ฉ์ด ์์๋์์ต๋๋ค.
- ํ๋ผ์ด๋น ๋คํธ์ํฌ์ CI ๋ฌธ์
- Dedicated Server๋ฅผ ์ฌ์ฉํ ๊ฒ์ผ๋ก ๋ฐ์ํ ์ฒซ ๋ฒ์งธ ์ด์๋ก, ์ง์์ ํตํฉ์ด ๊น๋ค๋กญ๋ค๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
- Github Actions๋ฅผ ์ด์ฉํ ๋ฐฐํฌ ์๋ํ๋ฅผ ๊ตฌํํ๋ ค๊ณ ํ์ผ๋, ๋คํธ์ํฌ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
- Dedicated Server์ ๋ํด Github Actions Runner ์์ ์ ๊ทผํ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ๋ฐฐํฌ๋ฅผ ํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ์ต๋๋ค.
- Runner ์์ SSH๋ฅผ ํตํด Dedicated Server์ ์ ์ํ์ฌ ๋ฐฐํฌ๋ฅผ ์งํํ๋ ๋ฐฉ๋ฒ๋ ์์์ผ๋, Dedicated Server ์์ฒด์ ๋ณด์ ์์ฒด๊ฐ ์น๋ฐํ๊ธฐ ์ด๋ ค์ด ์ํฉ์์ ์ธ๋ถ IP์ SSH ์ ๊ทผ์ ํ์ฉํ๋ ๊ฒ์ ๋ณด์์ ์น๋ช
์ ์ผ๋ก ์์์ด ๋์์ต๋๋ค.
- ๊ณ ์ฌ ๋์ Self-hosted Runner๋ฅผ Dedicated Server์ ์ง์ ์ถ๊ฐํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ์ฐํํ์ต๋๋ค.
- ๋น๋/๋ฐฐํฌ ์์ฒด๋ฅผ ์๋ฒ์์ ์ง์ ์ฒ๋ฆฌํ๋ ๊ฒ์ผ๋ก ๋ฆฌ์์ค๋ ์ถ๊ฐ๋ก ์๋ชจํ๊ฒ ๋์์ง๋ง ํฐ ๋ฌธ์ ๋ ์์๋์ง ์์๊ณ , ๋ณด์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ฑ๋ก ์ฝ๊ฒ ๋ฐฐํฌ๋ฅผ ์งํํ ์ ์์์ต๋๋ค.
- SSL ์ธ์ฆ์์ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ
- ์ด ํ๋ก์ ํธ๋ ๊ฒฐ์ ๋ชจ๋์ ํฌํจํ๊ณ ์์๊ณ , ๋ณด์์ ์ธ์ฆ์๋ฅผ ํ์ฌํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค. ๋ํ ์ฐ๊ฒฐํ๊ธฐ ์ํด ์ค๋นํ ๋๋ฉ์ธ์ด SSL์ ํ์ ์ฌ์์ผ๋ก ์๊ตฌํ๋ ์ฌ์์ด์๊ธฐ ๋๋ฌธ์ (.dev ๋๋ฉ์ธ์ HTTP ์ ์์ด ๋ถ๊ฐ๋ฅํ๊ณ HTTPS ์ ์๋ง์ด ๊ฐ๋ฅํ๋ค.) SSL ์ธ์ฆ์๋ฅผ ํ์ฌํด์ผ ํ์ต๋๋ค.
- Dedicated Server ์๊ธฐ ๋๋ฌธ์ Letโs Encrypt์ CertBot์ ๊ฐ๋ํ๋๋ฐ์๋ ํฐ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ๋จ, ExpressJs ์๋ฒ์ ์ด๋ค ์์ผ๋ก SSL ์ฐ๊ฒฐ์ ํ ์ง๊ฐ ๋ฌธ์ ๊ฐ ๋์์ต๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก NodeJs ์๋ฒ์์ SSL ์ฐ๊ฒฐ์ ๊ตฌํํ ๋์๋ ์ธ์ฆ์ ํ์ผ์ NodeJs FileServer๋ก ์ฝ๋ ๋ฐฉ์์ ๋ง์ด ์ฌ์ฉํ์ต๋๋ค. ์ฆ, ์ฝ๋ ๋ด์ SSL ์ธ์ฆ์์ ๊ด๋ จ๋ ๋ด์ฉ์ ์ถ๊ฐํ๋ ์์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค.
- ๊ฒ์ป๋๋ ๋ถ๋ถ์ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ์์ ๊ฐ์ ์ฝ๋๊ฐ ์๋ํ์ง ์๋๋ค๋ ๊ฒ์ด์์ต๋๋ค. SSL ์ธ์ฆ์๊ฐ ์ค์ ๋ก ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์, ํด๋น ์ฝ๋์ ๋ํ ๋ถ๊ธฐ ์ฒ๋ฆฌ ๋๋ ์์ธ ์ฒ๋ฆฌ๊ฐ ํ์ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌด์๋ณด๋ค ์๋ฒ ํ๊ฒฝ์ ํด๋น๋๋ ๋ด์ฉ์ด ์น ์ดํ๋ฆฌ์ผ์ด์
์ ์ฝ๋์ ์์ฑ๋๋ค๋ ๋ถ๋ถ์ด ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ ๋ฉด์์ ๋ถ์ ์ ํด๋ณด์์ต๋๋ค.
- ๊ฐ๋ฐ ํ๊ฒฝ์๋ https ๋ฅผ ์ ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์์์ต๋๋ค. ๋จ, ์ด ๊ฒฝ์ฐ์๋ ํ๊ฒฝ์ 3๊ฐ ์ด์ ๊ฐ์ง๊ณ ์์์ต๋๋ค. (Windows, Mac PC๋ฅผ ์ฌ์ฉํ๊ณ , Production ํ๊ฒฝ์ Ubuntu ์์ต๋๋ค.) ์ด ํ๊ฒฝ์ ๋ชจ๋ https ๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ๋ฐฐ๋ณด๋ค ๋ฐฐ๊ผฝ์ด ์ปค์ง๋ ์ผ์ด๊ธฐ๋ ํ๊ณ , ์ฌ์ ํ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ ๋ฉด์์ ๋ฐ๋์งํด๋ณด์ด์ง ์์์ต๋๋ค. ๋ํ public repository ๋ก ๊ณต๊ฐํ๊ณ ์๋๋๋งํผ ๋๊ตฌ๋ ์ฝ๊ฒ ๋ก์ปฌ์์ ๊ตฌ๋ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋์ต๋๋ค.
- ๋ฐ๋ผ์ ๋๋ ์ฝ๋ ๋ด์ SSL ์ฐ๋์ ํฌํจํ์ง ์๊ณ , Nginx์ ๋ฆฌ๋ฒ์ค ํ๋ก์๋ฅผ ํตํด์ SSL์ ์ ์ฉํ๋ ๋ฐฉ์์ ํํ์ต๋๋ค. ์ค์ ์ ๋ค์ ์ํ์ฐฉ์ค๊ฐ ์์์ง๋ง, ๋ฌธ์ ์์ด localhost:3000 ์ 433 ํฌํธ๋ก ํ๋ก์ํ๋๋ฐ์ ์ฑ๊ณตํ๊ณ , ๊ฐ์ง๊ณ ์๋ ๋๋ฉ์ธ๊ณผ์ ์ฐ๊ฒฐ๋ ๋ฌธ์ ์์ด ์งํ์ด ๊ฐ๋ฅํ์ต๋๋ค.
- ๊ฐ๋ฐํ๊ฒฝ๊ณผ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค
- ์ด ํ๋ก์ ํธ๋ MongoDB์ ์ฌ์ฉ์ ํ์๋ก ํ์ต๋๋ค.
- ๊ฐ๋ฐ ํ๊ฒฝ์ Kindergarten ์ด์ด์ผํ๊ธฐ ๋๋ฌธ์, local ๊ตฌ๋์ MongoDB Cluster ๋ฅผ ํ์๋ก ํ๋ ๊ฒ์ ๋ฐ๋์งํ์ง ์์์ต๋๋ค.
- MongoDB๋ฅผ ๊ฐ์ธ PC์ ์ค์นํ๋ ๋ฐฉ๋ฒ๋ ์์์ง๋ง, ํ๋ก์ ํธ ๊ฐ๋์ ์ํด DB ์ค์น๋ฅผ ์๊ตฌํ๋ ๊ฒ์ด ๋ฐ๋์งํ๊ฒ ๋๊ปด์ง์ง ์์์ต๋๋ค. (์ฌ๋ฌ ์น ์ดํ๋ฆฌ์ผ์ด์
์ ๊ตฌ๋ํ๋ค๋ณด๋ฉด ๊ฐ์ธ PC๊ฐ ๊ฐ์ข
DB๋ก ๋ฒ๋ํ๊ฒ ๋ ๊ฒ)
- Docker์ Docker-compose ๋ฅผ ์ด์ฉํด์ MongoDB Container ๋ฅผ ์ฆ์์ผ๋ก ์์ฑํ๋ ๊ฒ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
- Document DB์ Category ๋ฌธ์
- ์ด๋ฒ ํ๋ก์ ํธ๋ MongoDB๋ฅผ ์ด์ฉํด์ ์งํํ๊ฒ ๋์๋๋ฐ, ๊ธฐ์กด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ ๋ฌ๋ฆฌ ์กฐ์ธ์ด ๋ถ๊ฐ๋ฅํ์ต๋๋ค.
- MongoDB๋ RDBMS์ ๋นํด ์ฑ๋ฅ์ ์ด์ ์ด ์๊ณ scale up์ ํ๊ธฐ ์ฝ๋ค๋ ์ฅ์ ์ด ์์์ง๋ง ๋ํ๋ฉํธ๊ฐ์ ๊ด๊ณ์ฑ์ ์ถ๋ก ํ๊ธฐ ์ด๋ ค์ด ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
- ์ด๋ฒ ํ๋ก์ ํธ์์๋ ํ์ต์ ๋ชฉ์ ์ผ๋ก MongoDB๋ฅผ ์ ํํ์ฌ ์ฌ์ฉํ์ต๋๋ค.
- ๋๋ถ๋ถ์ ๊ธฐ๋ฅ์ ๋ฌธ์ ์์ด ์งํํ ์ ์์๋๋ฐ, ์นดํ
๊ณ ๋ฆฌ ์ค๊ณ์ ์ด๋ ค์์ด ์กด์ฌํ์ต๋๋ค.
- Product ์ํฐํฐ์ Category๋ฅผ ๋ด์ฅ์ํค๋ ๋ฐฉ์์ ํํ๋ฉด ๋ค์์ ์ํ์ ํ๋ฒ์ ๊ฐ์ ธ์ฌ ๋๋ ๋ฌธ์ ์์ด ์ฒ๋ฆฌํ ์ ์์์ต๋๋ค.
- ์ด ๊ฒฝ์ฐ Category์ ์์ ์ ๋ชจ๋ Product์ ๋ฐ์ํ๋ ๊ฒ์ด ๋๊ฐํด์ง๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
- Category๋ฅผ ๋ณ๊ฐ ํ
์ด๋ธ๋ก ๋ถ๋ฆฌํ๊ณ , Product์ ํด๋น ์นดํ
๊ณ ๋ฆฌ์ Id๋ฅผ ๋ด์ฅํ๋ ๋ฐฉ์์ ์ ํํ ์๋ ์์์ต๋๋ค.
- ์ด ๊ฒฝ์ฐ์๋ ์นดํ
๊ณ ๋ฆฌ์ ์์ ์๋ ๋ฌธ์ ๊ฐ ์์ง๋ง, ๋ค์์ ์ํ์ ํ๋ฒ์ ๊ฐ์ ธ์์ ๋ Category์ ๊ฐ์ Populate ํ๊ธฐ ์ํด ๋ง์ ์ฟผ๋ฆฌ๋ฅผ ์คํํด์ผํ๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
- ์ต์ข
์ ์ผ๋ก ์ ์ถฉ์์ผ๋ก categoryId์ category์ ๋
ธ์ถ๋๋ ํญ๋ชฉ(์ฃผ๋ก ์นดํ
๊ณ ๋ฆฌ ๋ช
)์ ๊ฐ์ด product์ ๋ด์ฅ์ํค๋ ๋ฐฉ์์ ํํ์ต๋๋ค.
- categoryId๊ฐ ๋ด์ฅ๋์ด์์ผ๋ฏ๋ก, category ์ update๊ฐ ์ผ์ด๋ ๋ ๋ชจ๋ ์นดํ
๊ณ ๋ฆฌ์ ๊ฐ์ ์์ ํ ์ ์์ต๋๋ค. ๋ด์ฅ๋ category์ ๊ฐ๋ค์ category์ update๊ฐ ์ผ์ด๋ ๋๋ง๋ค product์ ๋ค์ update๊ฐ ํ์ํ์ง๋ง, category์ update๋ product๋ category์ read ๋ณด๋ค ํจ์ฌ ์ ์ ๋น๋๋ก ๋ฐ์ํ์ต๋๋ค.
- category ๊ฐ๋ค์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ๋ฐ๋ก populate ํ ํ์์์ด ๋ค์์ product๋ฅผ ๊ฐ์ ธ์ ๋ฐ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํ์ต๋๋ค.
const productSchema = new Schema({
title: {
type: String,
required: true
},
price: {
type: Number,
required: true
},
/*... ...*/
category : {
categoryId: {
type: Schema.Types.ObjectId,
ref: 'Category',
required: true
},
categoryName: {
type: String,
required: true
}
},
/*... ...*/
๐คนUsed Stack
Node.js, Express.js, EJS template, HTML, Javascript, MongoDB, Docker, Docker compose, Mongoose