본문 바로가기
Spring/Spring

day66) [AOP] - 횡단관심: 로깅 처리하기1

by code_learner 2022. 4. 4.

[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 결합을 위한 설정을 할 때 등장
관심 결합에 대한 설정
포인트컷 + 어드바이스 == 결합. 그 자체를 의미하기도 한다. 
관점 분리

댓글