
10์ ์ค์๋ถํฐ ์์๋ ์์ฝ๋ ํ์คํ ๋ถํธ์บ ํ, ๊ทธ๊ฐ JavaScript, HTML, CSS๋ฅผ ํตํด ๊ธฐ์ด๋ฅผ ๋ค์ง๋ฉฐ, ํ๋ก ํธ์๋์์๋ ๋ ๋์๊ฐ React, SASS ๋ฐฑ์๋์์๋ Node.js, Express, MySQL๊ณผ MVC Pattern์ ์ ์ฉํ Layered pattern, ์๋ฒ์ ํต์ ๊ณผ์ ๋ฑ์ ํ์ตํ๋ฉฐ, ๊ทธ๊ฐ์ ํ์ต ๊ณผ์ ์ ๋ค์ง๊ธฐ ์ํ ํ ํ๋ก์ ํธ๋ฅผ ์์ํ๊ฒ ๋์์ต๋๋ค.
ํ ํ๋น 4~5๋ช
์ ๊ตฌ์ฑ์์ ์ด๋ค ํ์ ํ์๋ค์ด ๊ตฌํํด๋ณด๊ณ ์ถ์๋ ์น์ฌ์ดํธ๋ฅผ ํด๋ก ์ฝ๋ฉํ๋ฉฐ, ๊ทธ๊ฐ ๋ฐฐ์ด ํ๋ก ํธ์๋์ ๋ฐฑ์๋ ๊ธฐ์ ๋ค์ ์ ์ฉํด๋ณด๋ฉฐ ๋ถ์กฑํ ๋ถ๋ถ์ ์ ๊ฒํ๊ณ , ๊ณต๋ถํ๋ ๋ถ๋ถ์ ๋ณต์ตํ๋ฉฐ, ํ๋ก์ ํธ์์ ํ์ํ ๊ธฐ์ ๋ค์ ๋ ๋ฐฐ์ฐ๊ณ ์ฑ์ฅํ ์ ์๋, ์ฌ๋ฌ๋ชจ๋ก ์ฅ์ ์ด ๋ง์ ํ๋ก์ ํธ์๋ค๋ ์๊ฐ์ด ๋ญ๋๋ค.
์ฐ๋ฆฌ ํ์ Marple Shop ํํ์ด์ง๋ฅผ ํด๋ก ์ฝ๋ฉํ๊ธฐ๋ก ์ ํ์์ต๋๋ค. ํํ์ด์ง๋ ํฐ ๋ฒ์ฃผ๋ก ๋ฉ์ธ ํ์ด์ง, ๋ฆฌ์คํธ ํ์ด์ง, ์์ธ ํ์ด์ง, ๋ก๊ทธ์ธ/ํ์๊ฐ์
ํ์ด์ง ๋ก ๋๋์ด์ก์ผ๋ฉฐ, ํ์์ด 5๋ช
์ด์๋ ์ฐ๋ฆฌ ํ์ ๋ฉ์ธ ํ์ด์ง์์ ํ๋ก์ ํธ์ ๋น์ค์ด ํด ๊ฒ์ด๋ผ๊ณ ์๊ฐํ, ์ฌ๋ผ์ด๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ์ญํ ์ ๋ฉ์ธ ํ์ด์ง์์ ๋ถ๋ฆฌํ์ฌ, ํํ์ด์ง์ 4๊ฐ์ ๋ฒ์ฃผ, ๊ทธ๋ฆฌ๊ณ ์ฌ๋ผ์ด๋ ๊ธฐ๋ฅ์ ํฌํจํ์ฌ ์ด 5๊ฐ์ง์ ์ญํ ์ ํ๋ก ํธ์๋์ ๋ฐฑ์๋์์ ๊ฐ์ 1๊ฐ์ฉ ์ญํ ์ ๋งก์ ํํ๋ก์ ํธ๋ฅผ ์งํํ์์ต๋๋ค.
ํ ํ๋ก์ ํธ์์ ์ ์ญํ ์ ํ๋ก ํธ์๋์์๋ ๋ํ
์ผ ํ์ด์ง / ๋ฐฑ์๋์์๋ ๋ก๊ทธ์ธ / ํ์๊ฐ์
์ ๋งก๊ฒ ๋์์ผ๋ฉฐ, ์ดํ ์ถ๊ฐ ๊ธฐ๋ฅ ๊ตฌํ ์ฌํญ์์ ์ข์์ ๊ธฐ๋ฅ ๊ณผ ์ฅ๋ฐ๊ตฌ๋ ์ถ๊ฐ, ์ญ์ , ์์ ๊ธฐ๋ฅ์ ์ถ๊ฐ์ ์ผ๋ก ๊ตฌํํ์์ต๋๋ค.
(ํ๋จ ์ด๋ฏธ์ง ํด๋ฆญ์, Youtube ๋งํฌ๋ก ์ ํ๋ฉ๋๋ค!)
Back-end
MySQL์ ์ด์ฉํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ (๊ณตํต)
๋ก๊ทธ์ธ, ํ์๊ฐ์ API (๋์ ์ญํ )
์นดํ ๊ณ ๋ฆฌ API
์ํ ๋ฆฌ์คํธ & ํํฐ๋ง & ์ ๋ ฌ API
์ํ ์์ธ API
Carousel API
์ ๋๋ฉ์ด์ ์ฌ๋ผ์ด๋ API
์ฅ๋ฐ๊ตฌ๋ API (๋์ ์ญํ )
์ข์์ API (๋์ ์ญํ )
Front-end
ํ์๊ฐ์ / ๋ก๊ทธ์ธ / ๋ง์ดํ์ด์ง
Top / Footer / Nav
์ํ ๋ฆฌ์คํธ API ํธ์ถํ์ฌ UI ๊ตฌํ
Carousel UI ๊ตฌํ
์ ๋๋ฉ์ด์ ์ฌ๋ผ์ด๋ UI๊ตฌํ
๋ฐฑ์๋์์๋ ๋ก๊ทธ์ธ ํ์๊ฐ์ API, ์ฅ๋ฐ๊ตฌ๋ API, ์ข์์ API ๋ฅผ ๊ตฌํํ์์ต๋๋ค.
๋ณธ๋๋ ๋ก๊ทธ์ธ ํ์๊ฐ์ API ๋ง์ด ์ ์ ์ญํ ์ด์์ง๋ง, ํ๋ก ํธ์๋์์์ ๋ํ ์ผ ํ์ด์ง ์์ ์ ํ๋ฉด์, ๊ฐ๊ณต๋์ง ์์ ๋ฐ์ดํฐ๋ค์ ๋ํ ์ผ ํ์ด์ง์ ์ ํฉํ๊ฒ ๊ฐ๊ณตํ๋ ์์ ์ ๊ฑฐ์น๋ฉด์, ํด๋น ๋ฐ์ดํฐ๋ค์ ์ฅ๋ฐ๊ตฌ๋์ ์ด์ฉํ๋๊ฒ ํธ๋ฆฌํ๋ค๊ณ ์๊ฐํ์์ผ๋ฉฐ (ํ์ฅ์ฑ์ ๊ณ ๋ คํ์ ๋ ์ ํฉํ์ง ์์ ๋ฐฉ๋ฒ์ด์์ต๊ธฐ์, 2์ฐจ ํ๋ก์ ํธ์์๋ ํ์ฅ์ฑ์ ๊ณ ๋ คํ ๋ฐฉํฅ์ ์ฑํํ ์ ์์์ต๋๋ค.) ์ข์์ ๊ธฐ๋ฅ ๊ตฌํ๋ CRUD์ CD๋ฅผ ํ์ฉํ๋ค๋ฉด ์ฝ๊ฒ ๊ตฌํ ๊ฐ๋ฅํ ๊ฒ์ด๋ผ๊ณ ์๊ฐ๋์ด ๊ธฐ๋ฅ ๊ตฌํ์ ๋งก์์ต๋๋ค.
(ํ์๊ฐ์
๊ณผ์ )


(๋ก๊ทธ์ธ ๊ณผ์ )

const { userDao, productCartDao } = require('../models/');
const bcrypt = require('bcrypt');
const token = require('../utils/token');
const signIn = async (email, password) => {
const user = await userDao.getUserByEmail(email);
const isSame = bcrypt.compareSync(password, user.password);
if (!user) {
const error = new Error('INVALID_USER');
error.statusCode = 400;
throw error;
}
if (!isSame) {
const error = new Error('INVALID_USER');
error.statusCode = 400;
throw error;
}
const signToken = token.signToken(user.email);
return signToken;
};
const signUp = async (name, email, password) => {
const userData = await userDao.getUserByEmail(email);
if (userData) {
const error = new Error('EMAIL IS DUPLICATED');
error.statusCode = 400;
throw error;
}
const hashedPassword = bcrypt.hashSync(password, 10);
return await userDao.createUser(name, email, hashedPassword);
};
const jwt = require('jsonwebtoken');
const salt = 'SALTSALTSALT';
const signToken = (email) => {
return jwt.sign({ id: email }, salt, { expiresIn: '30m' });
};
const verifyToken = (token) => {
try {
return jwt.verify(token, salt);
} catch (err) {
return null;
}
};
module.exports = { signToken, verifyToken };
JWT, Bcrypt ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ, ๋น๋ฐ๋ฒํธ๋ฅผ ์ํธํ์์ผ ์ ์ฅํด์ฃผ๋๋ก ํด์ฃผ๊ณ , userDao์์ ๋ฐ์์จ user์ email์ JWT๋ฅผ ํตํด ํ ํฐ์ผ๋ก ๋ฐํํด์ฃผ๋๋ก ํ์์ต๋๋ค.
.gif)
ํ๋ก ํธ ์๋์์ ์ ์ญํ ์ ๋ํ ์ผ ํ์ด์ง ๊ตฌํ์ ๋๋ค.
HTML,CSS,React๋ฅผ ํ์ฉํ์ฌ ๋ชจ๋ ๋ ์ด์์์ ๊ตฌํํ์์ผ๋ฉฐ, ๋ํ ์ผ ํ์ด์ง API์ ๋ฐ์ดํฐ๋ค์ ํตํด ์ ํ ์ด๋ฏธ์ง, ์ฌ์ด์ฆ ์์ ์ ํ์ฐฝ๊ณผ ๊ฐ๊ฒฉ์React์useState()๋ฅผ ํตํด ์ค์ ํด์ฃผ์์ต๋๋ค.
๋ํ ์ฌ์ด์ฆ ํน์ ์์์ด ์ ํ๋์ง ์๊ณ ์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ๋ฅผ ๋๋ฅผ ๊ฒฝ์ฐ์ ํด๋น ๊ฒฝ์ฐ์ ๋ฐ๋ฅธalert()์ฐฝ์ ๊ตฌํํด์ฃผ์์ต๋๋ค.
.gif)
๋ฐฑ์๋์์ ๊ตฌํํ ์ฅ๋ฐ๊ตฌ๋ ์ถ๊ฐ ๊ธฐ๋ฅ์ ๋๋ค. ๋ํ ์ผ ํ์ด์ง์ ์ ํ ์ ๋ณด์ ์ ์ ๊ฐ ์ ํํ ์ฌ์ด์ฆ, ์์, ์๋ ๋ฑ์ ์ ๋ณด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์
cartsํ ์ด๋ธ์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํด์ฃผ๋๋ก ํ์์ต๋๋ค.
.gif)
CRUD์Delete๋ฅผ ํตํด ์ฅ๋ฐ๊ตฌ๋์ ์ญ์ ๊ธฐ๋ฅ์ ๊ตฌํํ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์cartsํ ์ด๋ธ์์ ํด๋น ์ฅ๋ฐ๊ตฌ๋ ํญ๋ชฉ์ ์ญ์ ํด์ฃผ๋๋ก ์ฒ๋ฆฌํ์์ต๋๋ค.
ํ์ฌ ์ด ๊ธ์ ์ฐ๋ ์์ ์ 2์ฐจ ํ๋ก์ ํธ์ธ
๋์ดํค ํด๋ก ์ฝ๋ฉํ๋ก์ ํธ๊น์ง ๋ชจ๋ ์๋ฃ๋ ์ํฉ์์ ์์ฑํ๋ ํฌ์คํธ์ ๋๋ค. 1์ฐจ ํ๋ก์ ํธ์ธ๋งํผ ๋ถ์กฑํ ์ ์ด ๋ง์์ผ๋ฉฐ, ์ ์ ๋ถ์กฑํ ์ ์ 1์ฐจ ํ๋ก์ ํธ์์ ๊นจ๋ฌ์๊ธฐ์ 2์ฐจ ํ๋ก์ ํธ์์ ํด๋น ๋ถ๋ถ๋ค์ ๊ฐ์ ํ๊ณ ๋ณด์ํ ์ ์์๊ธฐ์ ํฐ ์๋ฏธ๊ฐ ์๋ ํ๋ก์ ํธ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ฌด์๋ณด๋ค ํ๊ณผ์ ํ์ ์์์ ์ด๋ค ํฌ์ง์ ์ ์ง์ค์ ํด์ผ ํ๋ฉฐ,Gitํ์ ์ ๋ํ ํ๋์ ๊ธฐ์ ๋ฑ์ ๋ถ๋ชํ๋ฉฐ ๋ฐฐ์ธ ์ ์์๊ธฐ์, ํ ํ๋ก์ ํธ์์ ๊ฐ์ถฐ์ผํ ์์ธ๋ฅผ ๋ฐฐ์ ๋ค๊ณ ์๊ฐํฉ๋๋ค.
MVC Pattern,REST API์ ์ ์ฉ ๋ฑ๋ ์ต์ํด์ง ์ ์์์ผ๋ฉฐ, ํด๋น ๊ธฐ์ ๋ค์ ํ์์ฑ์ ๋์ฑ ์ ์คํ ๋๊ผ์ต๋๋ค.
์ด๊ธฐModeling๊ณผ์ ์ ์ค์์ฑ,์ฟผ๋ฆฌ์ ๋ํ ์ดํด์ ํ์ฉ ์ญ์ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ก์จ ๋ฅ์ํ๊ฒ ๋ค๋ค์ผํ ์ ์ด๋ผ๊ณ ์๊ฐํ์ผ๋ฉฐ, ์ ๋ ์ด ๋ถ๋ถ์์ ์ฌ๋ฏธ์๊ณ , ํฅ๋ฏธ๋ฅผ ๋๋ผ๋ฉฐ ์๊ฐ ๊ฐ๋์ค ๋ชฐ๋๋ ์ ๋ชจ์ต์ ๋ดค์ผ๋ฉฐ, ํ๋ก ํธ ์๋๋ ์ข์ง๋ง ๋ฐฑ์๋์ชฝ์ผ๋ก ๋ง์์ ๊ตณํ๊ฒ ๋์์ต๋๋ค.
2์ฐจ ํ๋ก์ ํธ๋ง์ ๋๋ ํ ์์ ์ผ๋ก ์์ง๋ ๋ฐฐ์์ผ ํ๊ณ ๊ณต๋ถํด์ผํ ์ฐ๋ค์ด ๋ง์ต๋๋ค.
๋ถ๋ชํ๊ณ ๋์ด์ ธ๋, ๊ณ์ํด์ ๋ค์ ์ผ์ด๋๋ฉฐ ์์ผ๋ก ๋์๊ฐ๋ ๊ฐ๋ฐ์๊ฐ ๋๊ณ ์ถ๋ค๋ ํฌ๋ถ๊ฐ ์๊ธฐ๋ ํ๋ก์ ํธ์์ต๋๋ค. ๊ธด ๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!