[TIL_2023.12.05] 3계층 아키텍쳐 패턴에서 에러처리/예외처리

김효진·2023년 12월 5일
0
post-custom-banner

3계층 아키텍쳐패턴에 대해 학습 후 controller, service, repository 폴더를 나누어 코드 리팩토리를 진행했다.

service 파일에서 에러, 오류처리를 하는데
throw new Error ('에러메세지~') 이런 식으로 코드를 넣으니까
상태코드를 함께 보낼 수가 없었다.

프론트엔드와 통신할 때 에러메세지와 상태코드를 모두 반환하고 싶어서 관련 서적과 블로그를 찾아 공부했다.

그리고 아래와 같이 수정할 수 있었다.

  1. 일단 미들웨어 폴더 안에 에러처리 미들웨어 코드를 넣을 파일을 생성 후
    app.js 와 연결한다

    src/app.js

    import errorHandlerMiddleware from '../src/middlewares/error.handler.middleware.js';
    ...
    ...
    
    // 에러처리 미들웨어는 코드 맨 하단에 작성! 
    app.use(errorHandlerMiddleware); // 에러처리 미들웨어
    
    app.listen(PORT, () => {
      console.log(PORT, ' 포트로 열렸습니다!');
    });
  2. 에러처리/오류처리 할 내용을 서비스 파일에서 작성하고 throw err 던지기

    src/services/goods.service.js

    // 찾는 상품이 없는 경우 아래와 같이 에러메세지 및 상태코드를 날린다
        if (!findGoods) {
          const err = new Error('존재하지 않는 상품입니다.');
          err.statusCode = 404;
          throw err;
        }
  3. 컨트롤러에서 에러/오류 발생 시 catch로 넘김 -> next(errer) -> 에러처리 미들웨어로 감

    src/controllers/goods.controller.js

     // 상품 수정
      updateGoods = async (req, res, next) => {
        try {
          const userId = req.user;
          const { goodsId } = req.params;
    
          // 수정할 내용
          const { goods, content, status } = req.body;
          const updateGoods = await this.goodsService.updateGoods(
            userId,
            goodsId,
            goods,
            content,
            status
          );
    
          return res
            .status(200)
            .json({ Message: `${goodsId}번 상품 수정 완료`, data: updateGoods });
        } catch (error) {
          next(error);
        }
      };
  4. 에러처리 미들웨어 코드 -> statusCode와 message가 넘어왔으면 해당 내용을 클라이언트로 보내고 넘어온 내용이 없으면 기본 500코드에 '서버오류' 라는 메세지를 띄움

    src/middlewares/error.handler.middleware.js

    export default (error, req, res, next) => {
        console.log(error);
    
        error.statusCode = error.statusCode || 500;
        error.message = error.message || '서버오류';
        return res.status(error.statusCode).send({ errorMessage: error.message });
      };
    

일단 내가 공부한 수준에서 최선이었고 더 좋은 방법이 있을 수도 있다.
더 공부해야겠다.

(조언은 언제나 감사합니다!)

profile
더 많은 사람들이 더 좋은 정보와 서비스를 누릴 수 있게!!
post-custom-banner

0개의 댓글