인생을 코딩하다.

[Spring] @ControllerAdvice -> @RestControllerAdvice 본문

Spring

[Spring] @ControllerAdvice -> @RestControllerAdvice

Hyung1 2020. 10. 31. 09:56
728x90
반응형

@ExceptionHandler를 이용해서 메소드마다 예외처리를 해주다보니 같은 에러를 처리할때 마다

중복된 코드를 쓰게되었다. 중복된 코드를 쓰다보니 코드도 길어지고 유지보수 할 때 불편한 점이 많았다.

스프링 프레임워크의 큰 장점중에 하나가 AOP인데 중복된 코드를 쓴다는 것은 AOP에 어긋난다는 생각이 들었다.

그래서 나는 재사용성을 높여 중복된 코드를 없애 객체 지향적인 코드를 구현하고 싶었고,

(메서드는 한 가지 일만 해야하기 때문에) 

에러를 한 곳에서 처리해서 controller 전역에 적용되는 예외처리 구문을 만들어야겠다는 생각을 하였다.

 

그래서 공부하던 중 ControllerAdvice annotation의 @ControllerAdvice와@RestControllerAdvice을 알게되었고, 

API 서버를 위해 json형식의 파싱이 가능한 @RestControllerAdvice관해 공부하였고, 리팩토링하고 나서 코드가 훨씬 클린해졌다는 것을 느꼈다. 개발자의 덕목 중 하나는 지식 공유라는 생각이 들어 포스팅 하고 있다.

 

 

 

우선 핸들러 패키지에 클래스를 추가하였고, 에러 코드들을 작성했다. @ExceptionHandler을 이용하여 인자로 클래스들을 받아와 필요한 에러 코드들을 작성해주었다.

 

그 후 ControllerTest에서 필드에

    @Autowired
    private GlobalExceptionHandler globalExceptionHandler;

 

빈 주입을 해주었고 (사실 이렇게 필드 주입을 하는 것 보다 생성자 주입을 하는 것이 더 좋은 코드고 생성자 주입은 spring 게시판에 포스팅해놨다.)

 

    @BeforeEach // 해당 어노테이션은 메서드 매 test마다 먼저 실행되게 하는 구문
    oid beforeEach() {
        mockMvc = MockMvcBuilders
                .standaloneSetup(personController)
                .setControllerAdvice(globalExceptionHandler)
                .alwaysDo(print())
                .build();
    }

BeforeEach 메서드에 setControllerAdvice를 이용해 로직을 작성해준다.

 

@BeforeEach란 해당 메서드가 매 test마다 먼저 실행되게 하여 모든 메서드에 로직을 추가해주지 않아도, BeforeEach를 사용해서 전역적으로 로직이 먼저 실행되개 해준다.

 

@RestControllerAdvice와 @ExceptionHandler를 이용하여 중복된 코드들을 없애고 전역적인 예외처리를 해주었더니

유지보수 과정에서 훨씬 편리해져 비즈니스 로직에 더욱 집중할 수 있게 되었다.

 

하지만 이렇게 하면 만약 Controller 클래스가 2개 있다고 할 떄, ( ex) oneController, twoController) 2개의 클래스 모두에 적용되는 것이 아닌, 적용해준 한 클래스에만 전역적으로 적용이된다.

 

그래서 다음 포스팅에는 모든 Servlet API에서 적용하는 Context로 모든 Servlet에서 공유하는 WebApplicationContext을 이용하여 모든 클래스에 전역적으로 적용시키는 법을 포스팅 하겠다.

728x90
반응형
Comments