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() 종료

+ Recent posts