티스토리 뷰
@ExceptionHandler
controller 계층에서 발생하는 에러를 잡아서 메서드로 처리해주는 기능이다.
Service와 Repository에서 발생하는 에러는 제외한다.
@ControllerAdvice
@Controller와 handler에서 발생하는 에러들을 모두 잡아주는 역할을 한다.
@ControllerAdvice 안에 @ExceptionHandler가 있어서 에러를 잡는다.
@ControllerAdvice는 모든 에러를 잡기 때문에 일부 에러만 처리하고 싶을 경우에는 따로 설정을 해준다.
// 1.
@ControllerAdvice(annotations = RestController.class)
public class ExampleAdvice1 {}
// 2.
@ControllerAdvice("org.example.controllers")
public class ExampleAdvice2 {}
// 3.
@ControllerAdvice(assignableTypes = {ControllerInterface.class, AbstractController.class})
public class ExampleAdvice3 {}
- basePackages: 탐색 패키지 지정, 패키지, 하위 패키지까지 모두 탐색
- basePackagesClasses: 탐색 클래스 지정, 클래스의 맨 위에 있는 package부터 시작
* 어노테이션, 베이스패키지 등의 설정자들은 runtime 시 수행되므로 너무 많이 사용하면 성능이 떨어질 수 있다.
AOP(Aspect-Oriented Programming)
- 핵심 로직과 부가 기능을 분리하여 애플리케이션 전체에 걸쳐 사용되는 부가 기능을 모듈화하여 재사용할 수 있도록 지원하는 것
- 인프라 혹은 부가기능의 모듈화로 모니터링 및 로깅, 동기화, 오류 검사 및 처리, 성능 최적화 등이 있다.
- 공통된 기능을 재사용하는 기법
장점
애플리케이션 전체에 흩어진 공통 기능이 하나의 장소에서 관리되어 유지보수가 좋다.
핵심 로직과 부가 기능의 명확한 분리로 핵심 로직에만 집중할 수 있다.
적용방식
런타임 시점에 실제 대상 코드는 그대로 유지되고 프록시를 통해 부가 기능이 적용
프록시는 메서드 오버라이딩 개념으로 동작하기 때문에 메서드에만 적용 가능
스프링 AOP는 AspectJ 문법을 차용하고 프록시 방식의 AOP를 제공
용어
Join point
- 추상적인 개념으로 advice가 적용될 수 있는 모든 위치
- 프록시 방식을 사용하므로 조인 포인트는 항상 메서드 실행 지점
Pointcut
- 조인 포인트 중에서 advice가 적용될 위치를 선별하는 기능
- aop는 프록시 기반이기 때문에 조인 포인트가 메서드 실행 시점 밖에 없고 포인트컷도 메서드 실행 지점만 가능
Target
- advice의 대상이 되는 객체
- Pointcut으로 결정
advice
- 실질적인 부가 기능 로직을 정의하는 곳
- 특정 조인 포인트에서 Aspect에 의해 취해지는 조치
Aspect
- acvice + pointcut을 모듈화 한 것으로 @Aspect와 같은 의미
Advisor
- advice + pointcut
Weaving
- pointcut으로 결정한 타겟의 join point에 advice를 적용하는 것
AOP 프록시
- 기본값은 CGLIB 프록시
- AOP 프록시는 동적 프록시 또는 CGLIB 프록시
'SPRING' 카테고리의 다른 글
@Value, @RequestParam (0) | 2023.07.06 |
---|---|
ResponseEntity, custom Exception, (0) | 2023.06.29 |
Logback, profile, Springutils, Stringutils, CollectionsUtils (0) | 2023.06.29 |
[프로젝트 구조] entity,dto,controller,service,repository (0) | 2023.06.29 |
@RequestParam (0) | 2023.06.29 |