AOP(Aspect Oriented Programming)란?
직역으로 관점지향 프로그래밍이다.
프로젝트에서 공통 부분을 처리한다. 예) log 처리, session 체크, DB체크
Log 사용 예시
1) 이클립스에서 Dynamic Web Project를 생성한다.
2) pom.xml을 생성한다. ( 프로젝트 우클릭 → Configure → Convert to Maven Project )
3) pom.xml 에서 </build> 태그 밑에 코드를 추가한다.
pom.xml 코드 예시
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>testAOP</groupId>
<artifactId>testAOP</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>16</release>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.3.6</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.4</version>
</dependency>
</dependencies>
</project>
추가 후 pom.xml을 저장하면 Maven Dependencies가 생성되고 jar파일이 추가된 것을 볼 수 있다.
4) bean.xml 파일을 생성한다.
파일 생성 방법
src/main/java 우클릭 후 New → Other.. 클릭한다.
java 폴더안에 Spring Bean Configuration File 클릭 후 Next > 클릭
File name 작성 후 Next > 클릭
aop, beans 체크 후 Finish 한다.
생성된 bean.xml 파일 코드
<?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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
</beans>
5) Log에서 불러올 Dto Class를 생성한다.
Dto Class 예시
package com.dto;
public class Cat {
private String name;
private int age;
private String color;
public Cat() {}
public Cat(String name, int age, String color) {
super();
this.name = name;
this.age = age;
this.color = color;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public void info() {
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
System.out.println("컬러 : " + color);
}
}
변수 생성 후 info 메소드를 작성한다.
6) Log AOP를 사용할 클래스를 생성한다.
LogAop Class 예시
package com.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class LogAop {
// 패키지명 안에 있는 어떤 클래스든 호출될 때 무조건 들어와서 실행된다.
@Around("within(com.dto.*)")
public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable{
// 신호과 왔을때
String signatureStr = joinpoint.getSignature().toShortString();
System.out.println(signatureStr + " 시작");
try {
Object obj = joinpoint.proceed(); // 실행시 (클래스가 호출 된 시점)
return obj;
} finally {
// System.currentTimeMillis() : 밀리세컨 단위의 시간
System.out.println("실행 후 : " + System.currentTimeMillis());
System.out.println(signatureStr + " 종료");
}
}
}
7) bean.xml에 코드를 추가한다.
<?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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<!-- AOP 객체생성 -->
<bean id="logAop" class="com.aop.LogAop"/>
<!-- AOP에 관한 어노테이션 사용하겠다 -->
<aop:aspectj-autoproxy/>
<bean id="myCat" class="com.dto.Cat">
<!-- 객체에 값 넣기 -->
<property name="name" value="야옹이"/>
<property name="age" value="2"/>
<property name="color" value="흰색"/>
</bean>
</beans>
8) 코드를 실행할 MainClass를 생성한다.
MainClass 예시
package com.main;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import com.dto.Cat;
public class MainClass {
public static void main(String[] args) {
// Java에서 xml을 실행 시
// bean.xml을 읽어와라
AbstractApplicationContext ctx = new GenericXmlApplicationContext("bean.xml");
// xml에서 생선된 Object를 읽어 들인다.
Cat myCat = ctx.getBean("myCat", Cat.class);
myCat.info(); // info()메소드 호출
System.out.println("=================================");
myCat.setAge(1);
System.out.println("=================================");
myCat.info();
}
}
실행화면
Cat.info() 시작
이름 : 야옹이
나이 : 2
컬러 : 흰색
실행 후 : 1626263390713
Cat.info() 종료
=================================
Cat.setAge(..) 시작
실행 후 : 1626263390713
Cat.setAge(..) 종료
=================================
Cat.info() 시작
이름 : 야옹이
나이 : 1
컬러 : 흰색
실행 후 : 1626263390713
Cat.info() 종료
'IT > Spring' 카테고리의 다른 글
[Spring] @PathVariable 과 @RequestParam 이란? (0) | 2021.11.30 |
---|---|
[Spring Boot + Security] SecurityConfig 설정 (Feat. gradle) (1) | 2021.11.30 |
[Spring] 의존성 관리방법(Dependency Injection- Setter Injection/Constructor Injection) (0) | 2021.07.18 |
[Spring] Spring Bean Configuration File의 beans, bean속성과 속성값 이해하기 (0) | 2021.07.18 |
[Spring] Dynamic Web Project로 스프링 프로젝트 생성하기 (2) | 2021.07.05 |