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๋ฅผ ํตํด ํ ํฐ์ผ๋ก ๋ฐํํด์ฃผ๋๋ก ํ์์ต๋๋ค.
ํ๋ก ํธ ์๋์์ ์ ์ญํ ์ ๋ํ ์ผ ํ์ด์ง ๊ตฌํ์ ๋๋ค.
HTML
,CSS
,React
๋ฅผ ํ์ฉํ์ฌ ๋ชจ๋ ๋ ์ด์์์ ๊ตฌํํ์์ผ๋ฉฐ, ๋ํ ์ผ ํ์ด์ง API์ ๋ฐ์ดํฐ๋ค์ ํตํด ์ ํ ์ด๋ฏธ์ง, ์ฌ์ด์ฆ ์์ ์ ํ์ฐฝ๊ณผ ๊ฐ๊ฒฉ์React
์useState()
๋ฅผ ํตํด ์ค์ ํด์ฃผ์์ต๋๋ค.
๋ํ ์ฌ์ด์ฆ ํน์ ์์์ด ์ ํ๋์ง ์๊ณ ์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ๋ฅผ ๋๋ฅผ ๊ฒฝ์ฐ์ ํด๋น ๊ฒฝ์ฐ์ ๋ฐ๋ฅธalert()
์ฐฝ์ ๊ตฌํํด์ฃผ์์ต๋๋ค.
๋ฐฑ์๋์์ ๊ตฌํํ ์ฅ๋ฐ๊ตฌ๋ ์ถ๊ฐ ๊ธฐ๋ฅ์ ๋๋ค. ๋ํ ์ผ ํ์ด์ง์ ์ ํ ์ ๋ณด์ ์ ์ ๊ฐ ์ ํํ ์ฌ์ด์ฆ, ์์, ์๋ ๋ฑ์ ์ ๋ณด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์
carts
ํ ์ด๋ธ์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํด์ฃผ๋๋ก ํ์์ต๋๋ค.
CRUD
์Delete
๋ฅผ ํตํด ์ฅ๋ฐ๊ตฌ๋์ ์ญ์ ๊ธฐ๋ฅ์ ๊ตฌํํ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์carts
ํ ์ด๋ธ์์ ํด๋น ์ฅ๋ฐ๊ตฌ๋ ํญ๋ชฉ์ ์ญ์ ํด์ฃผ๋๋ก ์ฒ๋ฆฌํ์์ต๋๋ค.
ํ์ฌ ์ด ๊ธ์ ์ฐ๋ ์์ ์ 2์ฐจ ํ๋ก์ ํธ์ธ
๋์ดํค ํด๋ก ์ฝ๋ฉ
ํ๋ก์ ํธ๊น์ง ๋ชจ๋ ์๋ฃ๋ ์ํฉ์์ ์์ฑํ๋ ํฌ์คํธ์ ๋๋ค. 1์ฐจ ํ๋ก์ ํธ์ธ๋งํผ ๋ถ์กฑํ ์ ์ด ๋ง์์ผ๋ฉฐ, ์ ์ ๋ถ์กฑํ ์ ์ 1์ฐจ ํ๋ก์ ํธ์์ ๊นจ๋ฌ์๊ธฐ์ 2์ฐจ ํ๋ก์ ํธ์์ ํด๋น ๋ถ๋ถ๋ค์ ๊ฐ์ ํ๊ณ ๋ณด์ํ ์ ์์๊ธฐ์ ํฐ ์๋ฏธ๊ฐ ์๋ ํ๋ก์ ํธ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ฌด์๋ณด๋ค ํ๊ณผ์ ํ์ ์์์ ์ด๋ค ํฌ์ง์ ์ ์ง์ค์ ํด์ผ ํ๋ฉฐ,Git
ํ์ ์ ๋ํ ํ๋์ ๊ธฐ์ ๋ฑ์ ๋ถ๋ชํ๋ฉฐ ๋ฐฐ์ธ ์ ์์๊ธฐ์, ํ ํ๋ก์ ํธ์์ ๊ฐ์ถฐ์ผํ ์์ธ๋ฅผ ๋ฐฐ์ ๋ค๊ณ ์๊ฐํฉ๋๋ค.
MVC Pattern
,REST API
์ ์ ์ฉ ๋ฑ๋ ์ต์ํด์ง ์ ์์์ผ๋ฉฐ, ํด๋น ๊ธฐ์ ๋ค์ ํ์์ฑ์ ๋์ฑ ์ ์คํ ๋๊ผ์ต๋๋ค.
์ด๊ธฐModeling
๊ณผ์ ์ ์ค์์ฑ,์ฟผ๋ฆฌ
์ ๋ํ ์ดํด์ ํ์ฉ ์ญ์ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ก์จ ๋ฅ์ํ๊ฒ ๋ค๋ค์ผํ ์ ์ด๋ผ๊ณ ์๊ฐํ์ผ๋ฉฐ, ์ ๋ ์ด ๋ถ๋ถ์์ ์ฌ๋ฏธ์๊ณ , ํฅ๋ฏธ๋ฅผ ๋๋ผ๋ฉฐ ์๊ฐ ๊ฐ๋์ค ๋ชฐ๋๋ ์ ๋ชจ์ต์ ๋ดค์ผ๋ฉฐ, ํ๋ก ํธ ์๋๋ ์ข์ง๋ง ๋ฐฑ์๋์ชฝ์ผ๋ก ๋ง์์ ๊ตณํ๊ฒ ๋์์ต๋๋ค.
2์ฐจ ํ๋ก์ ํธ๋ง์ ๋๋ ํ ์์ ์ผ๋ก ์์ง๋ ๋ฐฐ์์ผ ํ๊ณ ๊ณต๋ถํด์ผํ ์ฐ๋ค์ด ๋ง์ต๋๋ค.
๋ถ๋ชํ๊ณ ๋์ด์ ธ๋, ๊ณ์ํด์ ๋ค์ ์ผ์ด๋๋ฉฐ ์์ผ๋ก ๋์๊ฐ๋ ๊ฐ๋ฐ์๊ฐ ๋๊ณ ์ถ๋ค๋ ํฌ๋ถ๊ฐ ์๊ธฐ๋ ํ๋ก์ ํธ์์ต๋๋ค. ๊ธด ๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!