Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Min's dev-log

[Spring] AOP 관점 지향 프로그래밍 본문

Framework/Spring

[Spring] AOP 관점 지향 프로그래밍

minyy 2023. 5. 29. 21:41

 

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: 둘의 결합 자체를 의미한다.

 

*Impl.select*(..) &rArr; Impl로 끝나는 클래스의 select으로 시작하는 메서드만 호출~

 

 

 

 

 

Comments