Min's dev-log
[Spring] AOP 관점 지향 프로그래밍 본문
AOP에 대해 더 알아보자.
스프링 프레임워크에서는 높은 응집도를 통해 유지보수 용이한 코드를 작성할 수 있는 AOP를 지원한다.
AOP (Aspect Oriented Programming) 관점지향 프로그래밍
OOP 객체지향 프로그래밍
: OOP의 한계 (dao 중점적 코딩 - dao는 디비랑 관련된 아이니까 매번 비슷한 로직 여러번 등장함 -> JDBCUtil)
비슷한 로직의 코드가 여러번 등장하는 상황이 있다.
ex) JDBCUtil : AOP의 시작이라고 볼수있는 예시상황
CRUD(비즈니스 메서드, 핵심 로직) + 횡단관심(공통로직 - OOP를 쓰고 있다면 낄 수 밖에 없다)
AOP에서는 횡단로직 완전히 빼낼 수 있다. AOP에서는 완전 분리한 공통 로직 코드들이 각각 클래스화 되어있다.
=> 응집도가 높아짐(하나의 코드에 하나의 로직이 들어있음)
어떤 핵심 로직에 대해 어떤 공통 로직을 수행해야 하는지에 대한 설정 정보가 필요하다.
=> xxx.xml 설정파일 필요함
[ AOP 사용 ]
인증, 로그, 보안, 트랜잭션(동시에 되는거 막는것) 등
=> 공통로직, 횡단관심 => 로직들을 매번 넣어야 된다. => 따로 빼서 관리하겠다.
이 중에 Log는 어떠한 곳에서도 사용할 수 있는 공통로직, 이 기능을 묶어서 관리할 것 이다.
[ AOP 설명순서 ]
1) LogAdvice를 BoardServiceImpl에서 사용한다.
2) 그런데, LogAdvice를 업데이트하게 된다.
3) 업데이트된 LogAdvice2를 사용하니,
4) 메서드명도 함께 업데이트되어서 직접 하나 하나 코드를 수정하게 된다...
=> OOP의 한계(객체지향 -> 객체에 대한 명시할 수 밖에 없음)
5) 스프링 컨테이너야, 너 AOP할줄알지?
앞으로 비즈니스 메서드(CRUD,핵심관심,핵심로직)를 수행하기전에(aop:before)
공통로직(횡단관심, ex. 로그/트랜잭션/인증/보안/util클래스...)인 LogAdvice를 실행시켜줘.
라고 설정을 해줄 예정이다.(스프링컨테이너에 설정해줌)
[ AOP 용어 ]
※ Advice
횡단 관심, 공통 로직
※ joinpoint(조인포인트)
포인트컷 후보
모든 비즈니스 메서드(CRUD,핵심관심,핵심로직)을 의미한다.
"조인포인트중에서 포인트컷을 고른다"
※ pointcut(포인트컷)
핵심 관심, 핵심 로직, CRUD, 비즈니스 메서드 중에서 횡단관심과 연결되는 메서드(로직)이다.
예를 들어,
계좌이체를 할때 반드시 보안처리를 해야하는 상황 보안 횡단관심의 포인트컷은 계좌이체 메서드(로직)이다.
※ aspect
관점 : 기능(로직)지향적인 프로그래밍 .xml에서는 advice와 pointcut의 결합 그 자체이다.
※ advisor(어드바이저)
일부 설정은 <aop:aspect>를 사용할 수 없고 <aop:advisor>만을 사용하기 때문에
advice와 pointcut의 결합을 의미하는 단어로 advisor를 채택하기도 한다.
※ weaving(위빙)
포인트컷을 수행할때에 설정된 어드바이스를 주어진 동작시점에 호출하는 과정 그 자체를 의미한다.
위빙처리를 반드시 해줄 수 있어야 하고 weaver가 처리하는 작업이다.
weaver가 없으면 AOP는 안 돌아간다.
스프링에서는 실행 시(런타임)에만 위빙을 처리한다. => 런타임 위빙 방식을 지원한다.
결합하는 과정 == 위빙처리
== 모든 비즈니스 메서드에 대해 어떤 시점에 해당 advice를 동작시켜 -> 처리하는 순간
weaving이 처리 됐다고 이야기한다.
+) 로딩타임 == 메모리 적재 시간 / 컴파일 타임 == .jsp를 .java 서블릿 파일로 만드는 시간
aspect 결합 시점에 대해 좀 더 알아보자면,
빨강 동그라미 : 스프링 컨테이너야 aop할줄알지?
빨강 밑줄/물결: 앞으로 이런 핵심관심(pointcut)에 대해
연두 동그라미/밑줄: 이런 횡단관심(logAdvice, printlog)을 수행시켜줘
핑크 동그라미: 언제? before == 전에
aspect: 둘의 결합 자체를 의미한다.
'Framework > Spring' 카테고리의 다른 글
[Spring] 스프링 2-layred 아키텍처 (1) | 2023.07.12 |
---|---|
[Spring] 스프링 프레임워크의 요청 처리 흐름 (0) | 2023.06.07 |
[Spring] 스프링 컨테이너 (0) | 2023.06.04 |
[Spring] AOP 동작 시점 (0) | 2023.05.30 |
[Spring] 스프링 프레임워크 (1) | 2023.05.27 |