20220811_TIL_노드 3주차 과제 후기

codeing999·2022년 8월 11일
0

TIL/WIL

목록 보기
15/22

깃헙 주소 : https://github.com/codeing999/intense_backend

기술적 발전

MySQL

노드 1주차 때는 몽고 DB를, 노드 2주차 때는 Sequelize를 썼었다. 이번주는 DB를 또 다른거 쓰란느 요구사항은 없었지만 우리팀은 처음부터 다시 코딩을 짜면서 새로운 DB를 써보기로 하였다. 그래서 MySQL를 선택했다. 배우는 입장에서 MySQL은 Sequelize에 비해 매우 쉬웠다. Sequelize는 마이그레이션과 모델 두개를 모두 수정해줘야하고 검색해도 적용되지 않는 내용들만 나왔던 것에 비해
MySQL은 쿼리문이 매우 쉽고 검색해도 잘 나왔다.
어려운 부분이라고 한다면 DB랑 연결하는 부분인데 이건 민석님이 맡아서 작성하였다. pool.getConnection 과 같은 함수들을 이용하였다.

Layered Architecture

이번주 요구사항은 원래는 저번주에 개인이 구현한 것 중 하나를 정해서 그거를 팀단위로 layered Architecture Pattern을 적용하여 개선하는 것이었다. 우리팀은 아예 처음부터 다시 구현하기로 하였는데 초기의 디렉토리 구조는 아래와 같다.

src 폴더에 js파일들을 작성하기로 하고 그 아래에 layers 폴더를 만들고
그 아래에 controllers, repositories, routers, services 폴더를 만들어 각각의 기능에 맞게 구현한다.
먼저, routers 에는 라우팅 기능만을 작성하여 method와 path에 맞는 controllers를 호출한다.
controllers에서는 요청에서 담긴 값들 (req.body, req.params, req.headers 등)을 검증하고 그 값들을 services에 넘겨준다.
services에서는 그 값들을 기반으로 실제로 하는 행동들을 작성한다. DBD에의 접근이 필요한 일은 repositories를 호출한다.
repositories는 쿼리문을 통해 DB에 접근하여 그 결과에 따라 적절한 return을 하도록 작성한다.

Class

이번주 과제 요구사항 중에 추상화를 경험해 보란 것이 있었는데 학습자료를 보니 class로 구현하란 것이었다. 우리팀은 지난주차 과제가 아직 미숙한 분들이 계셨기 때문에 일단 지난주처럼 class를 사용하지 않은 채 구현을 하고 완성 후에 Class로 변경하기로 하였다. 나도 예전에 자바에서 Class를 배우고 써본적은 있지만 오래전이라 많이 까먹은 상태였고, javascript로는 해본 적이 없었다. 우리팀은 다시 구현하는 데에 생각보다 많은 시간이 걸려서 막바지에 겨우 Class로 변경을 적용할 수 있었다.

회원가입, 로그인

저번주까지 강의나 학습자료에서 회원가입과 로그인을 예시로 하여 설명하였었기 때문에 회원가입과 로그인은 사실 그것을 참고하여 대충 작성하였던 것 같다. 그것 외의 게시물 CRUD, 댓글 CRUD, 좋아요 기능 등에만 집중하였었는데 이번 주에는 팀과제여서 각자 어디를 구현할지 역할을 정해야했는데, 그 직접 안해보았던 회원가입과 로그인을 자원하였다.
저번주에 이미 어느 정도 해봐던 부분이기에 금방 구현할 줄 알았는데 생각보다 오래 걸렸다. 왜냐하면 로그인 기능에 JWT 토큰을 사용하는 부분과 bcrypt로 암호화하는 부분을 포함하고 있었기 때문이다. 물론 이부분도 직접 해보고 싶었기에 이 기능들을 선택한 것이었지만 그렇다고 해도 이렇게 오래 걸릴 줄은 예상하지 못했다.

JWT 발급 및 인증

로그인 시에 jwt 를 발급해주고 로그인이 필요한 API를 요청할 시에는 그 jwt를 헤더의 authorization에 넣어서 요청하게 함으로써 로그인한 사용자이며 해당 유저임을 인증하도록 구현하였다. 헤더가 아니라 res.locals에 넣도록 구현해도 되지만 코딩적으로 차이는 없었다.
JWT 토큰을 구현하기 위해 다시 제대로 공부하였는데 공부한 내용은
https://velog.io/@mero/JWT-Json-Web-Token
에 작성하였다.

bcrypt

회원가입 성공 시 password를 bcrypt로 암호화하여 DB에 저장하고, login 시에 받은 password를 이와 DB의 암호화된 password를 bcrypt.compare로 비교하여 인증하도록 구현하였다.
처음에는 암호화하는 함수만 작성하여서 로그인할 때 받은 password도 또 암호화하고 단순히 암호화된 그 두 password를 ===으로 비교하면 될 줄 알았는데 해보니까 bcrpyt는 할 때마다 다른 값으로 암호화하고 있었다. 시간 관련된 변수가 들어가는 듯했다.
그래서 ===과 같은 단순비교는 할 수 없고 bcrpyt.compare라는 또다른 bcrpyt 함수를 사용하여 인증해야했다.
이것 또한 처음엔 로그인 시 입력받은 password로 암호화해서 인자로 넣어야할 줄 알았는데 이 값은 날것 그대로인자로 넣는 거였다.

Git 협업

오랜만의 팀과제이다보니 (물론 따로 사이드프로젝트를 하긴했지만) 제대로 git 협업을 해보게 되었는데, 그전과는 다르게 어느 정도 git 사용에 익숙해진 것 같다.

dotenv

난 그동안 .env 파일도 그냥 있는 기능인 줄알았는데 이거도 설치해서 쓰는 기능이었다. 여기에 다양한 환경변수들을 작성하고 필요한 파일에서는 dotenv/config를 require해와서 사용한다. 이 기능은 단순히 여러 곳에 쓰일 값을 모아둔다는 의미도 있겠지만, git hub에 올라가선 안될 값들을 감추기에도 좋다. .env 파일을 .gitignore에 등록해 놓으면 이 파일은 git hub에 안올라가기 때문이다.

그외 팀과제 시 쓴 기능

Prettier, Husky

code formatter라고 하여서 코드를 정리해주는 기능이라고 보면 되는데 협업 시에는 코딩 스타일을 통일하기에 아주 유용하다.
그동안에는 ctrl + k + f을 누르면 들여쓰기 정도만 정리를 해줬었는데 이 기능을 쓰고나니 기존 code formatter와 prettier code formatter 중에 선택하는 창이 떠서 매우 신기했다.
또한, git cummit 시에 자동으로 이 prettier가 적용되게하는 기능을 가진 Husky까지 사용하였다.
다른 분이 작성하여서 직접 한 건 아니지만 매우 신기한 기능이었다.

morgan

로깅을 도와주는 미들웨어로, 요청 시 method, path, status code 등을 자동으로 터미널에 출력해준다.

아쉬운 점

testcode

이 부분은 아쉽지만 우리팀은 시간이 부족하여 구현하지 못했다. 다음 번에는 해볼 수 있도록 해야겠다. jest라는 것을 들어보기만 했는데 그게 testcode를 하는 것이었구나.

async, await

동기와 비동기에 관해 아직 이해하지 못하고 있는 것 같다. CRUD를 구현하면서 매우 자주 쓰고 있지만 그냥 에러 안나게 관습적으로 써오고만 있지 왜 쓰는지 정확히 모르고 있다. 다음 번에 꼭 자세히 공부하여 포스팅해야겠다.

그외

socket.io도 학습자료에 있었는데 다음번에 기회가 되면 공부해서 써보고 싶다.

profile
코딩 공부 ing..

0개의 댓글