Aspected Oriendted Programming(AOP)
Introduction
지난 프로젝트(java-qna)에서 로그인한 유저인지 확인하기 위해 해당 요청에 따라 Session
을 확인했어야 했습니다.
위 부분은 저의 QuestionController
내 글 보기, 생성, 업데이트 이동, 업데이트에 관한 부분인데요. 매번 Session
을 확인하는 작업이 필요한 것을 볼 수 있습니다. 다음과 같은 구조인 것이죠.
개별 요청 하나하나만 보았을 때 중복되는 부분이 없어보입니다. 하지만 부가적인 기능의 관점에서 보면 중복이 확실하게 보이는데요. 바로 이 부분이죠.
여기서 AOP에 대한 필요성이 등장합니다. 공통된 부가기능은 따로 떼어두고 재사용하자는 것인데요. AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)도 여기서부터 시작합니다. 기존 핵심기능 위주로 보던 것을 다른 관점, 부가기능 측면에서도 바라봄으로써 공통된 부분을 추출하는 것이죠. AOP에서는 위 빨간색 박스와 같이 공통된 부분을 '크로스 컷팅(Cross-Cutting')이라고 부릅니다. OOP의 기본단위가 Class
였다면 AOP의 기본단위는 Aspect
가 되는데요. 위 빨간 박스가 하나의 aspect가 되는 것입니다. AOP를 본격적으로 이해하기 위해선 관련 용어 몇 개를 알아야하는데요. 일단 그 부분 먼저 살펴볼게요!
AOP 관련 용어
aspect
: 공통 기능을 가지는 대상, 부가기능 모듈, AOP의 기본 단위, 밑에 설명할advice
와pointcut
으로 구성됩니다.target
: 부가기능을 부여할 대상(위의 경우QuestionController
)advice
: target에 적용할 부가기능을 담은 구현체(공통기능), aspect의 세부내용jointpoint
: advice가 적용될 수 있는 위치, 보통 메서드를 의미(위의 경우question()
,post()
,updateQuestion()
,showUpdateForm()
)pointcut
: advice가 적용될 target을 지정하는 것weaving
: advice를 적용하는 행위advisor
: 어떤 부가기능(어드바이스)을 어디에(포인트컷) 전달할 것인가를 알고 있는 AOP의 가장 기본이 되는 모듈입니다.proxy
: 클라이언트가 사용하려는 실제 대상인 것처럼 위장하여 클라이언트의 요청을 받는 것을 말합니다. 여기에서 부가기능의 선처리, 후처리가 구현이 되는데요. 최종적으로 요청을 받아 처리하는 오브젝트를 타깃 또는 실체라고 합니다. 스프링은 프록시를 이용해 AOP를 지원합니다.
위에서 많은 용어를 설명했는데요. 기억하기가 쉽지 않죠. 그래서 컨닝페이퍼를 준비해봤어요..
오늘은 여기까지 정리하구요! 내일은 '구현실습', '어드바이스 종류', '포인트컷 표현식'에 대해서 마저 알아보도록 하겠습니다.