gi_dor

Spring AOP 본문

Back_End/Spring

Spring AOP

기돌 2024. 3. 12. 14:05

관점 지향 프로그래밍 , 공통관심사의 분리

 💡AOP

여러클래스에 분산되고 중복되어있는 공통 관심사항을 별도의 모듈로 작성해서 핵심관심 사항과 분리시킨다
여러 공통 관심사항을 AOP를 활용하면 기존의 비즈니스 로직에 영향을 주지않고
모듈화된 공통관심사항을 적용할 수 있다

1. 직접 코드를 추가하지 않아도 코드를 추가한 것처럼 실행되는 것
2. 추가할 코드를 따로 분리해서 작성해놓고 기존 비즈니스 로직에 영향을 주지않게그 코드가 마치 추가된 것처럼     하려고 하는 게 AOP다.

 

어노테이션과 XML 비교


AOP 적용 전 과 적용 후

AOP 적용 전

package com.smple.services;

public class UserService{

	public void insertUser(User user) {
			// 공통 관심사항
			logger.debug("로그출력");
	
			// 핵심관심사항 - 메서드의 고유한 기능
			userDao.insert(user)
		}

	public void getUserDetail(String id) {
			// 공통 관심사항
			logger.debug("로그출력");
	
			// 핵심관심사항 - 메서드의 고유한 기능
			User user = userDao.getUserById(id);
			return user;
		}

}

AOP 적용 후

package com.smple.services;

public class UserService{

	public void insertUser(User user) {
			userDao.insert(user) // 고유한 핵심 기능
	}

	public void getUserDetail(String id){
			User user = userDao.getUserById(id); // 고유한 핵심 기능
		return user;
	}

}
@Aspect
public class LoggerAop {
@Before(pointcut= "within(com.sample.*)")
		public void logging() {
			logger.debug("로그출력");
		}
}

AOP를 사용하면 횡단 관심사를 분리하여 코드의 재사용성과 모듈화를 높일 수 있다

UserService에 대한 Proxy 객체
UserService를 상속받아서 만든다


스프링 컨테이너


 

AOP 용어

용어 설명

target advice가 추가될 객체, 핵심 기능
advice target에 동적으로 추가될 코드, 부가 기능
join point advice가 추가(join)될 대상(메서드)
pointcut join point들을 정의한 패턴.예) execution(* com.fastcampus..(..))특정 메서드에만 부가 기능 적용
proxy target에 advice가 동적으로 추가되어 생성된 객체
weaving target에 advice를 추가해서 proxy를 생성하는 것

 

 

(pointcut = “within(com.sample.* )” )

within 표현식은 특정 패키지(com.sample)의 하위 패키지에 속한 모든 클래스를 대상으로 지정

@Before

@Before 어노테이션은 메서드 실행 전에 실행되는 Advice(어드바이스)를 정의하는 데 사용 Advice는 특정한 시점에 실행되는 코드로서, 메서드 실행 전, 후, 예외 발생 시 등 다양한 시점에서 실행될 수있다

@Aspect

@Aspect 해당 클래스가 Aspect로 사용됨을 나타내는 어노테이션 Aspect는 횡단 관심사(cross-cutting concern)를 모듈화하고, 해당 관심사를 여러 개의 객체에 적용할 수 있는 기능을 제공

 

 

Advice 종류

advice 메서드 실행 전후에 추가적인 기능을 제공하는 부분

핵심 비즈니스 로직과는 독립적으로, 공통적으로 사용되는 기능을 모듈화하여 재사용성과 유지보수성을 높인다

종류 애너테이션 설명

 

around advice @Around 메서드의 시작과 끝 부분에 추가되는 부가 기능
before advice @Before 메서드의 시작 부분에 추가되는 부가 기능
after advice @After 메서드의 끝 부분에 추가되는 부가 기능
after returning @AfterReturning 예외가 발생하지 않았을 때, 실행되는 부가 기능
after throwing @AfterThrowing 예외가 발생했을 때, 실행되는 부가 기능

 

 

Pointcut 표현식의 와일드카드

  • any
  • .. all
    • 매개변수 - 매개변수 상관없이
    • 패키지경로 - 현재 패키지 및 모든 하위 패키지
`(“within(com.sample.* )” )` 

`(pointcut = “within(com.sample..* )” )`
within(com.xyx.service.*) 
		com.xyx.service 패키지에 위치한 Any 클래스

within(com.xyz.service..*)  
		com.xyx.service	패키지 및 하위 패키지의 Any 클래스

within(com.xyz.service.*ServiceImpl)
		com.xyx.service 패키지에서 클래스명이 ServiceImpl로 끝나는 Any 클래스

execution(* com.xyz.service.*.*(..) )
		com.xyx.service 패키지의 Any 클래스의 Any 메서드

execution(* com.xyz.service.*.*(*) )
		com.xyx.service 패키지의 Any 클래스의 매개변수가 하나뿐인 메서드

bean(*Dao)
	스프링 컨테이너에 등록된 빈의 이름(객체의 식별자)이 Dao로 끝나는것
728x90

'Back_End > Spring' 카테고리의 다른 글

Spring MVC , Controller  (1) 2024.03.12
MyBatis  (4) 2024.03.12
빌드도구 Maven  (0) 2024.03.11
Spring Framework  (0) 2024.03.11
Maven이 뭔데 ?  (1) 2024.02.27