오늘 공부한 것


팀프르젝트에서 맡은 것이 회원가입, 로그인, 로그아웃 등 인증관련인데,
basic반 과제에서도 회원가입, 로그인이 있어 과제를 위주로 공부했다.

베이직반 과제에서 원래 코드는 나누어져있지 않고 router에 모든 코드가 있는데,
이걸 3계층 repository, service, controller로 나눠서 코드리팩토링 하는거 였다.

그런데 문제가 발생한 것이 나누다보니 service계층에서는 res, rep를 쓸 수가 없는데,

    if (existedUser) {
      return res.status(HTTP_STATUS.CONFLICT).json({
        status: HTTP_STATUS.CONFLICT,
        message: MESSAGES.AUTH.COMMON.EMAIL.DUPLICATED,
      });
    }

이렇게 원래코드가 있어서 어떻게 해야할 지 고민했다.

여러 시행착오끝에 정답인지 아닌지는 모르겠지만 코드가 작동하게 만들었다.

// auth.service.js
  signUp = async (authData) => {
    const { email, password, name } = authData;

    const existedUser = await this.#repository.findUser(email);

    if (existedUser) {
      const error = new Error(MESSAGES.AUTH.COMMON.EMAIL.DUPLICATED);
      error.status = HTTP_STATUS.CONFLICT;
      error.name = 'existedUser';
      throw error;
    }

    const hashedPassword = bcrypt.hashSync(password, HASH_SALT_ROUNDS);

    const data = await this.#repository.signUp({
      email,
      password: hashedPassword,
      name,
    });

    data.password = undefined;

    return data;
  };
// auth.controller.js
  signUp = async (req, res, next) => {
    try {
      const { email, password, name } = req.body;
      const data = await this.#service.signUp({ email, password, name });
      return res.status(HTTP_STATUS.CREATED).json({
        status: HTTP_STATUS.CREATED,
        message: MESSAGES.AUTH.SIGN_UP.SUCCEED,
        data,
      });
    } catch (error) {
        next(error);
    }
  };

서비스 계층에서 식별할 수 있는 error를 만들어 주기로 하고 error handler에서 처리하기로 결정했다.

// error-handler.middleware.js
import { HTTP_STATUS } from '../constants/http-status.constant.js';

export const errorHandler = (err, req, res, next) => {
  console.error(err);

  // joi에서 발생한 에러 처리
  if (err.name === 'ValidationError') {
    return res.status(HTTP_STATUS.BAD_REQUEST).json({
      status: HTTP_STATUS.BAD_REQUEST,
      message: err.message,
    });
  }

  if (err.name === 'existedUser') {
    return res.status(err.status).json({
      status: err.status,
      message: err.message,
    });
  }

  if (err.name === 'isPasswordMatched') {
    return res.status(err.status).json({
      status: err.status,
      message: err.message,
    });
  }

  // 그 밖의 예상치 못한 에러 처리
  return res.status(HTTP_STATUS.INTERNAL_SERVER_ERROR).json({
    status: HTTP_STATUS.INTERNAL_SERVER_ERROR,
    message: '예상치 못한 에러가 발생했습니다. 관리자에게 문의해 주세요.',
  });
};

기존에는 validationError하고 예상 못한 에러 처리만 있었는데 여기에 error.name에 따라 response값을 정했더니 작동했다.

태그:

카테고리:

업데이트: