AOP 적용하기

박원종·2021년 2월 27일
0

spring

목록 보기
2/4
post-thumbnail

AOP란

aop개념 설명은 이미 많은 블로그에서 자세하게 알려주기 때문에
필자는 오늘도 핵심내용만 정리하려고 한다

AOP를 왜쓸까?

1. 중복되는 코드를 제거하기 위해
2. 핵심관심횡단관심을 나누기위해
3. 결합도를 낮추기 위해

필자는 이정도가 aop를 쓰는 이유라고 받아들였다
아마 더 드라마틱한 이유도 있겠지만 최선이다...


1. 중복되는 코드 제거하기 위해

Aop를 설명할 때 메소드가 수행된 시간을 체크하는 것을 대표적으로 예를 든다

모든 메소드에 시간을 체크하는 코드를 넣는다고 생각해보자

복붙해서 할 수 있겠지만 최악의 코드인건 누구나 알 것이다

메소드나 클래스를 만들때 자신의 역할을 분명하게 나타내는 것이 중요한데

시간을 체크하는 코드를 모든 메소드에 넣는다면 이러한 취지에 벗어난다

2. 핵심관심과 횡단관심을 나누기 위해

따라서 그 메소드의 핵심적인 내용이 무엇인지 파악하고 부가적인 기능

(시간체크 기능)은 따로 빼는 것이 좋다.

횡단관심은 이렇게 다양한 곳에서 공통적으로 사용하는 부가적인 기능을 말한다

클래스나 메소드로 시간체크 기능을 만들어서 이것을 사용할 메소드의 앞과

뒤에서 실행시키면 각각의 역할에 더 치중하고 구분하기 쉬워진다

3. 결합도를 낮추기 위해

처음에 말했던대로 시간체크 코드를 모든 메소드에 넣게된다면 시간을 체크하는

코드에서 변경점이 생길때 모든 메소드를 다 고쳐주어야한다

이런것들이 한두개라면 상관없지만 수천개라고 생각해보자..... ㅇㅋ?

aop를 사용해 의존성을 낮춰주고 시간체크 기능의 클래스 or 메소드만

고쳐준다면 시간체크를 사용하는 다른 메소드에서 수정할 작업이 없을 것이다

이러한 이유로 인해 aop를 사용하는 것 같지만 어떻게 자유자재로 활용할지는 사실 감이 잘 안잡힌다...

실습

Aop가 어떻게 실행되는지 간단하게 체크해보자
필자는 controller에 등록된 모든 메소드가 호출될 때 마다

[메소드 이름] 메소드 시작
[메소드 이름] 메소드 끝

출력 할 것이다

1. pox.xml에 aspectj 설정 추가
aop를 사용하기 위해서는 다음 모듈이 필요하다

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.5</version>
        </dependency>

2. dispatcher-servlet.xml

3. 메소드 시작,끝 출력할 클래스

1번째 줄 @Componenet는 빈으로 등록한다는 뜻
2번째 줄 @Aspect 횡단관심(공통으로 사용할 부가적인 기능)이라는 뜻
3번째 줄 @Around 횡단관심을 사용할 메소드들

execution은 methodLogger()을 사용할 메소드(핵심관심)들의 정보를 나타낸다
execution(* controller.*Controller.*(..))

(접근지정자 리턴형식 패키지.클래스.메소드(메소드파라미터))
접근지정자는 보통 public이므로 생략가능하다
접근지정자는 생략하고
*(모든 리턴형식) controller.(controller라는 패키지에 있는) *Controller.(~~~Controller로 끝나는 모든 클래스의)
*(모든메서드) (..) (0개이상의 아무타입의 파라미터)

를 만족하는 메소드에 적용하겠다 라는 뜻이다.
참조링크 : https://sjh836.tistory.com/157
4번째줄 ProceedingJoinpoint 는 핵심관심 메소드의 정보를 가지고 있는 객체이다
5번째줄 joinPoint.getSignature().getName()은 실행되는 핵심관심 메소드 이름을 반환한다

Controller에서 select 메소드를 호출해보자

위의 결과가 나온다

profile
잡코딩

0개의 댓글