Aspect Oriented Programming
- 관점지향프로그래밍
- 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점에서 나누어서 보고 그 관점을 기준으로 각각 모듈화 하겠다는 것
- 흩어진 Aspect를 모듈화 할 수 있는 프로그래밍 기법
말이 헷갈려서 찾아보니 일단은 OOP(객체지향 프로그래밍)의 한계에 대해서 알아야 한다.
- OOP의 한계
- A,B,C 클래스들의 같은 색의 선들은 중복되는 메소드/필드/코드 등을 의미
- 만약 클래스A의 주황색 을 수정한다면 클래스B와 클래스C도 해당하는 부분을 찾아 수정해야함.
- 이는 SOLID 원칙에 위배 / 유지보수에도 쉽지 않음.
- 인프라로직의 중복이 횡단으로 나타나기 때문에 횡단 관심사, 흩어진 관심사 (Crosscutting Concerns)라고 함
- AOP
- 흩어진 관심사들을 Aspect를 이용하여 모듈화 시킴(어드바이스)
- 횡단 관심에 따라 프로그래밍 함
- 모듈화 ? : 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것
- 개발자가 모듈화시킨 Aspect를 클래스에 어느 속에 사용해야하는지만 정의해 주면 됨. (포인트컷)
- 즉, Aspect로 모듈화하고 핵심적인 비즈니스로직에서 분리하여 재사용하겠다는 것
프록시 패턴
- Client는 subject 인터페이스 타입으로 프록시 객체를 사용하게되고, 프록시는 Real Subject를 감싸서 클라이언트의 요청을 처리
- 프록시 패턴의 목적은 기존 코드 변경 없이 접근 제어 또는 부가 기능을 추가하기 위해서
- 단점
- 이러한 방식도 메소드가 많다면 코드의 중복이 많이 일어날 것
- 매번 프록시 클래스도 직접 만들어야 함
이러한 단점을 해결하기위해 나온 Spring AOP
- AOP의 핵심 기능
- 코드를 수정하지 않으면서 공통 기능의 구현을 추가하는 것
- 핵심 기능에 공통 기능을 추가하는 방법
- 컴파일 : 자바 파일을 클래스 파일로 만들 때 바이트코드를 조작하여 적용된 바이트코드를 생성
- 로드 타임 : 컴파일은 원래 클래스 그대로 하고, 클래스를 로딩하는 시점에 끼워서 넣는다.
- 런타임 : A라는 클래스를 빈으로 만들 때 A라는 타입의 프록시 빈을 감싸서 만든 후에, 프록시 빈이 클래스 중간에 코드를 추가해서 넣는다.
- 스프링AOP는 프록시 객체를 자동으로 만들어줌
- 따라서 상위 타입의 인터페에스를 상속받은 클래스를 직접 구현할 필요가 없음.
- 단지 공통기능을 구현한 클래스만 잘 구현하면 됨.
AOP 주요 개념
- Aspect : 위의 사진에서 처럼 Aspect 안에 모듈화 시킨 것을 의미한다.
- Advice : 어떤 부가 기능?
Before, AfterReturning, AfterThowing, After, Around - Pointcut : 어디에 적용해야 하는지에 대한 정보를 담고 있다./ 실제 advice가 적용될 지점, Spring AOP에서는 advice가 적용될 메소드를 선정
- Target : Aspect에 적용이 되는 대상 , 어떤 대상에 부가기능을 부여할 것인가
- Join point : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능(여러가지 합류 지점임) / 어디에 적용할 것인가? 메서드,필드, 객체,생성자 등
(Spring AOP에서는 메소드가 실행될 때만으로 한정)
Spring AOP 구현
'🌿SPRING > 🍀공부 [SPRING]' 카테고리의 다른 글
[SPRING][JPA] Proxy / 지연로딩과 즉시로딩 (0) | 2022.09.02 |
---|---|
[SPRING] [JPA] cascade Type 영속성 전이 (0) | 2022.09.01 |
[SPRING] [JPA] 기본 키 매핑 @GeneratedValue (0) | 2022.08.31 |
[SPRING] Spring Security - OAuth2.0 (0) | 2022.08.23 |
[SPRING] Spring Security - API 접근 권한 제어 (0) | 2022.08.23 |