Today I Learned
3계층 분리를 하며 에러 처리를 단순히 한 파일 안에서 하는것이 힘들어졌다.
기본적으로 3계층이라 하면 컨트롤러 - 서비스 - 레파지토리 순으로 하게 되는데, request 와 response를 담당하는건 컨트롤러 계층이기 때문에 직접적으로 에러 코드를 띄우고 http method를 사용하고싶다면 컨트롤러 계층을 이용해야 한다.
원래는 서비스 계층에서 에러가 발생시, 예시와 같이 만들고 컨트롤러에서 만약 에러 메시지가 이렇다면 해당 에러를 띄우도록 하는 방식을 사용했다.
throw ({
code: 404,
message: "찾으시는 페이지가 존재하지않습니다.",
)}
이것보다 편하게 에러를 만들 수 있는 방식이 바로 커스텀 에러이다.
export class ValidationError extends Error {
constructor(message) {
super(message);
this.name = "ValidationError";
}
}
export class UnauthorizedError extends Error {
constructor(message) {
super(message);
this.name = "UnauthorizedError";
}
}
export class NotFoundError extends Error {
constructor(message) {
super(message);
this.name = "NotFoundError";
}
}
export class ConflictError extends Error {
constructor(message) {
super(message);
this.name = "ConflictError";
}
}
common.error.js 파일을 만들어 에러를 큰갈래로 나눠 인스턴스를 생성한다.
전역변수로 생성하기 때문에 이것을 사용하기 위해 import 해 올 필요는 없다.
export default (err, req, res, next) => {
switch (err.name) {
case "ValidationError":
case "PrismaClientValidationError":
return res.status(400).json({ message: err.message });
case "UnauthorizedError":
return res.status(401).json({ message: err.message });
case "ForbiddenError":
return res.status(403).json({ message: err.message });
case "NotFoundError":
return res.status(404).json({ message: err.message });
case "ConflictError":
return res.status(409).json({ message: err.message });
default:
return res
.status(500)
.json({ message: "서버 내부 에러가 발생했습니다." });
}
};
error-handling.middleware.js
switch case 문으로 해당 오류가 있으면 오류값을 return 하도록 설정한다.
import express from "express";
import cookieParser from "cookie-parser";
import LogMiddleware from "./middlewares/log.middleware.js";
import ErrorHandlingMiddleware from "./middlewares/error-handling.middleware.js";
import router from "./router.js";
const app = express();
const PORT = 3020;
app.use(LogMiddleware);
app.use(express.json());
app.use(cookieParser());
app.use("/", router);
app.use(ErrorHandlingMiddleware);
app.listen(PORT, () => {
console.log(PORT, "포트로 서버가 열렸어요!");
});
app.js
ErrorHandlingMiddleware를 app.use로 마지막으로 거치도록 설정한다.
이렇게 하면 커스텀 에러를 사용하기 위한 준비를 마쳤다~!
//입력받은 검색어를 가게이름에 포함하는 가게 & 메뉴이름에 포함하는 가게 검색기능
searchData = async (req, res, next) => {
try {
~~~~~~~~
} catch (err) {
if (err instanceof NotFoundError) {
res.status(404).json({ message: err.message });
}
}
next(err);
};
//controller영역
findStoreByMenuId = async (menuId) => {
const store = await this.reviewsRepository.findStoreBymenuId(menuId);
if (!store) {
throw new NotFoundError("해당하는 가게가 존재하지 않습니다.");
}
return store;
};
//service 영역
사용은 이런식으로 하면 된다.
이전보다 매우매우 간편해짐!
'TIL' 카테고리의 다른 글
TIL #26) 타입스크립트 발 담구기 (0) | 2024.03.05 |
---|---|
TIL #25) git branch시 모든 branch가 뜨지 않는 문제 (0) | 2024.02.29 |
TIL #23) 커버리지 보고서 (0) | 2024.02.22 |
TIL #22) test code - 의존성 주입하기 (0) | 2024.02.22 |
TIL #21) 기존코드 3계층 분리하기 (0) | 2024.02.21 |