개발자
프로젝트 간단한 설명 저희 회사 프로젝트는 프론트엔드 Rect, 백엔드 Spring 으로 되어 있고 보안 회사여서 프론트 파트는 모노레포로 구성 되어있습니다. React와 NodeJS 가 같은 포트를 사용해서 모든 요청이 NodeJS에서 처리 됩니다. NodeJS는 React와 Spring의 중간 단계라고 생각하시면 되고 구성은 Router(프론트에서 받은 요청, 지금은 Controller 분리한 상황), Api(백엔드 요청 로직)으로 구성 되어있습니다. 궁금한 부분 다른 분들의 프로젝트를 봤을 때 Controller에서는 try~catch로 오류를 체크하는데 Service에서는 Promise 객체를 반환만 할 뿐 체크하는 로직은 없었습니다. 여기 프로젝트에서 Api와 Service의 의미가 다르지만 Promise 그대로 반환하면 return 타입이 Promise<any>로 설정 될 수 밖에 없습니다.(타입 설정 불가) 그리고 Controller에서 데이터를 검증해야 하고 res.data로 받아야 될 수 밖에 없습니다. 이렇게 하면 body와 header 등 응답에 필요한 부분을 받을 수 있지만 과연 이게 맞는 것인지 의문이 들어서 같이 나누고자 글을 남깁니다. 정리 1. Api(NodeJS에서 Spring으로 요청하는 로직)에서 Controller와 동일하게 예외 처리해야 되는지 2. Api에서 검증을 수행하고 res.data를 던져도 되는 부분인지 응답을 어떤 형식으로 처리하는지(만약 header의 값이 필요하면 같이 객체로 묶어서 return 해야 함) 코드 예시(해당 코드는 회사와 관련 없으며 이해를 위한 코드 입니다)
1//Api.ts
2const userApi = (param, header): Promise<any> => {
3 return await axios.get('Spring Url', {param,header...})
4}
5
6//Controller.ts
7const loginUser = wrapAsync((req: Request, res: Response): Promise<void> => {
8 const data = await userApi();
9 res.status(data?.status || 200).send(data.data);
10})
11
12//예외처리 비동기
13export function wrapAsync(fn) {
14 return (req, res, next) => {
15 fn(req, res, next).catch(next);
16 };
17}
18
19//index.ts(root)
20app.use((e, req, res, next) => {
21 res.status(e?.response?.status || 500).send(
22 e?.response?.data || errorCodes.internalError,
23 );
24});
답변 1
Express에서 Service 단에서의 예외 처리 방법에 대해 알려드리겠습니다. 1. Service에서 예외 처리: - Service는 비즈니스 로직을 담당하는 부분으로, 일반적으로 비동기 함수를 반환하게 됩니다. 이때 비동기 함수 내부에서 발생하는 예외는 프로미스 객체의 reject를 통해 처리할 수 있습니다. 즉, Service 내부에서 예외가 발생하면 해당 예외를 reject하여 반환하면 됩니다. 이렇게 하면 호출하는 측에서는 프로미스의 catch를 통해 예외를 처리할 수 있습니다. 2. Api에서 검증과 응답 처리: - Api는 Node.js에서 Spring으로 요청을 보내는 로직을 담당하는 부분입니다. 이때 검증 로직을 수행하고, 필요한 응답 데이터를 반환하는 역할을 합니다. 만약 반환해야 할 응답에 헤더 정보가 포함되어야 한다면, 응답 데이터와 함께 헤더 정보를 객체로 묶어서 반환하는 것이 좋습니다. 3. Express에서 예외 처리: - Express에서는 오류 미들웨어를 사용하여 예외를 처리할 수 있습니다. 예외가 발생한 경우 오류 미들웨어로 이동하여 오류 처리 로직을 수행하고 클라이언트에게 적절한 응답을 보내주면 됩니다. 위의 예시 코드를 참고하시면서 Service에서 예외 처리를 수행하고, Api에서 검증과 응답 처리를 분리하여 구현하실 수 있습니다. 이를 통해 코드를 더욱 명확하게 분리하고 예외 상황에 대한 처리를 효과적으로 수행할 수 있습니다.
1#1
2function someServiceFunction(): Promise<any> {
3 return new Promise((resolve, reject) => {
4 // 비즈니스 로직 수행
5 if (someErrorCondition) {
6 reject(new Error("예외 메시지"));
7 } else {
8 resolve(result);
9 }
10 });
11}
12
13#2
14async function someApiFunction(): Promise<any> {
15 // 검증 로직 수행
16 if (someValidationFailed) {
17 throw new Error("검증 실패 메시지");
18 }
19
20 const response = await axios.get('Spring URL', { param, header... });
21
22 return {
23 data: response.data,
24 headers: response.headers,
25 // 필요한 응답 데이터 추가
26 };
27}
28
29#3
30app.use((err, req, res, next) => {
31 res.status(err.status || 500).send(err.message || "Internal Server Error");
32});
커리어리 AI 봇의 답변을 평가해 주세요!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!