AOP 웹에 적용하기🔎
이전 수업때의 AOP는 콘솔과 Xml 설정으로 진행했다.
지금 수업의 AOP는 웹과 어노테이션 설정으로 진행한다.
이전 글 참고
https://steady-record.tistory.com/entry/Spring-Spring-AOP-기초-및-예제
aop는 글쓰기, 수정하기, 삭제하기 , 방문 기록 로그 남기기 기능 등 권한체크할 때 주로 사용한다.
파일 구성🔎
패키지(경로) | 파일명 | 역할 |
com.test.controller | ||
AOPController.java | 주업무 클래스 | |
com.test.aspect | ||
Log.java | 보조 업무 클래스 | |
com.test.persistence | ||
AOPDAO.java(I) | ||
AOPDAOImpl.java(C) | ||
views | ||
list.jsp | ||
add.jsp | ||
view.jsp |
프로젝트 설정🔎
기본 설정
이 프로젝트에서는 DB 사용하지 않을 것이기에 pom.xml과 web.xml 만 설정한다.
https://steady-record.tistory.com/entry/Spring-스프링-프로젝트-설정-일괄-적용
추가 aop 설정 - servlet-context.xml
Namespaces 탭에서 aop에 체크 표시를 한다.
다시 Source 탭으로 돌아와서 아래 코드를 추가한다.
<aop:aspectj-autoproxy />
<aop:aspectj-autoproxy />
스프링에서 aop를 사용하려면 aop:aspectj-autoproxy 태그를 사용한다. 다른 설정이나 참조같은건 필요하지않다.
이 태그를 이용하여 aop를 어노테이션 방식으로 적용할 수 있다.
또한, 컴포넌트 등록을 위한 아래 코드도 추가한다.
<context:component-scan base-package="com.test.controller" />
<context:component-scan base-package="com.test.persistence" />
<context:component-scan base-package="com.test.aspect" />
구현 코드🔎
- AOPController.java
package com.test.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import com.test.persistence.AOPDAO;
@Controller
public class AOPController {
@Autowired
private AOPDAO dao;
//주업무 구현
//목록보기
@GetMapping(value = "/list.do")
public String list(Model model) {
dao.list();
//업무 구현 하지않고 흔적 남기기용
System.out.println("Controller.list()");
return "list";
}
@GetMapping(value = "/add.do")
public String add(Model model) {
dao.add();
//업무 구현 하지않고 흔적 남기기용
System.out.println("Controller.add()");
return "add";
}
@GetMapping(value = "/view.do")
public String view(Model model) {
dao.view();
//업무 구현 하지않고 흔적 남기기용
System.out.println("Controller.view()");
return "view";
}
}
- AOPDAOImpl.java
package com.test.persistence;
import org.springframework.stereotype.Repository;
@Repository
public class AOPDAOImpl implements AOPDAO{
//sql 생략
@Override
public void list() {
//업무 구현 하지않고 흔적 남기기용
System.out.println("DAO.list()");
}
@Override
public void add() {
//업무 구현 하지않고 흔적 남기기용
System.out.println("DAO.add()");
}
@Override
public void view() {
//업무 구현 하지않고 흔적 남기기용
System.out.println("DAO.view()");
}
}
- view
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>AOPTest</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
</head>
<body>
<!-- list.jsp -->
<h1>목록보기</h1>
<div>
<button type="button" onclick="location.href='/aop/list.do';">목록보기</button>
<button type="button" onclick="location.href='/aop/add.do';">등록하기</button>
<button type="button" onclick="location.href='/aop/view.do';">상세보기</button>
</div>
<script src="https://code.jquery.com/jquery-1.12.4.js" ></script>
</body>
</html>
add.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>AOPTest</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
</head>
<body>
<!-- add.jsp -->
<h1>등록하기</h1>
<div>
<button type="button" onclick="location.href='/aop/list.do';">목록보기</button>
<button type="button" onclick="location.href='/aop/add.do';">등록하기</button>
<button type="button" onclick="location.href='/aop/view.do';">상세보기</button>
</div>
<script src="https://code.jquery.com/jquery-1.12.4.js" ></script>
</body>
</html>
view.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>AOPTest</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
</head>
<body>
<!-- view.jsp -->
<h1>상세보기</h1>
<div>
<button type="button" onclick="location.href='/aop/list.do';">목록보기</button>
<button type="button" onclick="location.href='/aop/add.do';">등록하기</button>
<button type="button" onclick="location.href='/aop/view.do';">상세보기</button>
</div>
<script src="https://code.jquery.com/jquery-1.12.4.js" ></script>
</body>
</html>
- Log.java
보조 업무 클래스
package com.test.aspect;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Component
@Aspect //보조 업무 객체
public class Log {
//포인트 컷
@Pointcut("execution(* com.test.controller.AOPController.add(..))")
public void pc1() {
}
//보조 업무
//포인트 컷과 연결한다.
@After("pc1()")
public void m1() {
System.out.println("After [보조업무] 기록을 남깁니다.");
}
@Before("pc1()")
public void m2() {
System.out.println("Before [보조업무] 기록을 남깁니다.");
}
//재사용이 불가하다.
@After("execution(* com.test.controller.AOPController.list(..))")
public void m3() {
System.out.println("After [보조업무] 기록을 남깁니다.");
}
}
@Aspect 어노테이션은 클래스가 Aspect로 동작하도록 설정할 수 있도록 한다.
aspect는 Bean이 아니다. 스프링이 관리하는 객체가 아니라는 의미로 클래스에 따로 @Component 어노테이션을 붙여줘야한다.
@Pointcut
포인트컷 메소드를 생성하여 보조업무와 연결을 한다. 포인트컷 생성시 주업무 메소드를 aspectJ 표현식으로 나타낸다.
pointcut이 필요하여 만든 메소드므로 구현부가 없다.
@Atfer, @Before
AOP를 사용하여 특정 메소드의 실행 전후에 원하는 동작을 삽입할 수 있게 보조업무를 advice로 추가한다.
- 보조업무 실행
목록보기 클릭 시
등록하기 클릭 시
상세보기 클릭 시
상세보기는 보조업무 설정를 해주지 않아 출력되는 보조 업무가 없다.
'Spring' 카테고리의 다른 글
[Spring] REST API Sever 구축 (0) | 2023.11.30 |
---|---|
[Spring] JUnit를 이용한 단위테스트(JDBC, HikariCP, MyBatis) (0) | 2023.11.30 |
[Spring] Apache Commons IO 라이브러리(2) : 다중 file 입출력 (0) | 2023.11.29 |
[Spring] Apache Commons IO 라이브러리(1) : file 입출력 (0) | 2023.11.29 |
[Spring] Tiles 프레임워크 : 레이아웃 프레임워크 (0) | 2023.11.29 |