이전 코드까지는 try-catch 문을 사용하여 에러를 잡아내고, Catch에서 반복적으로 Log 저장과, 에러 처리를 반복적으로 진행하였다.
// Old service
import { getConnection } from "typeorm";
import { guestBooksRepo } from "../model/repository/guestBookRepo";
async function findAll() {
try {
const connection = getConnection();
const guestRepoData = connection.getCustomRepository(guestBooksRepo);
return await guestRepoData.findAll();
} catch(err: unknown) {
// Error 처리
}
}
이 방법을 사용할 경우 try-catch에 모든 에러를 정의해야 했으며, 불필요한 코드의 중복이 너무 많이 발생했다. 또한, try-catch문이 반복적으로 사용되어 보기에도 더러워보이는 것은 덤.
이를 해결하기 위해, 머리를 조금 굴려봤다. 우선, Controller - Service 서비스는 큰 서비스가 아닐 경우 복잡도만 높이는 꼴이기에, Controller 측에 Service 역할을 같이 하게끔 계획하였다.
또한, 이전과 다르게 Function 방식이 아닌, Class 방식을 사용해 보았다. 이는 조금 더 사용해보고 괜찮은 걸로 바꿀 예정이다(지금은 개발 방향을 고민하고 있는 것이니까)
그리고, 에러 처리의 경우 next() 함수로 넘겨 다음 라우터에서 처리하는 방식을 구현해보았다.
// New controller
class AuthController {
// # : private
#aur: accessUserRepo;
constructor() {
this.#aur = new accessUserRepo();
}
// This 바인딩 문제로, 화살표 함수로 바꿨음.
addUser = async (req: Request, res: Response, next: NextFunction) => {
//const {u_email, u_password, u_name, u_nickname} = req.body
const bodyData : insertDto = {
u_email: req.body.userId,
u_password: req.body.userPw,
u_name: req.body.userName,
u_nickname: req.body.userNick,
flag: 0,
}
// 잘못된 파라미터?
if(await chkChar(bodyData) !== true) {
next('wrongParams');
return;
}
try{
// 해당 유저 존재할 경우
if(await this.#aur.findUser(bodyData.u_email)) {
next('userAlreadyExists');
return;
}
await this.#aur.addUser(bodyData);
res.json({"message": "처리 완료!"});
} catch(err) {
next('serverDbErr');
}
}
}
export default AuthController;
// app.ts
// ...
app.use("/", indexRouter);
app.use("/auth", authRouter);
app.use(errHandler);
export default app;
// errHandler.ts
import express, { Router, Request, Response, NextFunction } from 'express';
import { errorDto } from '../interfaces/errorDto';
const errorList = require('../lib/errorList.json');
export default (errCode: number, req: Request, res: Response, next: NextFunction) => {
const errResult: errorDto = errorList[errCode];
res.status(errResult.httpStatus).json(errResult);
}
이렇게 구현해도, try-catch를 써야 하는 것엔 변함이 없었다. (DB 관련 문제를 받아먹을수가 없음)
해당 방법은 조금 더 고민을 해봐야 할 것 같다.
이전 코드까지는 try-catch 문을 사용하여 에러를 잡아내고, Catch에서 반복적으로 Log 저장과, 에러 처리를 반복적으로 진행하였다.
// Old service
import { getConnection } from "typeorm";
import { guestBooksRepo } from "../model/repository/guestBookRepo";
async function findAll() {
try {
const connection = getConnection();
const guestRepoData = connection.getCustomRepository(guestBooksRepo);
return await guestRepoData.findAll();
} catch(err: unknown) {
// Error 처리
}
}
이 방법을 사용할 경우 try-catch에 모든 에러를 정의해야 했으며, 불필요한 코드의 중복이 너무 많이 발생했다. 또한, try-catch문이 반복적으로 사용되어 보기에도 더러워보이는 것은 덤.
이를 해결하기 위해, 머리를 조금 굴려봤다. 우선, Controller - Service 서비스는 큰 서비스가 아닐 경우 복잡도만 높이는 꼴이기에, Controller 측에 Service 역할을 같이 하게끔 계획하였다.
또한, 이전과 다르게 Function 방식이 아닌, Class 방식을 사용해 보았다. 이는 조금 더 사용해보고 괜찮은 걸로 바꿀 예정이다(지금은 개발 방향을 고민하고 있는 것이니까)
그리고, 에러 처리의 경우 next() 함수로 넘겨 다음 라우터에서 처리하는 방식을 구현해보았다.
// New controller
class AuthController {
// # : private
#aur: accessUserRepo;
constructor() {
this.#aur = new accessUserRepo();
}
// This 바인딩 문제로, 화살표 함수로 바꿨음.
addUser = async (req: Request, res: Response, next: NextFunction) => {
//const {u_email, u_password, u_name, u_nickname} = req.body
const bodyData : insertDto = {
u_email: req.body.userId,
u_password: req.body.userPw,
u_name: req.body.userName,
u_nickname: req.body.userNick,
flag: 0,
}
// 잘못된 파라미터?
if(await chkChar(bodyData) !== true) {
next('wrongParams');
return;
}
try{
// 해당 유저 존재할 경우
if(await this.#aur.findUser(bodyData.u_email)) {
next('userAlreadyExists');
return;
}
await this.#aur.addUser(bodyData);
res.json({"message": "처리 완료!"});
} catch(err) {
next('serverDbErr');
}
}
}
export default AuthController;
// app.ts
// ...
app.use("/", indexRouter);
app.use("/auth", authRouter);
app.use(errHandler);
export default app;
// errHandler.ts
import express, { Router, Request, Response, NextFunction } from 'express';
import { errorDto } from '../interfaces/errorDto';
const errorList = require('../lib/errorList.json');
export default (errCode: number, req: Request, res: Response, next: NextFunction) => {
const errResult: errorDto = errorList[errCode];
res.status(errResult.httpStatus).json(errResult);
}
이렇게 구현해도, try-catch를 써야 하는 것엔 변함이 없었다. (DB 관련 문제를 받아먹을수가 없음)
해당 방법은 조금 더 고민을 해봐야 할 것 같다.