오류 해결/API

엔드포인트 500 오류 해결 / param으로 받아오는 엔드포인트와 중복 주의

jaein 2023. 6. 1. 11:08

<경위 설명 길음.. 결론은 제일 밑에!>

 

 

 

멋지게 코드를 짜고 test를 돌리니 더 멋지게 500에러가 떴다.

 

500에러는 서버오류인걸 알고 있었기에 내가 잘못 짠 코드가 있나 확인을 했다.

근데 아무리 확인해도 코드 넘 잘 짰음..

 

에러 메시지를 다시 확인해보니

이상하게도 어느 부분에서 오류가 났는지는 나타나지 않고

 

[Nest] 3589  - 2023. 05. 31. 오후 12:47:41   ERROR Object:
{
  “statusCode”: 500,
  “timestamp”: “2023-05-31T03:47:41.648Z”,
  “path”: “/my”,
  “message”: “”,
  “name”: “”
}

 

계속 이렇게만 뜨는거임

 

client에서 요청을 보내는 엔드포인트가 잘못 설정됐을 수도 있어서

swagger랑 post man을 확인해봤는데 넘 멀쩡함..

 

입력값을 잘못 줬나 확인해봐도 넘 잘 줬음...

 

 

ㅇㅏ ~ ~ 엔드포인트 구성 코드가 잘 못 됐구나^^..

 

그래서 엔드포인트 코드를 확인해봤는데

또 엔드포인트도 넘 잘 짰음...

export const GetMyProduct = () =>
  applyDecorators(
    Get('/my'),
    ApiOperation({ summary: '내 상품 확인' }),
    ApiCreatedResponse(),
  );

 

그래서 원인을 찾기 위해 엔드포인트로 여러가지 실험을 해봤다.

 

실험결과

1. '/my', '/user', '/abcd' 와 같이 한개의 엔드포인트로 이루어지면 500오류가 남

2. '/my/point', '/user/list', '/abcd/efgh' 와 같이 두개의 엔드포인트로 이루어지면 200코드가 뜸

3. 근데 '/11', '/1234' 와 같이 숫자로 작성하면 한개의 엔드포인트로 이루어졌더라도 200코드가 뜸

 

 

대체 뭘까....!!!

다른 엔드포인트랑 중복되는 것도 없고, 오탈자도 없는데....!!!

 

 

 

원인은 허무했다.

export const GetUserInfo = () =>
  applyDecorators(
    Get('/:userId'),
    ApiOperation({ summary: '유저 정보 조회' }),
    ApiCreatedResponse({ schema: {} }),
  );
  
  
  export const GetMyProduct = () =>
  applyDecorators(
    Get('/my'),
    ApiOperation({ summary: '내 상품 확인' }),
    ApiCreatedResponse(),
  );

위쪽 GetUserInfo가 기존에 있던 다른 엔드포인트 중 하나이고

아래쪽 GetMyProduct가 에러가 났던 엔드포인트이다.

 

문제점을 찾아보시오....

 

 

 

 

정답은.. ~~ 엔드포인트 중복이었다! ^^

저게 중복이라니...!!

쉽게 말 하자면 오류가 났던 GetMyProduct의 '/my'의... my<-를

GetUserInfo가 본인한테 요청 들어온 param (':/userId')인 줄 알고 Int로 보내줘야지 왜 String으로 보내주냐면서 500오류를 외쳤던 것.....

그래서 GetMyProduct의 엔드포인트를 숫자로 작성하면 Int로 잘 들어갔기 때문에 200코드가 떴던 것이다.....^^

 

 

 

결론은

'/my' 엔드포인트와, '/:param' 엔드포인트는 중복된다...ㅎ

'/my' 엔드포인트의 'my'가 '/:param' 엔드포인트의 param으로 처리됐던것이다......

 

 

해결방법은

':/userId' 엔드포인트를 '/user/:userId' 로 수정하기

 

 

 

 

그리고 잘못된 엔드포인트로인한 서버 오류를 방지하기 위해

인자를 받는 코드쪽에 ParsIntPipe를 추가해서 String으로 들어와도 Int로 변환해주는 과정을 추가하거나

인자 타입을 dto로 따로 작성해 타입 변경을 하려고 한다.

 

이 두가지는 따로 글을 작성할 예정이다!