일단, AOP의 장점에 대해 한 번 더 짚고 넘어가자.
예를 들어, 입금, 출금, 이체 기능이 있다.
세 기능에는 '인증'이라는 공통 기능이 들어가야한다.
원래 알던 방법대로라면 인증이라는 메서드 하나를 구현해서 그 메서드를 가져다가 쓰는 방식이었을 것이다.
혹은 인터페이스를 구현한다던가.
하지만, 그렇게 할 경우, 기능의 변경이 있어서 메서드명을 변경해야할 때 각각 클래스로 다 찾아가서 이름을 다 바꿔줘야한다.
이러한 불편함을 막기 위해 기존의 클래스에는 아무것도 건드리지 않고,
인증 기능 클래스 하나만을 구현해서 그 기능을 여기저기에서 자유롭게 쓸 수 있도록 해주는 것.
적용이 필요한 메서드 명을 새로 만든 기능 클래스 안의 execution 안에 기입해주는 것으로 해결.
그것이 AOP다.
AOP라고 해서 전에 없던 새로운 개념이 등장한 것이 아니라 공통된 기능을 재사용하는 기법.
OOP에선 공통된 기능을 재사용하는 방법으로 상속이나 위임을 사용.
- 어플리케이션 전체에 흩어진 공통 기능이 하나의 장소에서 관리된다는 점
- 다른 서비스 모듈들이 본인의 목적에만 충실하고 그외 사항들은 신경쓰지 않아도 된다는 점
for문, 재귀를 이용하여 팩토리얼을 구하고, 그 값을 구하는데 걸린 소요 시간을 구하는 예제
다음은 AOP를 적용하지 않은, 상속을 통해 구현한 예제이다.
이번에는 AOP를 적용하여 팩토리얼 값 + 소요 시간 + 캐시 등록을 하는 예제를 살펴보자.
두 가지 사항을 미리 숙지하고 코드를 살펴보자.
* @Order(0,1...)
AOP가 작동하는 순서를 지정해줄 수 있다.
* AOP 설정
AOP가 적용될 객체가 인터페이스를 구현하고 있는 경우, 프록시 객체 생성할 때 해당 인터페이스를 구현하도록 생성되어짐
만약 인터페이스를 이용하지 않고 프록시 객체를 생성하도록 하고자 하는 경우 (별도의 설정 필요)
xml 설정
proxy-target-class="true"
Java 설정
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass=true)
위 설정이 들어가면 스프링 AOP에서 프록시 객체를 해당 클래스를 상속하여 생성함
Calculator implCal = ctx.getBean("implCal", Calculator.class); // 인터페이스 대신에
ImplCalculator implCal = ctx.getBean("implCal", ImplCalculator.class); // 이것이 가능해진다는 뜻
'SPRING' 카테고리의 다른 글
Connection Pool / DataSource / JdbcTemplate / RowMapper (0) | 2020.09.29 |
---|---|
XML 파일 생성하는 법 (0) | 2020.09.28 |
AOP 적용 - After, Around, Afterreturning, Afterthrowing (0) | 2020.09.24 |
AOP 개념 및 적용 - Before (0) | 2020.09.23 |
jar 파일 (0) | 2020.09.22 |