Project : ErrorHadDuck

zenibako.lee
6 min readDec 12, 2019

--

19.10.28 ~ 19.11.09 2W project

Codestates immersive course 15기로서

해당 기간동안 진행했던 프로젝트에 대한 기록

서비스 페이지 주소

http://mysterious-journey.surge.sh

API Document

서비스 목적

프로그래밍을 하다 만나게 되는 에러들과, 그 디버그에 대한 기록을 하는 private 페이지.

STACK

이번 프로젝트는 리액트로 프론트를 구현, Surge.sh로 배포하고, Node.js+express로 작성한 서버를 aws EC2 +RDS로 가동하고 있습니다.

저는 이번 프로젝트에서 백엔드를 혼자 진행하였고, 따라서 백엔드에서 사용했던 기술들을 먼저 나열해 보겠습니다.

  • 서버 : NodeJS (AWS EC2)
  • 미들웨어 : Express, cors, body-parser, cookie-parser
  • DB : mysql (AWS RDS-mysql)
  • orm : sequelize
  • 보안 : JWT , 유저정보 — crypto

클라이언트는

EC2의 오픈어드레스로 http request를 보내게 된다.

그러면 request type에 따라 JWT 미드웨어를 거치게 되고,

const JWTmiddleWare = (req, res, next) => {
try {
if (req.path !== '/users/signup' &&
req.path !== '/users/login') {
let token = req.cookies.oreo; //cookie-parser이용
let decoded = jwt.verify(token, secret);
if (decoded) { //토큰 통과시
next();
} //회원가입 이외에는 전부 토큰 인증부터 합니다
} else {
next();
}
} catch (err) {
res.status(400).send(err);
}
};
app.use(JWTmiddleWare);
app.use('/', router);

(JWT에 대한 처리는 글 하단의 링크에 구현과정이 담겨있습니다.)

이후 route.js의 분기를 통해 각각의 controller로 요청처리가 호출이 되고,

const usersController = require('./controller/usersController');
const postsController = require('./controller/postsController');
const adminController = require('./controller/adminController');
const router = require('express').Router();
router.post('/users/login', usersController.login);
router.post('/users/signup', usersController.signup); router.post('/posts', postsController.newPost);
router.get('/posts/:id', postsController.getOne);
router.delete('/posts/:id', postsController.deleteOne);
router.patch('/posts/:id', postsController.patchOne);
router.get('/posts', postsController.getAll);
//iscomplete쿼리 역시 해당 메소드에서 처리. router.get('/admin/truncate', adminController.truncate);
module.exports = router;

EC2는 sequelize(orm)을 통해 RDS(mysql)에 있는 데이터에 접근,

SQL문을 실행하여 필요한 작업들을 수행합니다.

그 후 다시 HTTP response로 응답을 보내도록 구현하였습니다.

Sequelize를 사용하는데 겪었던 에러들과 해결에 대한 정보는 글 하단에 포스팅을 따로 해둔 링크로 대체합니다.

이번 프로젝트에서,

프로젝트 관리적으로 느꼈던 점은

설계 단계에서 프론트 개발자와 협의한 서버쪽 요구사항을
문서로 정리하고, API문서를 기준으로 작업을 진행한다면,
프론트와 백엔드가 비동기적으로 협업하는데 도움이 되었다는 점이다.

만약 문서화 없이, 그때 그때
“ xx 가 http body로 갈거고, 메소드는 update에요!” 라던지,
“put메소드로 /users 로 요청 보내면 response형태가 어떻게 되죠?” 와 같은

소모적인, 작업을 방해하는 질문을 줄일 수 있다.

기술적인 부분에서 느낀 점은

  1. Sequelize를 통해 SQL문을 다룬다면, 매우 간편하게 객체를 다루듯 사용할 수 있다.
  2. 그러나 기본적인 기능이 아닌, 관계설정, 혹은 외래키를 참조하는 update작업과 같은 경우는, model 생성시 관계설정에 대한 작업이 선행된다.
  3. ORM에 따라 다소 차이가 있겠으나, sequelize의 경우에는, 공식문서로 디버깅을 하며 사용하기에는 충분하지 않다.
  4. CORS 이슈에 대한 더 깊은 이해가 필요하다.
    CORS 모듈을 그냥 .use()하는거로는 불충분한 상황이 발생했다.
app.use(
cors(
{
credentials: true,
origin:
[‘http://mysterious-journey.surge.sh',
‘http:127.0.0.1:3000’,
‘http://errorhadduck.s3-website.ap-northeast-2.amazonaws.com' ]}
));

위와 같은 credentials옵션을 따로 true로 설정해 주었다. axios에서도 해당 속성이 default로 false로 적용되어 있다.

--

--

zenibako.lee
zenibako.lee

Written by zenibako.lee

backend engineer, JS, Node, AWS

No responses yet