[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 밑에 해당 코드를 추가해줍니다.
weaver

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)을 열고 아래 사진과 같이 진행해줍니다.
namespace

이제 다시 Source를 누르고 이전에 작성한 LogAdvice 클래스를 에 등록한 후 AOP관련 설정을 추가합니다. 아직 이 설정이 어떤 의미인지 몰라도 괜찮으니 우선 따라해주세요.

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>

4. 테스트 및 결과 확인해보기

result1

댓글남기기