Search

#023 #예외처리 / Pipe

 예외처리

 401 예외처리 테스트

cats.controller 에서 getAllCat에 대한 예외처리를 강제로 넣어준다. → 예외처리는 HttpException객체를 이용한다.

 HttpStatus

예외 처리할 때, 코드를 직접 넣지 않고 이렇게 전역 변수를 사용할 수 도 있다. 그럴 땐 HttpStatus객체에서 메시지에 맞는 것을 가져다 쓰면된다.

 에러 커스터마이징

이렇게 커스터 마이징도 가능하다. 아까 메시지를 넣었던 부분에 json객체로도 반환할 수 있다.

 HttpException.Filter

예외처리를 하게 되면 위처럼 모든 에러에 대한 예외처리 코드를 각 위치에서 구현하게 된다. 하지만 이 에러들을 모두 한곳으로 모아서 필터링하면 좀 더 효율적이지 않을까 생각할 수 있다. 그 때 사용할 수 있는것이 HttpException.Filter 이다.

 공식 문서 예시

공식 문서에는 위 처럼 나와있다.

 http-exception.filter 파일 생성

루트 디렉토리에 해당 파일을 생성하고, 나머지 코드는 문서에 나온대로 복붙해보자. → ctx : 실행 환경에 대한 컨텍스트

http-exception.filter.ts 코드

 filter 적용하는 방법

적용하는 방법에는 특정 메소드에 데코레이터를 사용해서 적용하는 방법과, 전역으로 적용하는 방법 두 가지가 있다. 둘 다 알아보자.

 메소드 적용

@UseFilters 데코레이터를 사용해서 HttpExceptionFilter 를 등록하면 해당 메소드에 필터를 적용할 수 있게 된다.

 테스트 확인

해당 메소드를 요청을 해보면 timestamp가 찍혀있게 되는데, 이런 형태는 HttpExceptionFilter 객체에 정의된 내용 때문이다.

 HttpExceptionFilter

즉, HttpExceptionFilter를 내가 원하는 곳에 필터를 적용할 수 있다는 뜻이기도 하다.

 각 에러에 따른 메시지 전달하기

위에서도 설명했다시피, 1. getAllCat 메소드에서 throw를 날리고 2. 그 throw를 HttpExceptionFilter가 받았다. 3. 그리고 반환 형태를 아래 response.status(status).json 에서 정의를 했는데, 여기에 최초에 발생했던 throw의 메시지를 받으려면 4. HttpException에 담겨있는 getResponse를 꺼내면 된다. 5. 그리고 json형태에서 키와 밸류가 같으면 그냥 단어만 넘길 수 있어서 error만 명시

 postman 확인

사진과 같이 필터에서 적용하지 않은 에러메시지가, 해당 메소드에 맞춰서 메시지가 반환이 되었다. 이제 부터는 throw로 해당 메소드를 위한 에러처리만 메시지로 남기고 @UserFilters(HttpExceptionFilter) 를 달아주면 각 메소드에 맞는 에러메시지를 반환할 수 있다.

 UseFilter 데코레이터 위치

이렇게 메소드 위에 달아서 그 메소드만을 위한 필터가 될 수 있고
이렇게 컨트롤러 위에 필터를 달아주면 컨트롤러 전역에 필터를 적용할 수 있다.

 전역 필터 설정하기

 useGlobalFilter

app.useGlobalFilter(new HttpExceptionFilter());
JavaScript
복사
위의 코드를 main.ts 파일에다가 등록해줘야 전역적으로 설정이 된다.

 404 의도적으로 띄워보기

404 미들웨어는 아까 우리가 직접 만든 미들웨어인데, 해당 에러가 전역 필터의 내부 error에 담기게 되면서 위와 같은 형태로 반환이 되었다.

 ’이거아니면 저거’ 기호 ‘|’

이 문법은 TypeScript의 유니온 타입 (Union Type)을 의미한다. 즉, 이 타입 아니면 저 타입일 수 있다는 의미로 사용되며, 따라서 유연하게 여러가지 경우의 수를 처리할 수 있도록 하는 문법이다.

 적용 하기

error 부분에서 string 또는 객체로 들어오게 되는 건데, 이럴때 위와 같은 문법을 사용해서 타입을 받을 수 있다. 그리고 여기에 대한 분기처리를 해줘야 된다.

 분기 처리

위의 코드에 따라서 직접 설정한 필터일 경우와, nest에서 내부적으로 정의된 예외처리를 같이 처리할 수 있다. …error 는 스프레드 연산자를 사용한 것인데, error 가 다양한 속성을 가진 객체일 경우에 속성을 펼쳐서 새로운 객체에 포함시키는 역할을 한다.

 pipes

파이프는 데이터의 변환과 검증을 담당하는 툴이며, 컨트롤러 메소드가 호출되기 전에 이를 처리해서 안정성과 일관성을 유지하는 데 중요한 역할을 한다.

 주요 사용 사례

1.
변환 (Transformation):
입력 데이터를 원하는 형태로 변환한다. 예를 들어, 문자열을 정수로 변환하고 싶은 경우
2.
유표성 검사 (Validation):
입력 데이터를 평가하여 유효한 경우 그대로 통과시키고, 유효하지 않은 경우 예외를 발생시킨다.

 문서 예시

문서에는 @Param 데코레이터를 사용한다음, 첫 번째 인수에 키값을 넣으면 두번째 인수에 파이프(ParseIntPipe) 를 달 수있다. 거기에 들어오는 값을 파이프를 통해서 id:키값에 number타입으로 변환해서 할당하겠다는 뜻이다.

 테스트

/cats/123 으로 요청을 하게 되면, 123은 string으로 요청이 가게되는데, 실제 백엔드에서 구현을 할때는 이런 id값은 int로 사용하는 일이 많으므로 int 타입으로 변환하는 작업이 필요하다. 이런 작업을 ParseIntPipe 을 사용해서 123을 정수로 바꿀수 있다. 정수로 바뀐다면 위와 같이 const num = id +1 ; 이 정상적으로 연산이 될 것이다.

 확인

이렇게 연산이 되어 123이 124가 되었다.

 유효성 검사

Pipe의 특징은 타입을 변환하는 작업과 유효성 검사이기 때문에 URL에서 정수로 형태의 string을 받아야 되는데, abd 는 그런 형태가 아니므로 메시지와 함께 예외처리를 한다. 해당 에러 메시지는 nest 내장 기능이다.