[Spring] Spring 공부 정리-4
업데이트:
실습은 Spring Quick Start:채규태 교재를 바탕으로 진행했습니다.
이번 시간은 AOP를 이해하고 어떻게 코드의 중복을 줄이는지 실습해보았습니다.
1. AOP 기능을 이용하는법
로그를 찍는 클래스인 LogAdvice 클래스를 아래와 같이 만들어줍니다.
1
2
3
4
5
6
7
package com.springbook.biz.common;
public class LogAdvice {
public void printLog() {
System.out.println("[공통 로그] 비즈니스 로직 수행 전 동작");
}
}
LogAdvice 클래스를 BoardServiceImpl에서 사용하려면 아래 코드와 같이 LogAdvice 객체를 생성하고 printLog()를 호출해 줄 것입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class BoardServiceImpl implements BoardService{
@Autowired
private BoardDAO boardDAO;
private LogAdvice log;
@Override
public void insertBoard(BoardVO vo) {
log.printLog();
boardDAO.insertBoard(vo);
}
@Override
public void updateBoard(BoardVO vo) {
log.printLog();
boardDAO.updateBoard(vo);
}
@Override
public void deleteBoard(BoardVO vo) {
log.printLog();
boardDAO.deleteBoard(vo);
}
@Override
public BoardVO selectBoard(BoardVO vo) {
log.printLog();
return boardDAO.selectBoard(vo);
}
@Override
public List<BoardVO> selectBoardList(BoardVO vo) {
log.printLog();
return boardDAO.selectBoardList(vo);
}
}
Logging을 위와 같이 관리하게 되면 printLog함수의 이름이 변경되거나, 로그를 찍는 클래스가 변경되었을경우 BoardServiceImpl의 모든 함수에 적용된 log.printLog()
를 변경해주어야합니다.
Spring AOP에서는 이렇게 공통된 로직을 xml으로 관리할 수 있는 기능을 제공합니다.
2. AOP 라이브러리 추가하기
우선 pom.xml 파일을 열어줍니다. 그리고 AspectJ 밑에 해당 코드를 추가해줍니다.
1
2
3
4
5
6
<!-- AspectJ Weaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
3. namespace 추가 및 AOP 설정
AOP 설정을 추가하려면 AOP에서 제공하는 엘리먼트들을 사용해야합니다. 따라서 Spring 설정 파일(applicationContext.xml)을 열고 아래 사진과 같이 진행해줍니다.
이제 다시 Source를 누르고 이전에 작성한 LogAdvice 클래스를
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<!-- component-scan부분 -->
<context:component-scan base-package="com.springbook.biz">
</context:component-scan>
<!-- Bean 등록 부분 -->
<bean id="log" class="com.springbook.biz.common.LogAdvice"></bean>
<!-- AOP 설정 부분 -->
<aop:config>
<aop:pointcut id="allPointcut"
expression="execution(* com.springbook.biz..*Impl.*(..))*"/>
<aop:aspect ref="log">
<aop:before pointcut-ref="allPointcut" method="printLog"/>
</aop:aspect>
</aop:config>
</beans>
댓글남기기