(SpringBoot) AOP

soosoorim·2024년 4월 2일
0

AOP
Aspect Oriented Programming 관점 지향 프로그래밍

  • Web Application이 실행되는 시점에 따라 정해진 공통 코드를 실행시켜주는 방법

weaving : class 파일을 조작하는 기술
라이브러리를 통해 weaving 을 사용할 수 있다.
인터셉터와는 다름.

실행

<*ServiceImpl.java의 모든 메소드가 완료되는데 까지 얼마나 시간이 걸리는지 확인_성능 점검>

AOP Library Dependency 추가

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
  • AOP Class 만들기
@Aspect // AOP 모듈
@Component // Spring Bean으로 생성
public class TimingAspect {
    
}
  • @Component :
    -- 클래스를 Spring Bean으로 생성시키는 기본 Annotation
    -- @Controller, @Service, @Repository의 부모 Annotation

공통코드가 개입할 시점 정의

  • @Pointcut : weaving을 해줄 대상 지정

  • com.example.demo 하위의 service 패키지 내부에 있는 ServiceImpl로 끝나는 클래스의 모든 메소드가 실행될 때

@Aspect // AOP 모듈
@Component // Spring Bean 생성해주는 Annotation
public class TimingAspect {
	
	private Logger logger = LoggerFactory.getLogger(TimingAspect.class);
	
	/**
	 * <pre>
	 * AOP를 적용할 대상을 지정.
	 * execution() : 실행단계에서 적용할 대상을 지정.
	 *   public : public 접근 제어자를 사용하는 것을 대상으로 한다.
	 *   * : 모든 반환타입을 대상으로 한다.
	 *   com.hello.forum..service.*ServiceImpl : com.hello.forum 아래에 있는 모든 패키지 중에서
	 *                                           service 패키지 내부에 있는
	 *                                           ServiceImpl로 끝나는 모든 클래스를 대상으로 한다.
	 *   .*(..) : ServiceImpl로 끝나는 모든 클래스 내부의 모든 메소드를 대상.
	 *   
	 *   *ServiceImpl 클래스 밑에 있는 public 모든반환타입 메소드명() 을 대상으로 Aspect 를 실행한다.
	 * </pre>
	 */
	@Pointcut("execution(public * com.hello.forum..service.*ServiceImpl.*(..))")
	public void aroundTarget() {
		
	}


	/**
	 * <pre>
	 * 원래 실행될 메소드의 전, 후에 공통코드를 실행한다.
	 * ServiceImpl에 있는 메소드가 실행될 때(Pointcut 대상이 실행될 때)
	 * 아래 메소드가 실행된다. - Weaving된 코드가 실행된다.
	 * </pre>
	 * 
	 * @param pjp 원래 실행될 클래스와 메소드의 정보
	 * @return 원래 실행될 메소드의 반환 값.
	 */
//	@Before
//	@After
//	@AfterReturning
//	@AfterThrowing
	@Around("aroundTarget()") // 위 4가지를 @Around가 한번에 처리.
	public Object timingAdvice(ProceedingJoinPoint pjp) {
		return null;
	}

logback.xml 파일 / TimingAspect class

<appender name="TIMING_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>C:/logs/hellospring_timing.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- daily rollover -->
      <fileNamePattern>C:/logs/hellospring_timing.%d{yyyy-MM-dd}.log</fileNamePattern>
    </rollingPolicy>

    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} -%kvp- %msg%n</pattern>
    </encoder>
  </appender> 
  
  <logger name= "timing" level="debug">
  	<appender-ref ref="TIMING_LOG"/>
  </logger>

추가해주면 걸린시간만 따로 확인 가능

0개의 댓글

관련 채용 정보