레거시 프로젝트를 현재 리팩토링을 진행 중인 프로젝트가 있다. 일단 프로젝트의 경우 토이 프로젝트로 진행을 하던 도 중 최근에 MSA 를 접하면서, 모놀로식 서비스에서 MSA 로 변경을 진행을 하고 있었다.
간략하게 설명을 하면 이렇다. Exception Functions 를 사용을 하면 가독성이 증가하는 효과와 함께, 다른 문서 혹은 코드를 보고서 로직에 대한 예외 처리가 알 수 있다고 생각이 든다.
기본적이 코드는 위와 같다. 위의 코드를 설명을 하면
- 조회를 한 후에 조회 (findByIdAndMemberSet_Id_UserId)
- 조회를 해서 가지고 온 데이터에서 특별한 조건일 때 만
method
(removeBand) 를 실행을 하고 그렇지 않는다면,Exception
처리를 하게 된다.
단순하게 if
절을 사용을 했던 코드 였다, 하지만 if
절의 경우 우리가 개발자의 관점에서는 위의 코드의 경우도 가독성이 상당하게 높다. isLeader
라는 변수 자체가 Leader 의 유무 상태를 하는 변수 명이라고 받아 들일 수 있게 작성을 하였고 if
절을 통해서 true
니깐 발생이 된다. 라고 머리속에서는 받아드릴 수 있는 코드이다.
그렇다면, 필자가 소개를 해주는 exception functions 를 통해서 어떤 효과를 가지고 오는지 리팩토링 된 코드를 보자.
위의 코드와 비교를 하면 코드의 전반적인 flow 는 같다. 하지만 차이점은 check
메소드를 사용을 하는 것이다. 그렇다면 어떤 이점을 가지고 있는지 눈으로 보자!
isLeaderAble
을 check
하는 메소드라고 정확하게 표현을 해주고 있다. if 절을 사용을 할 때보다 kotlin 스럽다고 필자는 표현할 수 있다.
여기서 if 절과 check 메소드를 차이점을 굳이라고 표현하는 개발자도 있다. “근데 if 절만 사용을 하고 check 메소드를 이용을 하지 않는다면 kotlin 을 사용하지말고 java 나 다른 언어를 사용하기 권장” 한다.
필자가 생각하기에 굳이 if 절을 ..? 바꿔라는 표현은 좋지 못하다라고 생각된다.
또한 마냥 check 메소드가 좋다는 것은 아니기 때문에 상황에 맞게 잘 쓰는 것이 좋은 개발자라고 생각 된다.
그렇다면 다른 exception 관련된 kotlin function 을 자세하게 알아 보자.
상태 체크
상태 체크 메소드의 경우 위의 check
메소드를 의미를 하게 된다.
언제 사용하는데?
- 어떤 객체가 미리 초기화 되어 있어야만 처리를 하게하는 경우
- 사용자가 로그인 했을 때만 처리를 하게 하고 싶은 경우
- 객체를 사용할 수 있는 시점에 사용하고 싶은 경우
기본적으로 check 메소드의 경우 위와 같이 간결하게 사용을 할 수 있다. 또한 내부의 함수를 보면
한번더 check 메소드와 함께 lazy message 를 던저 주고 있다. 여기서 lazy message 는 “Check failed.” 이며, 만약 value 값이 false 일 때만 동작을 하게 된다.
check 에서 lazy message 와 함께 같이 쓰면 내부적으로 아래와 같이 동작을 하게 된다.
value 가 true 이면 lazyMessage 가 호출을 하게 된고 그리고 IllegalStateExcpetion
가 발생을 하게 된다.
만약 커스텀 exception 을 사용을 하고 싶다면 lazyMessage 에 Exception 을 던저 주면 된다.
여기서 모든 value 값을 true 라고 생각을 하고 작성을 하였다. 결국 lazyMessae 의 경우 false 일때 실행이 된다.
아래의 코드 처럼 상태 역전에 대한 코드를 작성을 하고 싶을 때가 있을 것이다. 하지만 위의 코드를 작성하는 것에 있어서 필자가 생각하기에 check 메소드의 존재를 약간 부정을 하게 된다.
check(!value){ throw RuntimeException()}
또한 일반적은 boolean 값을 check 를 하는 것이 아닌, object 에 대한 null 체크도 제공을 해준다. check 와 같은 원리로 동작을 하게 된다. (IllegalStateExcpetion
을 예외처리 되게 된다)
- check 메소드는 lazyMessage 를 사용하지 않는다면 기본적으로
IllegalStateExcpetion
가 발생을 하게 된다. - 만약 custom exception 을 처리를 하고 싶다면, lazyMessage 에서 custom exception 을 던저 주면 된다.
아규먼트
아규먼트의 경우 require
메소드를 통해서 사용을 한다.
언제 사용하는데?
- 일반적인 조건을 걸 때 많이 사용을 한다. ( ex) email check 와 num 의 값을 체크를 하게 된다)
check 와 다르게 조건을 거는 형식으로 require 메소드를 사용을 하면된다, lazyMessage 를 통해서 custom exception 을 던지는 방법도 있고 기본적으로 IllegalArgumentException
이 발생이 된다.
위의 처럼 테스트 코드를 작성을 해보고 테스트를 진행을 해보았을 때, 내가 생각 테스트 케이스 별로 작동을 하는 것을 볼 수 있다.
정리를 하자면, 가독성을 높여주기 위해서 상태체크를 할 때, check
를 사용을 하고 제약 조건을 걸고 싶을 때 require
를 사용을 해서 kotlin 을 사용을 하는 것이 가장 좋다라고 필자는 생각이 든다, 단순하게 if 절을 통해서 작성하는 것도 좋지만 .. kotlin 에서 제공해주는 것 자체가 너무 좋기 때문이다.
또한 아울러 CustomException 을 사용하라고 가이드 해주었지만, 라이브러리의 Exception 을 유용하게 사용하길 권장한다.