재미있게 코딩합시다

AOP-관점지향 프로그래밍(Aspect Oriented Programming) 본문

IT /Spring(스프링)

AOP-관점지향 프로그래밍(Aspect Oriented Programming)

감민셔 2019. 1. 10. 10:00

 AOP-관점지향 프로그래밍(Aspect Oriented Programming)


어떤 기능을 구현하기 위한 세부기능들을 분리하고, 각 세부기능 중에

특정 기능을 위해 필요한 세부기능을 == 핵심관심사항

여러 기능구현에 필요한 세부기능들을 == 공통관심사항이라고 정의.


세부기능들을 핵심관심사항과, 공통관심사항으로 분리해서

공통관심사항으로 이뤄진 프레임에 핵심관심사항을

조립해서 기능구현을 달성하는 기능.


- 핵심관심사항에 공통관심사항을 어떻게 적용시킬 것인가

=> AOP




Spring AOP 용어 

Target 

– 핵심사항( Core) 가 구현된 객체 

JoinPoint 

– 공통관심사항이 적용 될 수 있는 지점(ex:메소드 호출시, 객체생성시 등) 

Pointcut 

– JoinPoint 중 실제 공통사항이 적용될 대상을 지정. 

Advice 

– 공통관심사항(Cross-Cutting) 구현 코드 + 적용시점. 

– 적용 시점 : 핵심로직 실행 전, 후, 정상 종료 후, 비정상 종료 후, 전/후가 있다. 

Aspect

– Advice + Pointcut = 언제 + 누구에게  

– Aspect = 실제 공통사항이 적용될 대상을 지정하고 구현코드를이용해서 적용한다.

Weaving 

– Proxy를 생성하는 것. (컴파일 시점, Class Loading 시점, 런타임 시점 Weaving이 있다.)


• AOP 설정 태그 

1. : aop설정의 root 태그. Aspect 설정들의 묶음 

2. : Aspect 설정 – 하나의 Aspect 설정 

- Aspect가 여러 개일 경우 태그가 여러 개 온다. 

3. : Advice에서 참조할 pointcut 설정 

4. Advice 설정태그들

A. <aop:before>- 메소드 실행 전 실행될 Advice

B. <aop:after-returning>- 메소드 정상 실행 후 실행될 Advice 

C. <aop:after-throwing>- 메소드에서 예외 발생시 실행될 Advice 

D. <aop:after>- 메소드 정상 또는 예외 발생 상관없이 실행될 Advice – finally 

E. <aop:around>- 모든 시점에서 적용시킬 수 있는 Advice 구현 


advice 설정 태그들

프록시객체 : 내가 수행할 기능을 대신 수행해주는 객체.

오리지널객체 : 내가 수행할 기능을 구현하는 클래스 객체


프록시패턴 구현 :

오리지널 객체가 수행할 기능에 대한 껍데기를 인터페이스로 정의하고 구현

오리지널 객체가 구현한 인터페이스를 프록시 객체도 구현

프록시 객체의 구현함수에서 오리지널객체의 구현함수를 호출



BOY Class, Girl Class , IPerson Class , Person Class , Test Class 구현


public class Boy implements IPerson{ @Override public void doSomething() { System.out.println("컴퓨터를키고 게임을 한다."); }

	
public class Girl implements IPerson{

	@Override
	public void doSomething() {
		System.out.println("책을 펴고 책을 본다.");
	}
}
	
public class Girl implements IPerson{

	@Override
	public void doSomething() {
		System.out.println("책을 펴고 책을 본다.");
	}
}	
	public class PersonProxy implements IPerson{

	IPerson person;
	
	public void setPerspon(IPerson perspon) {
		this.person = perspon;
	}	
	@Override
	public void doSomething() {
		System.out.println("문을 열고 집에 들어간다.");
		try {
			person.doSomething();
			System.out.println("불을 끄고 잠을잔다.");
		} catch (Exception e) {
			System.out.println("119에 신고를한다.");
		}System.out.println("문을 열고 집을 나온다.");
	}
}	
	public class Test {

	public static void main(String[] args) {

		IPerson person = new Girl();
		PersonProxy personProxy = new PersonProxy();
		personProxy.setPerspon(person);
		
		personProxy.doSomething();
		
		//프록시 객체 : personProxy
		//오리지널 객체 : Girl
	}
}	



'IT > Spring(스프링)' 카테고리의 다른 글

MVC  (0) 2019.01.14
Mybatis - Spring 연동하기  (0) 2019.01.09
스프링 - mybatis (마이바티스)  (0) 2019.01.07
4.스프링(Spring)-NamedParameterJDBCTemplate  (0) 2019.01.04
3. 스프링(Spring) - 데이터베이스와의 연동  (0) 2019.01.04
Comments