[AOP]
- 관점 지향 프로그래밍 (때가 되면 알아서 동작할 수 있게 만든다)
- 공통로직을 분리하기 위해
공통 로직과 (횡단 관심) + 핵심로직 (비즈니스 메서드)로 나누어 처리한다.
- 기능을 하나의 클래스에 정의, 해당클래스를 불러와서 기능을 수행하게 하는 기법이다.
ex)로깅, 인증, 허가, 트랜잭션, 해제.. 등이 횡단관심에 포함됨- 이번 aop실습에는 로그를 활용해볼 예정
https://code-learning.tistory.com/102
day61) 스프링 프레임워크란?
[스프링 프레임워크란?] 1. 프레임워크 일정한 형태의 틀, 부품을 가지고 다양한 형태의 결과물을 만드는 것 -> 관리가 용이 -> 개발시간 단축 -> 개발자들의 역량이 획일화 -> 재사용성 증가
code-learning.tistory.com
[로그 처리 방식]
기존방식
로그 처리할 메서드(LogAdvice)
를 만든 후 비즈니스 메서드 호출 시 매번 new 하여 사용
-LogAdvice.java
package com.test.app.common;
public class LogAdvice {
public void printlog() {
System.out.println("[로깅] 공통로직, 횡단관심: 비즈니스메서드(CRUD) 수행전에 로그를 Console에 남기는 기능");
}
}
ver1
-MemberServiceImpl.java
@Service("memberService")
public class MemberServiceImpl implements MemberService {
@Autowired
private MemberDAO memberDAO;
@Override
public MemberVO getMember(MemberVO vo) {
LogAdvice log= new LogAdvice();
log.printlog();
return memberDAO.getMember(vo);
}
@Override
public void insertMember(MemberVO vo) {
LogAdvice log= new LogAdvice();
log.printlog();
memberDAO.insertMember(vo);
}
}
ver1방식으로 로그 처리하게 된다면, LogAdvice new를 개발자가 하게 되어 결합도가 높아지고, 버전이 변경되거나 새로운 클래스로 바꿔야 하는 경우 클래스와 메서드를 일일히 변경해야한다.
ver2-컨테이너가 객체 생성을 대신 해볼까..?
1. LogAdvice를 멤버변수로 하여 의존성 주입
2. 의존성 주입시 생성자 injection활용
@Service("memberService")
public class MemberServiceImpl implements MemberService {
@Autowired
private MemberDAO memberDAO;
private LogAdvice log;
public MemberServiceImpl() {
//생성자 주입
log = new LogAdvice();
}
@Override
public MemberVO getMember(MemberVO vo) {
log.printlog();
return memberDAO.getMember(vo);
}
@Override
public void insertMember(MemberVO vo) {
log.printlog();
memberDAO.insertMember(vo);
}
}
ver2 방식으로 클래스명이 바뀔시에 멤버변수만 바꾸어도 전체 적용이 가능해 졌지만, 메서드명이 바뀌게 된다면 각각의 메서드를 바꿔야하는건 여전하다. 또한 new도 없어지지 않았다.(여전히 결합도가 높음).
ver3-AOP의 시작
컨테이너가 비지니스 메서드와 공통로직을 연결시켜주는 일련의 과정을 모두 수행할수 있도록 해보자!
[1] pom.xml에 AOP라이브러리 추가
<!-- AOP -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.8</version>
</dependency>
[2] applicationContext.xml의 Namespaces에서 AOP선택
[3] applicationContext.xml 설정
3-1. <bean>을 통해 log()를 수행할 주체(객체)를 new
3-2. 비즈니스 메서드 +log()(횡단관심, 공통로직)를 결합
<!-- 3-1. <bean>을 통해 log()를 수행할 주체(객체)를 new -->
<bean id="log" class="com.test.app.common.LogAdvice2" />
<!-- 3-2. 비즈니스 메서드 +log()(횡단관심, 공통로직)를 결합 -->
<aop:config>
<!-- 비즈니스 메서드 등록 -->
<aop:pointcut expression="execution(* com.test.app..*Impl.*(..))" id="bPointcut" />
<!--해당 패키지의 Impl이 들어간 클래스의 모든 메서드를 aPointcut이라 설정-->
<!-- 공통로직 등록, ref부분에는 id이름을 넣는다-->
<aop:aspect ref="log">
<!-- LogAdvice2 클래스 등록 -->
<aop:before method="printlog2" pointcut-ref="bPointcut" />
<!--"bPointcut"에 해당되는 메서드 수행전에 "printlog2" 횡단관심메서드를 수행하겠다-->
</aop:aspect>
</aop:config>
[용어 정리]
1)조인포인트(Joinpoint)
사용자(브라우저, Client)측에서 사용하는 '모든 비즈니스 메서드'
포인트컷 후보(포인트컷이 될수 있는 존재)
2)포인트컷(Pointcut)
'횡단관심(공통로직)과 결합될 대상 핵심관심'(핵심로직, 비즈니스메서드, CRUD)
ex) 트랜잭션을 할 시에는 모든 메서드에 적용하지 않는다.(적용하는 메서드=포인트컷)
3)어드바이스(Advice)
횡단관심, 공통 로직, 공통 기능....(ex. 로그, 트랜젝션...)
동작 시점★을 가진다 <aop:before... after...
[동작시점]
1) before: 시작하기 전
2) after : finally(되든 안되든)
3) after-returning : 반환을 잘 하면
4) after-throwing : 예외가 발생하면
5) around : 핵심로직의 전체를 주관할 수 있다.
필터와 유사하게 동작함!
핵심관심을 인자로 받아와서 앞뒤작업을 수행함!!
->모든 around관련 어드바이스는 ProceedingJoinPoint (pjp)가 인자로 반드시 존재해야함
4) 위빙(Weaving)
포인트컷이 호출될 때, 횡단관심이 수행되는 동작 | 과정
내가 미리 지정해둔 CRUD가 호출 될 때, 횡단관심(Advice)가 지정해둔 동작시점에 수행되는 과정
*그거 위빙이 안된것 같아 -> 결합이 안됐다.
1. 설정이 잘 안된경우
2. Console등의 출력이 안되는 경우
3. .xml을 못 읽거나 하는 경우 -> 에러
5) 에스팩트(Aspect) or 어드바이저 (Advisor) - aop 결합을 위한 설정을 할 때 등장
관심 결합에 대한 설정
포인트컷 + 어드바이스 == 결합. 그 자체를 의미하기도 한다.
관점 분리
'Spring > Spring' 카테고리의 다른 글
day68) Spring - Model 설계2 : JDBC Template (0) | 2022.04.07 |
---|---|
day67)[AOP] - 횡단관심: 로깅 처리하기2 (0) | 2022.04.05 |
day65) Spring-Controller 설계2:DispatcherServlet-servlet.xml @로 변경하기 (0) | 2022.04.04 |
day64) Spring-Controller설계1 (0) | 2022.03.31 |
day62) Spring - Model 설계 (0) | 2022.03.30 |
댓글