KOSA Spring - AOP

채정윤·2025년 4월 23일

Spring

목록 보기
19/25

AOP

핵심 관심사항만 실행했는데도 공통 관심사항이 실행되도록 한다

(aspect를 통해 주입받는다)

구성 요소

  • Advice: 실행될 부가 기능 (ex. @Before, @After)
  • Pointcut: Advice가 적용될 지점을 정의 (ex. 특정 메서드 실행 전)
  • Aspect: Advice + Pointcut = 공통 기능 모듈
  • Join Point: Advice가 적용 가능한 모든 실행 지점
  • Weaving: 실제 코드에 Aspect를 적용하는 과정

예제

핵심 관심사항 - doAdd
공통 관심사항 - LogAdvice

pom.xml

...
		<properties>
			<java-version>11</java-version>
			<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
			<org.aspectj-version>1.9.0</org.aspectj-version>
			<org.slf4j-version>1.7.25</org.slf4j-version>
		</properties>		
...
		<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>

Service.java

package org.zerock.service;

public interface SampleService {

  public Integer doAdd(String str1, String str2) throws Exception;
}

ServiceImpl.java

package org.zerock.service;

import org.springframework.stereotype.Service;

@Service
public class SampleServiceImpl implements SampleService {

	@Override
	public Integer doAdd(String str1, String str2) throws Exception {

		return Integer.parseInt(str1) + Integer.parseInt(str2);
	}
}

root-context.xml

⇒ aop 패키지에 있는 클래스들을 aop로 쓰겠습니다!

(설정 전에 namespace에서 aop체크해주기)

	<context:component-scan base-package="org.zerock.aop"/>
	
	<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

proxy란?

핵심 관심사(toAdd 메서드 호출) 외에 부가적인 관심사(예: 호출 전후 처리)도 프록시 객체가 담당

LogAdvice.java

package org.zerock.aop;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import lombok.extern.log4j.Log4j;

@Aspect
@Log4j
@Component
public class LogAdvice {
	
	// 언제? 누구? -- pointcut
	// SampleService로 시작하는 클래스의 메서드가 호출되면
	// 반드시 logBefore Aspect가 실행되도록!
	@Before("execution(* org.zerock.service.SampleService*.*(..))")
	public void logBefore() {
		log.info("==========================");
	}

}

ServiceTests.java

...
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class SampleServiceTests {
	
	@Autowired
	private SampleService service;
	
	@Test
	public void test() {
		try {
			log.info(service.doAdd("10", "20"));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
//	INFO : org.zerock.aop.LogAdvice - ==========================
//	INFO : org.zerock.aop.SampleServiceTests - 30

0개의 댓글