[SPRING] 스프링 프레임워크 시작하기-10 [AOP]

🐷Jinie (juniorDeveloper)·2020년 11월 23일
0

JSP/MVC/SPRING

목록 보기
46/81

1. 스프링 AOP(Aspect Oriented programming)

  • IoC가 결합도와 관련된 기능이라면, AOP는 응집도와 관련된 기능
  • 메서드마다 공통으로 등장하는 로깅이나, 예외, 트랜잭션 처리같은 코드들을 '횡단관심'이라고함.
  • 사용자의 요청에 따라 실제로 수행되는 핵심 비즈니스 로직을 '핵심관심' 이라함.

2. AOP 라이브러리 추가 실습해보기

  • pom.xml 수정하기
	<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>
	<!-- AOP 실행을위한 -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.8.8</version>
		</dependency>	
	<!-- AspectJ Tools -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjtools</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>	

  • applicationContext.xml파일에 AOP 추가하기
    namespaces에 체크
  • applicationContext.xml 에 횡단관심 메서드를 가진 객체 bean만들기

  • 메서드마다 before가 적용된 것을 확인할 수 있다.

3. AOP 용어 및 기본설정

  • 조인포인트 (JoinPoint) :
    클라이언트가 호출하는 모든 비즈니스 메서드
    '포인트컷 대상','포인트컷 후보' 라고도한다.
    클래스의 모든메서드를 조인포인트라고 생각하면 된다.
  • 포인트컷 (PointCut) :
    필터링된 조인포인트
    원하는 특정 메서드에서만 횡단관심에 해당하는 공통기능을 수행시키기 위해서 포인트 컷이 필요
    expression 속성의 값을 어떻게 설정하느냐에따라 필터링되는 메서드가 달라진다.

  • 어드바이스 (Advice) :
    동작시점을 'before' 'after' 'after-returning' 'after-throwing' 'around' 등 다섯가지로 지정할 수 있다.
  • 위빙(Weaving) :
    포인트컷으로 지정한 핵심 관심 메서드가 호출될 떄, 어드바이스에 해당하는 횡단 관심 메서드가 삽입되는 과정
    위빙을 통해서 비즈니스 메서드를 수정하지 않고 횡단관심에 해당하는 기능을 추가하거나 변경가능
  • 애스팩트 (Aspect) 또는 어드바이저 (Advisor) :
    애스팩트는 포인트컷 + 어드바이스
    어떤 포인트컷 메서드에 어떤 어드바이스 메서드를 실행할지 결정한다.

    트랜잭션 설정에는 <aop:advisor>를 사용한다.
  • 사용자는 시스템을 사용하면서 비즈니스 컴포넌트의 여러 '조인포인트' 를 호출하게 된다.
    이때 특정 '포인트컷'으로 지정한 메서드가 호출되는순간
    '어드바이스'객체의 '어드바이스 메서드'가 실행된다.
    '포인트컷'으로 지정한 메서드가 호출될 때, '어드바이스 메서드'를 삽입하도록 하는 설정을 '애스팩트'라고한다.
    '애스팩트'설정에 따라 '위빙'이 처리된다.

4. 포인트컷 표현식

  • 리턴타입 지정
  1. '*' : 모든 리턴타입 허용
  2. 리턴타입이 : void인 메서드 허용
  3. 리턴타입이 : void가 아닌 메서드 선택
  • 패키지 지정
  1. com.springbook.biz : 정확하게 해당 패키지만 선택
  2. com.springbook.biz.. : com.springbook.biz로 시작하는 모든 패키지 선택
  3. com.springbook.biz..impl : com.springbook.biz로 시작하는 모든 패키지중 끝이 impl인 패키지
  • 클래스 지정
  1. BoardServiceImpl : 정확하게 해당 클래스만 선택
  2. *Impl : 클래스 이름이 Impl로 끝나는 클래스만 선택
  3. BoardService+ : 해당 클래스로부터 파생된 모든 자식 클래스 선택, 인터페이스 뒤에 '+'가 붙으면 해당 인터페이스를 구현한 모든 클래스 선택
  • 메서드 지정
  1. *(..) : 가장 기본설정으로 모든 메서드 선택
  2. get*(..) : 메서드 이름이 get으로 시작하는 모든 메서드 선택
  • 매개변수 지정
  1. (..) : 매개변수의 개수와 타입에 제약이 없음
  2. (*) : 반드시 1개의 매개변수를 가지는 메서드만 선택
  3. (com.springbook.user.UserVO) : 매개변수로 UserVO를 가지는 메서드만 선택
  4. (!com.springbook.user.UserVO) : 매개변수로 UserVO를 가지지 않는 메서드만 선택
  5. (Integer,..) : 한개이상의 변수, 첫번째 매개변수 타입이 Integer
  6. (Integer,*) : 반드시 두개의 매개변수, 첫번째 변수 타입이 Integer

5. 어드바이스 동작 시점




5-1. Before 어드바이스

  • 포인트컷으로 지정된 메서드 호출시, 메서드가 실행되기 전에 처리될 내용

5-2. After-Returning 어드바이스

  • 포인트컥으로 지정된 메서드가 정상적으로 실행되고 나서, 메서드 수행결과로 생성된 데이터를 '리턴'하는 시점에 동작
  • '리턴'하는 시점에 동작하기때문에 포인트컷 메서드에 리턴이 있어야함.

5-3. After-throwing 어드바이스

  • catch 예외가 발생하면 수행

5-4. After 어드바이스 (무조건 수행)

  • 예외 발생여부와 관계없이 무조건 수행
  • 이렇게 에러가 발생해도 실행이 된다.

5-5. Around 어드바이스

  • 메서드 실행 전과 후 모두 동적

6. AOP 활용 및 복습하기

  1. pom.xml
<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>
<!-- AOP를 위한 추가 -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.8.8</version>
		</dependency>		
  1. applicationContext.xml
  • context와 aop 사용체크!
  1. Client 파일에서 Container객체 생성하고 사용준비
AbstractApplicationContext container = new GenericXmlApplicationContext("applicationContext.xml");
container.close();
  1. AOP설정에 사용할 메서드 만들기

  2. Service 메서드 만들기

  3. applicationContext에서 스캐너를통해 Service 객체 생성 후 실행할 수 있도록 설정

  • 어노테이션 이용
public class AOPClient {
	public static void main(String[] args) {
		AbstractApplicationContext container = new GenericXmlApplicationContext("applicationContext.xml");
		
		container.close();
	}
}

  1. AOP설정하기

  2. 결과화면

profile
ᴘᴇᴛɪᴛs ᴅᴇ́ᴠᴇʟᴏᴘᴘᴇᴜʀ. ᴘʀᴏɢʀᴀᴍᴍᴀᴛɪᴏɴ = ᴘʟᴀɪsɪʀ 💕

0개의 댓글