[TIL] 0827

김다희·2021년 8월 27일
0
post-thumbnail

✏️ 오늘의 학습

AoP (Aspect Orient Programming)

Aspect Orient Programming 사전적의미는 관점 지향 프로그래밍이다. AoP Aspect는 관점이라는 해석보다는 기능, 관심정도로 해석하는게 더 알맞다. 기능, 관심 지향 프로그래밍은 Cross Cuttiong Concerns 을 해결해주는 기법이라고도 할 수 있다. Cross Cuttiong Concerns은 어플리케이션을 만들다보면 Presentation Layer, Business Layer, Data Access Layer 에서 Loggin / Transaction Management / Security - Cross Cuttiong - 등과 같은 공통으로 고민해야하는 내용을 분리해서 프로그래밍을 만들 수 있게해주는 방식이라고 보면된다.

아래와 같은 코드가 있다고 생각해보자. 이체() 메서드와 계좌확인() 메서드에서 비즈니스 로직을 실행하기 전, 후로 부가적이면서 동일한 코드를 반복하고 있다.

class 계좌이체서비스 {
    method 이체() {
        a()                
        비즈니스 로직            
        b()
    }

    method 계좌확인() {
        a()
        비즈니스 로직
        b()
    }
}

이렇게 흩어져있는 부가적인 코드를 분리를 한 뒤

  • 비즈니스 핵심 기능은 비즈니스 핵심기능만 담당하도록 하고
  • 부가기능은 부가기능을 담당하는 모듈에서 관리하도록 하면
    유지보수 측면에서도, 객체지향 프로그래밍 관점에서 많은 이점을 볼 수 있다.

그럼 부가기능을 어떤식으로 적용할 수 있을까? 그 부분을 AoP를 이용하여 적용할 수 있다.

AoP 적용 방법(Weaving)

  • 컴파일 시점 : AOP를 적용하는 프레임워크인 AspectJ 가 소스코드를 컴파일하기전에 공통 구현 코드를 소스에 삽입하는 방식으로 동작한다. 즉 부가기능을 소스에 삽입하는 방식이다.
  • 클래스 로딩 시점 : 클래스롤 로딩할 때 바이트코드에 부가기능을 삽입하는 방식이다.
  • 런타임 시점 : 스프링에서 제공하는 AOP 방식으로 JDK dynamic proxies를 이용하여 비즈니스 로직을 가지고 있는 클래스를 프락시 객체로 만들어서 부가기능을 동작하게한다.

AoP Proxies

Proxies에는 두가지 방식이 있다.

  • JDK dynamic proxies : 인터페이스 기반의 proxies
  • CGLib proxies : class 기반의 proxies

AoP 방식

스프링 AoP 방식으로는 xml 기반(현재는 잘 안쓴다고 함) 또는 AspectJ 어노테이션을 이용하는 방식이 있다.

AoP 주요용어

  • Target : AoP를 적용할 대상, 즉 핵심 기능을 담고 있는 모듈로서 부가기능(Advice)을 부여할 대상을 뜻한다.
  • Join Point : 어플리케이션 실행 중 부가기능을 적용할 수 있는 지점을 의미한다.
  • Pointcut : 부가기능를 적용할 타겟의 메서드를 선별하는 표현식이다. execution 으로 시작하고 여러 조인포인트에서 어디에 부가기능을 적용시킬지 나타낸다.
  • Aspect : 부가기능 + 포인트컷으로, 실제 부가기능에 대해 작성한 코드이다. 스프링에서는 Aspect를 빈으로 등록하여 사용한다.
  • Advice : 타겟의 특정 조인포인트에 제공할 부가 기능이다. @Before, @After, @Around, @After Returning, @After Throwing 어노테이션이 있고 각 어노테이션에 따라 조인포인트가 달라진다.
    출처 : https://m.blog.naver.com/dkdldoafotn/221655932482
  • Weaving : 타켓의 조인포인트에 부가기능을 적용하는 과정이다. 컴파일 시점 / 클래스 로딩 시점 / 런타임 시점에 적용할 수 있다.

Aop 사용법

AoP를 사용하려면 @EnableAspectJAutoProxy과 빈을 설정해줘야 한다.

@Aspect
@Component
public class LoggingAspect {

    private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);

    @Around("execution(Pointcut)")
    public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
        logger.info("Before method called. {}", joinPoint.getSignature().toString());
        Object result = joinPoint.proceed();
        logger.info("After method called with result => {}", result);
        return result;
    }
}
@SpringJUnitConfig
@ActiveProfiles("dev")
public class AopTests {

    @Configuration
    @ComponentScan(
           basePackages = {package}
    )

    @EnableAspectJAutoProxy
    static class Config {
    }
}
  • within을 이용하는 방식도 있다.

@Pointcut 적용 방식

@Around("execution(Pointcut)")
@Pointcut("execution(matcher)")
public void methodName() {};

@Around("methodName()")
package org.prgrms.kdt.aop;

import org.aspectj.lang.annotation.Pointcut;

public class CommonPointcut {

    @Pointcut("execution(* org.prgrms.kdt..*Repository.*(..))")
    public void repositoryPublicMethodPointcut() {};

    @Pointcut("execution(* org.prgrms.kdt..*Service.*(..))")
    public void servicePublicMethodPointcut() {};

    @Pointcut("execution(* org.prgrms.kdt..*Repository.save(..))")
    public void repositorySaveMethodPointcut() {};
}

@Aspect
@Component
public class LoggingAspect {

    private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);

    @Around("org.prgrms.kdt.aop.CommonPointcut.repositorySaveMethodPointcut()")
    public Object log(ProceedingJoinPoint joinPoint) {
    	...
    }
}

🔗 오늘의 알고리즘

leetcode Verify Preorder Serialization of a Binary Tree


🎤 데일리 스터디 발표

08.27.(금) W4D4 SpringBoot Part2 학습 내용 발표 범위

  • Embedded DataBase - 효희님
  • NamedParameterJdbcTemplate(1) - 동섭님
  • NamedParameterJdbcTemplate(2) - 연재님
  • NamedParameterJdbcTemplate(3) - 다희님

❓오늘의 궁금증

  • 종종 profile 때문에 오류가 난다. 대충 이래서 오류가 나는 것 같다~ 싶어서 이리저리 조금 고치면 된다. profile.. 제대로 알아봐야지......

🎊 오늘의 느낀점

  • AoP 들어오면서 난이도가 훅 올라갔다. 개념이 어렵다기보단 개념을 바탕으로 스프링에서 제공해주는것들을 제대로 사용하기 어렵다. 물론 처음이니까 그런거겠지만 어쨌든 어렵다. 반복하고 손으로 익히면서 빨리 내것으로 만들어야지.
profile
개발 덕질 중(?)

0개의 댓글