일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Stream
- Stack
- thread
- Java
- Collection
- jvm
- Real MySQL
- 쿠버네티스
- JPA
- 스프링
- gradle
- 이스티오
- 토비의 스프링 정리
- SpringBoot
- K8s
- GC
- 보조스트림
- redis
- OS
- MSA
- 자바 ORM 표준 JPA 프로그래밍
- 토비의 스프링
- Kotlin
- list
- 백준
- 스트림
- 자바
- spring
- IntellJ
- mysql
- Today
- Total
인생을 코딩하다.
[Spring] @ControllerAdvice -> @RestControllerAdvice 본문
@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을 이용하여 모든 클래스에 전역적으로 적용시키는 법을 포스팅 하겠다.
'Spring' 카테고리의 다른 글
Junit4 -> Junit5 (목적(쓰임새)은 같지만 4 -> 5 로직 비교) (0) | 2020.11.30 |
---|---|
[Spring] Spring이 왜 Spring인지? 와 SpringBoot VS Spring (0) | 2020.11.08 |
[Spring] Spring AOP를 이용한 메서드 시간측정 / @LogExecutionTime (2) | 2020.10.29 |
[Spring] ExceptionHandler (0) | 2020.10.25 |
[Spring] checked exception을 unchecked exception으로 변경해서 던져야 하는 경우 (0) | 2020.10.22 |