3레이어드 아키텍쳐를 진행하면서 약간 이해하기 어려웠던 개념이 throw 키워드였다.
원래 하나의 라우터를 3개로 쪼개면서 res.status로 리턴하던 것을 controller부분이 아닌 서비스부분으로 가야되는 내용이면 throw로 바꿔줘야 한다고 하는데 레이어드 아키텍처를 똑바로 이해하지 못한 상태에서 클론코딩만 하다보니
service단에서 던지면 왜 controller에서 받을 수 있는 건지 도통 이해가 안 갔다.
일단 예외처리(Exception Handling)의 목적은 프로그램이 실행되는 동안 문제가 발생했을 때 자동으로 중단되는 것을 대처할 수 있도록 처리하는 것을 통틀어서 말한다. 프로그램 실행 중 발생하는 오류를 '예외'라고 하고, 프로그래밍 언어의 문법적인 오류를 에러(error)라고 한다.
예외는 기본/고급 두가지 처리방식이 있는데, 예외가 발생하지 않게 사전에 해결하는 것을 기본예외처리라고 하며 대개 조건문으로 처리한다. 고급예외처리에 해당하는 것이 throw 키워드로 대표되는 방식인 것이다.
throw
예외를 발생(throw)시키는 것은 에러나 예외 상황을 알린다는 것이다. 한편 예외를 잡아내다(catch)라는 것은 그것을 처리한다는 것이다. 자바스크립트는 런타임 에러가 일어날 때마다 예외를 발생시키는데, 또한 프로그램에서 throw문을 사용하며 명시적으로 발생시킬 때도 마찬가지다.
예외가 발생하면 인터프리터는 정상적인 프로그램 실행을 즉시 중단하고 가장 가까운 예외처리기로 넘어간다. 예외를 발생시켰던 코드 블록이 catch절과 연결되어 있지 않으면 인터프리터는 바로 상위단계를 감싸고 있는 코드 블록에 연결되어 있는지 확인하고 처리기를 찾을 때까지 이 과정이 반복된다. 이 같은 방법으로 자바스크립트의 call stack을 따라서 예외가 전파되어 올라간다.
throw로 던지고 try/catch/finally로 잡아낸다.
throw는 내용은 대개 Error객체 또는 Error의 하위클래스 중 하나의 인스턴스가 되곤 한다. 또한 에러메시지를 담고 있는 string이나 에러코드를 나타내는 숫자도 던질 수 있다.
try/catch/finally
try는 처리할 예외가 발생할지도 모른는 코드 블록을 정의하는 역할을 한다. catch로 이어지는데 이것은 try블록 내부에서 예외가 발생할 경우 호출되는 문장 블록이다. 그리고 finally블록이 이어지는데, 앞서 try블록에서 일어난 일에 관계없이 항상 실행이 보장되는 뒷정리용 코드가 포함된다.
catch/finally는 생략될 수 있지만, try는 둘 중 하나 이상의 블록과 함께 사용되야 한다.
- try
- 정상이라면 아무런 문제없이 블록의 시작부터 끝까지 실행된다.
- 경우에 따라서 예외가 발생할 수 있는데, throw문에 의해 직접 발생할 수도 있고 예외를 발생시키는 다른 메서드의 호출에 의한 것일 수도 있다.
- catch
- 이 블록 내부의 문장들은 오직 try 블록에서 예외가 발생할 경우에만 실행된다.
- 보통 (error)의 방식으로 지역변수를 사용하여 Error 객체 또는 앞에서 던진 다른 값을 참조할 수 있다. 내가 이번 프로젝트에서 사용한 것은 서비스단에서 throw로 code와 message를 던지고 res.status(error.code).json({ error.message })의 방식으로 사용해봤다.
- 이 블록에선 예외를 처리할수도, 무시할수도, 아미녀 throw를 사용해서 예외를 다시 발생시킬 수도 있다.
- finally
- 상술했듯이 try블록에서 일어난 일에 관계없이 무조건 실행될 코드가 위치한다. try블록이 어떻게든 종료되면 실행된다.
- try블록이 종료되는 상황
- 정상적으로 블록 끝에 도달
- break, continue 또는 return문에 의해
- 예외가 발생했지만 catch 절에서 처리했을 때
- 예외가 발생했고, 그것이 잡히지 않은 채 퍼져나갈 때
이번에 느낀 점은 구조의 이해없이 그냥 페이지를 나눈다고 생각했던 것이 이해를 어렵게 했다는 점이다. react를 할 때 component간에 props를 던지는 느낌으로 봤어야 하는데, 페이지를 나눈다고만 생각하니 throw가 어떻게 동작하는지 이해가 전혀 되지 않았던 것이다. 팀 프로젝트를 하면서 시간에 쫓기다보니 차분하게 이해할 수 있는 시간이 없었고 프로젝트 끝물에야 service에서 던진 에러코드가 controller에서 반환되는 구조가 이해되었다.
출처 : https://webclub.tistory.com/71
예외 처리 - throw 및 try/catch/finally
throw & try/catch/finally(Exception Handling) 이 글에서는 예외 처리 방식에 대해 알아봅니다. 프로그램이 실행되는 동안 문제가 발생하면 프로그램이 자동으로 중단됩니다. 이럴 경우에 프로그램이 대처
webclub.tistory.com
'Sparta > TIL' 카테고리의 다른 글
24.03.05 TIL - Typescript (0) | 2024.03.06 |
---|---|
24.03.04 TIL - Nest.js 기초 (5) | 2024.03.05 |
24.02.27 TIL Mocking (1) | 2024.02.28 |
24.02.26 TIL - test code(1) (0) | 2024.02.27 |
24.02.23 TIL - Layered architecture (1) | 2024.02.25 |