티스토리 뷰
이 고민은 파라미터 유효성 체크를 편하게 하는 방법을 찾아보다가 시작되었다.(파라미터 유효성 체크를 편하게 해보자)
현재 우리 프로젝트는 JSP뷰를 사용하고 있다. 그리고 한 컨트롤러 클래스에는 뷰를 호출하는 메서드와 @ResponseBody를 사용하여 데이터를 내려주는 Ajax용 메서드가 혼재해있다. 그말인즉 컨트롤러에서 예외가 발생하면 잡아서 처리해줄 ControllerAdvice에서는 같은 예외에 따라 뷰를 내려줘야할수도, 데이터를 내려줘야할 수도 있다는 것이다.
@ControllerAdvice 여러 개로 해결하는 방법
그래서 @ControllerAdvice의 적용범위를 제한하는 방법을 생각했다. 특정 어노테이션을 가지고 있는지, 특정 패키지 이하에 존재하는지, 특정 클래스 타입인지 등을 확인하여 적용범위를 결정할 수 있는데, 이 방법을 적용하려면 뷰를 호출하는 메서드와 데이터를 내려주는 메서드를 분리해줘야 한다.
우선 특정 어노테이션을 가지고 있는지에 따라 테스트해보았다. 이 경우 아래와 같이 설정하고 테스트해보았는데,
내 예상과 다르게 제대로 작동하지 않았다. 데이터를 내려줘야 하는 메서드를 호출해도 왼쪽의 @RestControllerAdvice가 적용되어 뷰가 내려왔다. 어노테이션을 커스텀해서 테스트해보진 않았다.
패키지에 따라 나누는 방법도 테스트해보았다.
이 경우 내가 원하는대로 뷰를 내려줘야 하는 메서드를 가진 컨트롤러는 왼쪽의 ControllerAdvice를 통해 뷰를 내려줬고, 데이터를 내려줘야 하는 메서드를 가진 컨트롤러는 오른쪽의 ControllerAdvice를 통해 데이터를 내려줬다. 다만, 이 경우 잘못된 패키지에 컨트롤러를 만들게 되면 문제가 될 수 있다는 단점이 있다.
마지막으로 특정 클래스 타입인지 확인하여 처리해주는 방법을 테스트해보았다. 이때 나누는 타입인 ViewController와 DataController는 인터페이스이다.
이 경우도 내가 원하는대로 작동했다. 하지만 Controller를 만들 때 개발자가 에러를 구분해서 처리해주기 위해서 만든 인터페이스를 구현하지 않거나 잘못된 인터페이스를 구현한 컨트롤러를 만든다면 문제가 될 수 있다.
@ControllerAdvice 하나로 해결하는 방법
위 방법들을 살펴보면 결국 개발자가 개발을 하며 신경을 써줘야한다. ControllerAdvice를 하나만 사용하여 해결하는 방법이 없는 것은 아니다. 예외를 커스텀하여 그 예외를 처리하는 메서드를 만들어준다면 충분히 해결 가능하다. 하지만 이 경우, 그 예외를 던질 가능성이 있는 코드마다 데이터를 내려주는 메서드에서 호출한건지 뷰를 내려주는 메서드에서 호출한건지 구분해서 매번 예외를 바꿔주는 처리를 해야한다. 만약 개발자가 그 처리를 해주는 것을 몰랐거나 까먹어서 하지 못한 경우 문제가 될 수 있다.
결론? 백에서는 데이터 내려주는 API만?
동일한 예외일 때 뷰와 데이터를 나눠서 내려줄 수는 없을까 하는 고민으로 위 방법들을 살펴보았다. 하지만 어떤 방법이든 개발자가 개발할 때 신경쓰지 않으면 문제가 생길 소지가 있었다. 그래서 가장 근본적인 원인을 뜯어고치는게 좋지 않을까 생각했다. 바로 백에서는 데이터만 내려주는 api를 구축하고 프론트에서는 그 api를 이용하는 방법이다. 이 경우 백에서는 뷰를 내려주지 않으니 예외처리를 할 때 데이터만 내려주면 된다. 최근에 호돌맨의 요절보통 개발쇼를 들었는데, 이 강의해서 이런식으로 진행하는걸 보며 편리해보였다.
그렇다고 이미 돌아가고 있는 시스템을 아예 분리시킬 생각은 아니다. 내가 가능한 업무범위를 넘어서는 일이라고 생각하고 있고, 어떤 방법이든 일장일단이라고 생각하기 때문이다. 그런 점에 있어서 다른 회사들은 어떤 식으로 시스템을 구축하고 있는지 궁금하다. 내가 테스트했던대로 ControllerAdvice를 나눠서 여러 개 사용하고 있는지, 아니면 프론트와 백을 아예 분리해서 백에서는 데이터만 내려주는 api로 구성되어 있는지. 아니면 여기에 써놓은 다른 방법으로 예외처리를 하고 있는지.
'업무 경험 및 성과' 카테고리의 다른 글
@ControllerAdvice기능을 확인하기 위한 테스트코드에서 발생한 트러블 슈팅 (0) | 2022.08.27 |
---|---|
heroku postgresql credentials rotate 헤로쿠 postgresql credentials 변경 (0) | 2022.08.21 |
[회고] 시스템 개발 프로젝트 (0) | 2022.06.24 |
heap 덤프 분석해서 out of memory 원인 찾기까지의 과정 (0) | 2022.04.09 |
공통기능을 가진 두 시스템과 전체조회권한을 가진 관리자에 대한 처리에 대한 고민 (0) | 2022.03.24 |