1. AOP[Aspect Oriented Programming]
- [설명]
- 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 의미입니다
- 모듈화
- 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 말합니다
- Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것이 AOP의 의미입니다
- [기능]
- Aspect
- 위에서 설명한 흩어진 관심사를 모듈화 한 것. 주로 부가기능을 모듈화함을 말합니다
- Target
- Aspect를 적용하는 것을 말합니다(클래스, 메서드 등.. )
- Advice
- 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체를 의미합니다
- JointPoint
- Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능함을 의미합니다
- PointCut
- JointPoint의 상세한 스펙을 정의한 것을 말합니다
- 구체적으로 Advice가 실행될 지점을 정할 수 있음을 말합니다
- [적용]
- 컴파일 타임 적용
- 컴파일 시점에 바이트 코드를 조작하여 AOP가 적용된 바이트 코드를 생성하는 방법을 말합니다
- 로드 타임 적용
- 순수하게 컴파일한 뒤, 클래스를 로딩하는 시점에 클래스 정보를 변경하는 방법을 말합니다
- 런타임 적용
- 스프링 AOP가 주로 사용하는 방법을 말합니다
- A라는 클래스 타입의 Bean을 만들 때 A 타입의 Proxy Bean을 만들어 Proxy Bean이 Aspect 코드를 추가하여 동작하는 방법을 말합니다
- [특징]
- 프록시 패턴 기반의 AOP 구현체, 프록시 객체를 쓰는 이유는 접근 제어 및 부가기능을 추가하기 위함 입니다
- Spring Bean에만 AOP를 적용 가능합니다
- 모든 AOP 기능을 제공하는 것이 아닌 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제(중복코드, 프록시 클래스 작성의 번거로움, 객체들 간 관계 복잡도 증가 등)에 대한 해결책을 지원하는 것이 목적 입니다
- [@AOP 의존성]
- @Aspect
- Aspect를 나타내는 클래스라는 것을 명시합니다
- @Component
- Spring Bean으로 등록하는 작업을 말합니다
- @Around
- 어드바이스가 타겟 메소드를 감싸서 타겟 메소드 호출전과 후에 어드바이스 기능을 수행한다는 의미입니다
- @Before
- 어드바이스 타겟 메소드가 호출되기 전에 어드바이스 기능을 수행한다는 의미입니다
- @After
- 타겟 메소드의 결과에 관계없이(즉 성공, 예외 관계없이) 타겟 메소드가 완료 되면 어드바이스 기능을 수행한다는 의미입니다
- @AfterReturning (정상적 반환 이후)
- 타겟 메소드가 성공적으로 결과값을 반환 후에 어드바이스 기능을 수행한다는 의미입니다
- @AfterThrowing (예외 발생 이후)
- 타겟 메소드가 수행 중 예외를 던지게 되면 어드바이스 기능을 수행한다는 의미입니다