이번 강의에서는 AOP 기술을 알아보았다.
AOP란 무엇인가?
예시를 들어서 설명해보겠다.
내가 다니는 회사의 악덕사장님이 우리 회사 코드의 모든 메소드의 실행시간을 알고싶다고 하신다..
그럼 모든 메소드의 첫 시작 시간과 끝나는 시간의 차이를 구해서 실행시간을 알 수 있다. 말이야 간단하지
메소드가 193824개라면? 오늘까지 하라면? 절망적인 하루가 될 것이다..
우리 시스템의 핵심 관심 사항은 회원가입을 하고, 회원 list를 볼 수 있는 기능인데
모든 메소드의 공통 관심 사항은 실행 시간을 구하는 기능인 것이다.
만약 위에서 말한대로 코드를 짠다면 핵심 관심 사항과 공통 관심 사항이 섞여서 아주 복잡한 코드가 될 것이다.
또한 실행시간을 ms 단위 말고 s 단위로 바꿔봐! 하는 순간 다시 모든 메소드에 가서 단위를 변경해줘야하는 끔찍한 일이 생길 것이다..
하지만 AOP를 사용하면 핵심 관심 사항과 공통 관심 사항을 분리하여 원하는 적용 대상에 적용만 시키면 유지보수도 쉽고 깔끔한 코드가 완성될 수 있다.
아참.. AOP는 Aspect-Oriented Programming의 약자이다..^^
AOP 적용 전 코드
모든 메소드에 시간을 구할 수 있는 코드를 작성했다. 2개만 작성했는데도 한숨이 나왔다.. 똑같은 코드가 내눈에 벌써 두개나 보인다.. 윽윽
AOP 적용 후
따로 클래스를 두어 진행한다.
- @Component 어노테이션을 통해 빈에 등록을 한다. 지금까지 했던 것처럼 따로 @Bean을 통해 등록할 수도 있지만 이번 강의에서는 @Component를 사용했다.
- @Aspect 는 AOP를 적용시키기위해 필요한 어노테이션이다.
- execute() 위에 @Around 어노테이션을 추가한다. 이는 적용 대상을 지정하는 것이다. hello.helloSpring 아래에 모든 메소드에 적용한다는 의미이다.
AOP 작동 원리
강의코드를 기준으로 설명을 하자면, 회원가입한 회원들의 목록을 볼 수 있는 기능이 있다.
그렇게 되면 아래와 같이 동작을 한다.
- 컨트롤러가 페이지 띄운다.
- 서비스가 레포지토리를 통해 회원 목록을 가져온다.
그러면 Controller가 Service를 호출하고 Serivce가 Repository를 호출할까? AOP를 적용하면 그렇지 않게된다.
AOP를 적용하면 스프링 부트는 프록시라는 기술을 통해 가짜 controller를 빈에 등록하고 그 가짜 controller가 진짜 controller를 부르는 식이 되는 것이다.
위의 AOP 코드를 보면 joinPoint.proceed()가 있는 데 이 함수를 통해 가짜가 진짜를 부르는 것이라고 한다.
'Backend > Spring' 카테고리의 다른 글
[Spring] annotation 종류와 쓰임새 (0) | 2021.01.16 |
---|---|
[IntelliJ] custom template 생성하기 (0) | 2021.01.14 |
[인프런 스프링 입문] 스프링 DB 접근 기술 (0) | 2021.01.09 |
[인프런 스프링 입문] 회원 관리 예제 - 웹 MVC 개발 (0) | 2021.01.07 |
[인프런 스프링 입문] 스프링 빈과 의존관계 (0) | 2021.01.07 |