Refactoring-AOP

Shaun·2023년 3월 2일
1

aop

목록 보기
1/2
post-thumbnail

AOP가 뭔지는 대략적으로 알고는 있었지만 사용은 해본적이 없었다. 언제 써야 됄지도 모르겠고...

그러던 와중 우연히 코드 피드백을 받을 기회가 생겼는데 로그, 중복코드 제거시 AOP를 사용하는 방법을 피드백 받아 적용해 봤다.

AOP?

Aspect Oriented Programming 의 약자로 관점지향 프로그래밍이라고 부른다. IoC가 낮은 결합도와 관련된 것이라면 AOP 는 높은 응집도와 관련되어 있다.

서비스들의 비즈니스 메소드들은 복잡한 코드로 구성되어있는데, 그 중 핵심 로직은 얼마안되고 대부분은 트랜잭션, 로깅 처리, 인증과 관련된 코드들이 있을 수 있다. 이럴 때 비핵심이지만 꼭 필요하고, 공통화할 수 있는 부분을 따로 빼서(횡단 분리) 관리하는 것이다.

AOP사용 이유

  • 중복코드 제거
  • 부가기능과 핵심기능 분리

추가적으로 더 있을수가 있지만 여기서는 이 두가지만 다룰 예정이다.

커스텀 애노테이션

부끄럽지만 이런식으로 API당 중복 코드가 발생했으며 Controller 마다 두번째 사친 코드들이 중복 됐다.

AOP 사용방식에는 크게 애노테이션과, 메서드에 적용시키는 방법 두가지가 있는것 같다.

  • 로그인 멤버 정보를 추출해 내줄수있는 애노테이션을 AOP를 이용해 만들어보자

  • Spring은 ControllerLayer에서 특정 조건에 맞는 파라미터가 있을 때 원하는 값을 바인딩할 수 있는 HandlerMethodArgumentResolver 인터페이스를 제공한다. 이 인터페이스에서는 다음의 두 가지 메서드를 구현해야 한다.

  • supportsParameter(MethodParameter var1)
    : 주어진 메서드 파라미터가 해당 resolver에서 수행할 수 있는지 확인

  • resolveArgument(...)
    : supportsParameter() 가 true인 파라미터에 대해서 어떤 객체를 Client Request의 아규먼트에 바인딩하여 돌려줄 것인지에 대한 로직 수행

  • 우리가 만든 Resolver 를 등록해준다

  • 이전에 있던 많은 메서드들이 제거 됐으며 그 기능들은 우리가 만든 커스텀애노테이션 안에 있다. 그러므로 중복코드도 줄이면서 변경에 유연하게 대처할수 있게됐다.(커스텀 애노테이션만 고치면 되니까)

메서드적용(로그)

  • 다른 로직에도 적용할 수 있지만 나는 메서드 로드에 적용해 봤다.

@PointCut : AOP를 적용시킬 범위 설정
@AfterReturning : 정상적으로 작동해 리턴값이 있을떄
@AfterThrowing : 타겟 객체의 메서드가 예외가 발생하면 호출되는 어드바이스
@Aspect: 어노테이션을 이용해서 부가기능을 제공하는 Aspect 클래스를 작성한다. 이때 Aspect 클래스는 어드바이스를 구현하는 메서드와 포인트컷을 포함한다.
@Before : 해당 범위안의 메서드가 시작되기전 실행
@Around : 대상 메서드 전,후 실행
JoinPoint : 클라이언트가 호출하는 모든 비즈니스 메소드,

profile
호주쉐프에서 개발자까지..

0개의 댓글