[ node.js ] #02 User API / Error Handling

Hailee·2021년 1월 28일
1

[ node.js ]

목록 보기
3/3

지난 시간에..

백엔드 서비스를 구현한다 👉🏻 request, response를 처리할 수 있는 코드를 구현하는 것!
레이어의 의존성 순서를 잘 따라가면서 코드를 구현하면 이상적인 개발이 되는 것!

Route

  • 경로 설정하는 곳

Controller

  • Route의 경로를 타고 이동한 후, validation / 암호화 로직 존재

Service

  • Database와 통신하는 로직 존재
  • prisma, sequalizer, TypeORM 등의 ORM 사용

1. User 관련 API 생성하기

이제 본격적인 API 작성을 진행해보자.

초기 세팅이 잘 되어있다는 가정 하에 진행하고, 프로젝트의 구조는 대략 이러하다.

express는 Router라는 함수를 import하여 use,get,post,route 라는 다양한 메서드를 사용할 수 있다.

앞으로 구현할 User관련 경로를 지정해주자.
👉🏻 /users라는 자원에 대해 UserRouter를 연결해주겠다는 뜻!

우선 회원가입 하기 위한 /signup 자원에 대한 경로를 연결해주고,
req, res, next를 인자를 받는 함수를 열어준다.

하지만 이렇게 되면, 라우팅, 함수로직이 같은 곳에 존재하게 되어
레이어를 분리해야하는 프레임워크의 특성과 맞지 않는다.

라우팅이 되어서 /users라는 라우트를 타고 UserRouter 파일로 이동하고,
또 라우트를 타고 UserController로 이동!
👉🏻 라우팅만 담당하는 부분, 컨트롤러, 서비스 로직이 각각 존재해야 한다는 걸 잊지 말자!


export

JS에서 모듈을 내보낼 때에는 항상 객체!
export문을 사용해 객체를 매핑시켜주면 다른 JS파일에서도 import를 통해 매핑된 해당 객체를 이용할 수 있다.

  • 예시
    - 매핑된 객체를 통해 key, value 꺼내올 수 있다.
    - 매핑된 객체를 통해 모듈을 꺼내올 수 있다.

"Express를 통해 엔드포인트를 구현한다 = 함수를 구현한다"
요청을 처리하는 함수를 생성할 때에는 받아야 할 인자가 무조건 정해져있다. 👉🏻 req, res 객체

👆🏻 이제 TypeScript를 사용하는 이점을 사용해보자.
함수가 받는 매개변수가 무조건req, res 객체라는 것을 알고있기 때문에,
Express 모듈의 type(Request, Response)을 import 한 뒤, 각 매개변수의 타입으로 매핑해준다.

이렇게 하면 Django로 작업했을 적에 json.loads(request.body)할 필요 없이,
바로 Request를 맵핑받은 req 변수를 통해 body에 접근할 수 있다.


2. Error Handling

에러 핸들링 해주기

request에서 확인한 데이터들이 완전하지 않다면 회원가입을 시켜줄 수는 없는 법!

예외 상황에 대한 에러 처리를 하는 방법을 알아보자.

보통 에러를 이런 식으로 처리를 해주게 된다.
그렇다면, controller에서 처리한 에러가 어디로 가게 될까?

try, catch문을 통해서 controller 내에서 처리해줘도 되지만,
반복되는 코드는 모듈화해주는 것이 효율적인 개발이다.

에러 처리를 해주려면 catch문 내부에서 각 에러코드에 맞는, 상황에 맞는 예외처리를 해주어야 하는데
이는 매번 반복되는 코드일 뿐 만이 아니라, 어떻게 보면 하드코딩적인 성향도 있게 되는 것...!

효율적인 코딩을 위해서, 새로운 미들웨어를 사용해보쟈.
next()함수를 사용해서 catch한 에러를 controller 밖으로 던져주자!
밖이라 함은 어디인가?

👉🏻 앞서 app.ts을 통해 생성해둔 generalErrorHandler를 통해 에러를 처리하도록 할 것!

미리 모듈화를 해 둔 generalErrorHandler에서 에러를 처리해주자.
app.ts가 모든 구조의 시작(최상위 레이어)이기 때문에, routes를 통해 빠져나온 것은 그 다음의 generalErrorHandler로 가게 된다.

routes라는 미들웨어 내에서 발생한 모든 에러는 generalErrorHandler로 가게된다.

generalErrorHandler 내에 가져온 에러를 구조분해 할당을 통해 message, statusCode라는 변수에 담아주고
어떤 에러가 발생했는지 처리를 할 수 있도록 작성해준다.

에러 코드를 미리 errorGenerator라는 미들웨어에 미리 선언해두고,
generalErrorHandler 에서 인자 statusCode를 통해 전달받아 사용한다.


프레임워크를 통한 개발에서는, "각 레이어에 맞는 로직이 존재해야 한다"는 것!

항상 명심하쟈!

profile
웹 개발 🐷😎👊🏻🔥

0개의 댓글