์ฝ๋์คํ
์ด์ธ ์ immersive๊ณผ์ ์ ๋ชจ๋ ๋ง์น๊ฒ ๋๋ฉด 2์ฃผ,4์ฃผ ๋๋ฒ์ ํ ํ๋ก์ ํธ๋ฅผ ํ๊ฒ ๋๋ค.
์ฃผ์ ๋ ์๊ฐ์๋ค์ด ์์ ๋กญ๊ฒ ์์ด๋์ด๋ฅผ ๋ด๊ณ , ๋ง์์ ๋๋ ์์ด๋์ด์ ์ง์ํ๊ณ ํ์ ๋ง๋ค๊ฒ ๋๋ ๊ณผ์ ์ด๋ค.
์ฒซ๋ฒ์งธ ํ๋ก์ ํธ์ธ 2์ฃผํ๋ก์ ํธ ์์๋ ๊ทธ๋์ ๋ฐฐ์ด๊ฒ๋ค์ ์ฌ์ฉํด๋ณด๋ฉด์ ๋ณต์ตํ๋ ์๊ฐ์ ๊ฐ๋๊ฒ ์ข์๊ฒ ๊ฐ์์ ๊ธฐ๋ณธ์ ์ค์ ์ ๋ ํ๋ก์ ํธ์ ์ง์์ ํ๋ค.
ํ๋ก์ ํธ ์ด๋ฆ์ todoCalendar์ธ๋ฐ todo๋ฅผ CRUDํ๊ณ , ๋ฌ๋ ฅ๋ ์ถ๊ฐํด ๋ ์ง๋ณ๋ก ๊ด๋ฆฌํ ์ ์๋ ์น์ฑ์ด๋ค.
ํ์ง๋ง ์์ฝ๊ฒ๋ ๋ฌ๋ ฅ๋ถ๋ถ์ front-end์์์ ๊ตฌํ์ด ์๊ฐ๋ด์ ๋๋์ง ์์๊ฒ๊ฐ์ ์ค๊ฐ์ ์ ์ธํ๊ฒ ๋์๋ค..
๋ฐฑ์๋
๋๋ ๋๋ฒ์ ํ๋ก์ ํธ ๋์์ ํ๋ก ํธ,๋ฐฑ ๋๋ค ํด๋ณด๊ณ ์ถ์๋ค.
4์ฃผํ๋ก์ ํธ์๋ ํ๋ก ํธ๋ฅผ ํด๋ณด๊ณ ์ถ์ด์ 2์ฃผํ๋ก์ ํธ์๋ ๋ฐฑ์๋๋ฅผ ์ง์ํ๊ฒ ๋์๋ค.
todo, todoCalender API ์์ฑ (calendar ๋ถ๋ถ์์ ์๋ณ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ ๋ถ๋ถ์ด ์ด๋ ค์ ๋๋ฐ Sequelize์ {op}๋ก ๋ ์ง๋ฐ์ดํฐ์ ์๋ถ๋ถ์ ์๋ผ๋ด์ ์ฌ์ฉํ ์ ์์๋ค.)
crypto ๋ชจ๋๊ณผ salt๊ฐ์ ์ด์ฉํ ๋น๋ฐ๋ฒํธ ์ํธํ
AWS ๋ฐฐํฌ (EC2์ RDS์ ๋ณด์๊ทธ๋ฃน์ ๋ง๋๋๊ฒ ์ฒ์์ด๋ผ ์ด๋ ค์ ์ง๋ง ๋ค์๋ฒ์ ๋ ๋น ๋ฅด๊ฒ ํ ์ ์์๊ฒ ๊ฐ๋ค, Filezilla์ vim ๋ฅผ ์ด์ฉํด์ EC2์๋ฒ๋ฅผ ์ด์ด๋ณด๋๊ฒ ์ ๊ธฐํ๋ค.)
Jest๋ก ์๋ฒ ํ ์คํธ์ผ์ด์ค ๋ง๋ค๊ธฐ ( supertest๋ผ๋ ๋ชจ๋๋ก ์๋ฒ์ ์ง์ ์์ฒญ์ ๋ฃ๋ ํ ์คํธ์ผ์ด์ค๋ฅผ ์์ฑํด๋ดค๋ค. ํ์ง๋ง ์ธ์ ์ธ์ฆ ๊ธฐ๋ฐ API๋ผ ์์ฒญ์ ์ธ์ ์ ๋ด์๋ณด๋ด์ผ ํ๋๋ฐ ์๊ฐ๊ด๊ณ์ ๊ทธ๋ถ๋ถ์ ๊ณต๋ถํ์ง ๋ชปํด์ ๋ชจ๋ API์ ๋ํ ํ ์คํธ์ผ์ด์ค๋ฅผ ๋ง๋ค์ง๋ ๋ชปํ๋ค.)
app.use(/) ๋ถ๋ถ์ ์ฃผ์์ฒ๋ฆฌํ๋ ์ ์๋ํ๋๊ฑธ ๋ณด๊ณ app use์ ๋ํด ์์๋ณด๋ ๋ฏธ๋ค์จ์ด๋ฅผ ๋ง๋ค๋ ์ฌ์ฉ๋๋๋ฐ ์ด๊ฒ ์์์ ์ด๊ณ ๊ทธ ๋ค์ ๋ค๋ฅธ ๋ผ์ฐํฐ๋ค์ ๋ง๋ถ์ฌ๋๊ฐ๋๊ตฌ์กฐ๊ฐ๋ค. ์ง๊ธ๋น์ฅ ์ฐ๋ฆฌ์๊ฒ ๋ถํ์ํ์ฌ ๊ฐ๋จํ๊ฒ app.get์ผ๋ก ๋ฐ๊ฟ์ ํด๊ฒฐํ๋ค.
//1. ๊ธฐ์กด์ ๊นํ์คํ ๋ฆฌ ์ญ์
$ rm -rf .git
//2. ์๋ก์ด ๊น ์ค์
$ git init
๋ ํฌ๋ฅผ cloneํํ ๊ฑฐ๊ธฐ์ dev๋ธ๋์น๋ก ์ด๋ํ๋ฉด dev๋ด์ฉ๋ค์ด ์๊ธด๋ค (checkout dev)
ํ
์คํธ์ค ์๋ฒ์ชฝ์ ๋ด๋นํ๋ ๋์ ํ์ด์ 2๊ฐ์ ์๋ฒ๋ฅผ ์ฌ์ฉํ์์๋๋ฐ
ํด๋ผ์ด์ธํธ์ชฝ์์ ์ด๋ถ๋ถ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๊ณ ํ๋ค.
์ฐพ์๋ณด๋ ์ด๋ฐ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์ฌ์ดํธ๊ฐ ์์ฒญ์์กฐ(CSRF)๋ฅผ ํ ์ ์์ด ๋ณด์์ ์ผ๋ก ์ทจ์ฝํ๋ค๊ณ ํ๋ค.
๋จผ์ ์๋ฌํธ๋ค๋ง์ ๋ํด
//๋์์ฝ๋๋ ์๋ฌ๊ฐ ๋ฌด์์ธ์ง์ ๋ํ ๋ถ๋ถ์ ํ์ธํ๋๊ณผ์ ์ ์์๋ค.
.catch(()=>{
res.status(400).send({error: '400 Bad Request'})
/*ํ๋ก์ ํธ ์คํผ์ค์์์ ์ง๋ฌธํ ๊ฒฐ๊ณผ ์ด๋ฐ๊ฒฝ์ฐ console.log๋ฅผ API์ด์
์ ๋ฃ์ด์ ์์ฒญ์ด
API๊น์ง ์ ๋ค์ด์ค๋์ง ํ์ธํ๊ณ , ์ดํ req.body๋ฅผ ํตํด ์์ฒญ ๊ฐ๋ค์ด ์ ๋ค์ด์ค๋์ง ํ์ธํ๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์๋ฌ๊ฐ ๋๋ค๋ฉด ์๋ฌ์ฝ๋๋ฅผ๋ณด๊ณ ํด๋น๋ถ๋ถ์ ๊ฐ์ err๋ฅผ console.log๋ก ํ์ธํด๋ณธ๋ค.*/
.catch((err)=>{
console.log(err);
res.status(400).send({error: '400 Bad Request'});
// console.log์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ์๋ฌ๊ฐ ๋์๊ณ ํ์ธ๊ฒฐ๊ณผ test๋ชจ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ด ์๋์ด์์๋ค.
describe('POST /login', () => {
test('login success', async (done) => {
const response = await request(app).post('/login').send({
"email": "praconfi@gmail.com",
"password": "dksld",
})
expect(response.status).toBe(200);
expect(response.body).toHaveProperty('id', 'email', 'username');
done();
}, 30000);
})
๋น๋๊ธฐ์ ์ผ๋ก ์๋ํ๋ ๋ถ๋ถ์ด ํ
์คํธ๋ด์์ ๋๋์ง ์์๋ค๋ ๋ด์ฉ์ด๋ค.
๊ตฌ๊ธ๋ง๊ฒฐ๊ณผ ํ
์คํธ์ ๋ง์ง๋ง์ done();์ ๋ถ์ด๋ผ๊ณ ํด์ ๋ค ๋ถ์๋๋ฐ๋ ๊ฐ์์ฆ์์ด ๋ณด์ฌ์
์๋ ์ค๋ช
์์ ํ๋ผ๋๋๋ก --detectOpenHandlers๋ฅผ ๋ถ์ด๋ ํด๊ฒฐ๋์๋ค.
์ฒ์์ผ๋ก ํด๋ณธ ํ๋ก์ ํธ์๋๋ฐ ๊ท๋ชจ๋ฅผ ๋ ๋์ ๋ด๊ฐ ์น์ดํ๋ฆฌ์ผ์ด์ ์ด๋ผ๋๊ฒ์ ๋ง๋ค์ด๋ณด๊ณ ์ฑ๊ณต์ ์ผ๋ก ๊ธฐ๋ฅ๊ตฌํ์ ํ๊ณ ๋ฐฐํฌ๊น์ง ํ๋ค๋ ์ฌ์ค์ด ๊ธฐ๋ถ์ด ์ข๋ค.
์ค๊ฐ์ ์ ๊ฑฐํ๊ฒ๋ ๊ธฐ๋ฅ์ด ์์ด์ ์์ฝ๋ค. ํ์ง๋ง ํ๋ค๊ฒ ๋๊น์ง ๋ถ์ก๊ณ ์์๋๋ผ๋ฉด ์ด์ฉ๋ฉด ์์ฑ๊ณผ ๋ฐฐํฌ์ฌ๋ถ๊ฐ ๋ฌ๋ผ์ ธ์์์์๋ ์๋ค. ๋ค์๋ฒ์๋ ์ฒ์๋ถํฐ ๊ธฐํ์ ๊ผผ๊ณฐํ๊ฒ ํด์ ์ค๊ฐ์ ๋ณ๊ฒฝ๋๋์ผ์ ์ต์ํ ํ ์ ์๋๋ก ํ ๊ฒ์ด๋ค.
์ด๋ฒ ํ๋ก์ ํธ ์๊ณ ํ์ จ์ต๋๋ค^^ ์๋ฒ๋ ํด๋ผ๋ฅผ ๊ฐ์ด ๊ณต๋ถํ๋ฉด์ ํ ์คํธ์ฝ๋๊น์ง ์์ฑํด์ฃผ์ ์ ๊ฐ์ฌํ์ต๋๋ค. ๋ค์ ํ๋ก์ ํธ์์ ๋ ํํํด์ง ๋ชจ์ต์ผ๋ก ๋ง๋์!! ์์ํ๊ฒ ์ต๋๋ค.