⇒ 핵심 관심사항만 실행했는데도 공통 관심사항이 실행되도록 한다
(aspect를 통해 주입받는다)
@Before, @After)핵심 관심사항 - doAdd
공통 관심사항 - LogAdvice
...
<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>
package org.zerock.service;
public interface SampleService {
public Integer doAdd(String str1, String str2) throws Exception;
}
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);
}
}
⇒ aop 패키지에 있는 클래스들을 aop로 쓰겠습니다!
(설정 전에 namespace에서 aop체크해주기)
<context:component-scan base-package="org.zerock.aop"/>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
proxy란?
핵심 관심사(toAdd 메서드 호출) 외에 부가적인 관심사(예: 호출 전후 처리)도 프록시 객체가 담당
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("==========================");
}
}

...
@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