MSA 심장부를 설계하다 - Theme 5. MSA Handle Exception

dev_will_d·2024년 4월 26일
0
post-thumbnail

필자는 가끔 산책을 하며 견고하고 안전하게 잘 지어진 건축물을 바라보며 감탄 하는 경우가 종종 있다. 어떻게 저렇게 시간이 지나도 안전하게 사람들에게 가치를 제공할 수 있는지, 어떠한 설계 원칙과 생각을 가지고 건물을 짖는지 등 여러 생각과 함께 소프트웨어 개발에 대해 생각할 때가 있다.

'지속가능한 소프트웨어 구축'은 개발자에게 가장 중요한 덕목이라고 해도 과언이 아니다. 사계절이 변하며 비가 오고 눈이 와도 사람들에게 안전한 공간과 가치를 건축물이 제공하듯 시스템 또한 세상이 변하고 비즈니스가 변해도 견고하고 안전하게 가치를 제공할 수 있어야 한다. 오늘은 지속가능한 시스템 구축에 있어 빼놓을 수 없는 예외처리에 대해 이야기 하는 시간을 갖도록 하겠다.

MSA 환경에서 예외를 처리하는 원리


다수의 서버가 분리 / 분해된 MSA 환경에서 예외 처리 또한 이전 포스팅 (MSA 심장부를 설계하다: Theme4. MSA JWT 전달 전략 like Fractal)에서 언급한 무한 프랙탈 구조와 닮아 있다. 특정 요청에 대한 예외를 발생시킨 서버에서 에러 메세지를 전달하고 전달받은 서버에서 이 에러메세지를 전달 받아 또 전달하는 구조이다.

🚨Tip) 필자는 계속해서 무한 프랙탈 구조에 대해 언급하고 있다. 개인적으로 필자가 MSA 설계를 하며 느끼는 감정은 무한히 반복되는 느낌이다. 즉, 무한 프랙탈 구조는 MSA에 대한 감각을 이해하는데 중요한 예시라고 할 수 있다. 이 글을 읽는 독자분들도 이 감각을 잘 알면 좋을거 같다.

더 자세히 원리에 대해 알아보자


클라이언트는 응답 서버에 요청을 보낸다. 응답 서버의 특정 로직에서 만약 Exception이 발생한다면 Common에 구축된 Exception Handler의 원리에 의해 클라이언트에 Exception 정보를 내려준다.
응답을 받는 서버는 Exception을 Catch하며 위와 같은 응답 구조를 알 수 있다. 응답을 받는 서버는 2가지 선택지가 있다. 응답을 주는 서버가 내린 Exception을 그대로 내릴지 특정 로직을 처리후 자신이 원하는 응답을 내릴지 선택해야 한다. 이러한 원리를 계속해서 반복함으로서 여러 서버가 분리 / 분산된 MSA 환경에서 Exception을 Handling 할 수 있다.

코드를 통해 더 자세히 이해해보자

MVC 원리


CommonHttpClient는 응답 값을 리턴 하기 전에 응답 서버에서 내린 status code를 통해 요청에 대해 성공인지 실패인지 판단한다. 실패라면 (응답을 내리는 서버에서 Exception이 발생) ApiExceptionImpl에 statusCode와 Result를 전달하여 ApiExceptionImpl Exception을 던진다. 이때 요청 서버에서는 그대로 Exception을 내릴지 아니면 특정 처리를 해서 내릴지 선택한다. 만약 그대로 내린다면 응답을 내리는 서버에서 Exception Handler를 통해 Exception을 내리듯이 똑같은 원리에 의해 Exception을 내릴수 있다.

WebFlux 원리


WebClient는 응답을 내리는 서버에서 Exception이 발생하면 WebClientResponseException이 발생한다. 이 Exception을 Catch 하여 MVC와 똑같은 과정으로 Exception을 처리한다.

이러한 과정이 각 서버와 서버 사이에서 계속 반복해서 이루어질 것이고 이를 통해 분리 / 분산된 MSA 환경에서 Exception Handling을 처리 할 수 있다.

마무리

재능인가 노력인가, 개발자로 살아가다 보면 주변에서 개발 재능이 너무 띄어나 절대 따라잡지 못한다는 말을 종종 듣는거 같다. 어떤 이들은 노력해도 따라 잡지 못한다고 한다. 정말 그럴까? 필자는 재능보다 더 중요한게 있다고 생각한다. 바로 '태도'다. '지속가능한 소프트웨어를 구축하겠다.', '더 탁월하고 훌륭한 소프트웨어를 구축하겠다. 과연 내가 작성한 코드는 탁월한가, 옳은가, 적합한가?!'라는 태도를 가진 진중한 개발자라면 재능이 있는 개발자 보다 그 끝에는 더 잘할것이라고 믿는다. 즉, '재능만으로 일류가 된 사례는 없다. 태도만이 유일한 일류가 되는 길이다.'라는 말처럼 휼륭한 태도가 훌륭한 개발자를 만들고 탁월한 소프트웨어 및 비지니스를 만들것이다. 이 말은 지속가능한 소프트웨어의 구축에서 빼놓을 수 없는 Exception Handling에 대해 구축 할때 꼭 말하고 싶었다... 그러니 다들 할 수 있다!!!

긴글 읽어주셔서 감사합니다☺️

profile
질문의 질이 답의 질을 결정한다.

0개의 댓글