스프링에서는 낮은 결합도, 높은 응집도가 필요하다.
IOC는 낮은 결합도를 위한 것이라면,
AOP는 높은 응집도를 위한 거이다.
Spring 에는 triangle 이라는 3대 개념이 있다.IOC AOP PSA 세가지를 제공해주는 spring triangle이라는 개념이 있다.
======================================================================
WHAT?
Aspect Oriented Programming //관점 지향 프로그래밍
공통된 기능과 공통되지않은 기능(비즈니스 로직) 을 구분하고,
공통된 기능은 비즈니스로직과 분리하여 밖에서 관리해준다.
======================================================================
WHEN?
logging 시스템등 서비스 로직은 아니지만 어디서나 필요한 공통 로직들이 있다고 하자.
AOP 방식으로 구현이 되어있다면,
비즈니스 관련 클래스의 코드상에는 logging 시스템코드가 아예없다.
하지만, 그 클래스를 사용하게 되면, logging 시스템이 작동되게 된다. ( 다른곳에 있다가 꽂히는것)
======================================================================
HOW?
1.<dependency> 설정
<artifetID> Spring boot starter AOP </artifactID>
</dependency>
2. @SpringbootApplication 위에
@EnbleAspectAutoProxy 붙여서 AOP를 찾을수 있게 해준다.
3. 공통기능(Advice) + 시점 ( 포인트컷) >>Aspect 설정
@Aspect
@Component
public class LogAspect{
@Around( execution( a.b.c.**Service) ) //서비스 내부에 있는 모든 메소드해당
public String checkLog( proceedJoinPoint joinpoint){
공통로직
joinpoint.proceed(); //비즈니스로직
공통로직
}
}
tip)
Advice : 횡단관심사 기능을 구현한것 ( target class에 제공됨)
PointCut : Advice를 어디에 적용할지
target : Advice 가 적용된 클래스를 target 이라고한다.
weaving : target 이 올바른 pointcut시점에 advice 를 받는다면, 그가 Proxy객체가 된다. 이를 위빙이라고 한다.
프록시를 사용하지 않는 AOP?
AOP 기술의 원조인 AspectJ는 프록시를 사용하지 않는 대표적인 AOP 기술
프록시 방식을 사용하지 않고 어떻게 AOP를 제공했을까??
타깃 오브젝트를 뜯어고쳐서 부가기능을 직접 넣어주는 방식을 사용한다
소스코드를 고치는 것이 아니라,
컴파일된 타깃 클래스의 파일 자체를 수정하거나
클래스가 JVM에 로딩되는 시점을 가로채서 바이트코드를 조작한다
소스코드는 수정하지 않으므로, 개발자는 비즈니스 로직에 충실할 수 있으나...
왜 프록시를 사용하지 않고 클래스 파일 조작과 같은 복잡한 방법을 사용할까??
1. 스프링과 같은 DI컨테이너의 도움이 필요없다
스프링과 같은 컨테이너가 사용되지 않는 환경에서 AOP 적용이 가능하다
2. 프록시보다 훨씬 강력하고 유연하다
프록시 방식은 타깃 오브젝트가 생성되고 난 후부터 적용이 가능하다
하지만 AspectJ는 어떤 순간에든지 적용이 가능하다
클래스 바이트코드를 직접 조작하는 것이기 때문에 거의 제한이 없다
대부분의 부가기능은 프록시 방식을 사용해 메소드의 호출 시점에 부여하는 것으로도 충분하다
AspectJ와 같은 고급AOP 기술은 바이트코드 조작을 위해
JVM의 실행옵션을 변경하고, 별도의 바이트코드 컴파일러를 사용하고,
특별한 클래스 로더를 사용하는 등 번거로운 작업이 필요하다
일반적으로 스프링의 AOP를 사용하고,
스프링의 AOP 수준을 넘어서는 기능이 필요하다면
AspectJ를 사용하라
도움받은곳
'Spring' 카테고리의 다른 글
AOP 정리3 (0) | 2020.01.16 |
---|---|
AOP 핵심비즈니스에 붙일 어노테이션 사용해서 만들기 (0) | 2020.01.16 |
httpclient cannot be resolved to a type _ httpclientbuilder cannot be.... 에러 sts에서 자동 import안될때 (0) | 2020.01.14 |
No converter for [class com.example.Model.ResponseNaverMovie] with preset Content-Type 'application/json;charset=UTF-8' 에러 (0) | 2020.01.14 |
Spring Lazy Initialization (0) | 2020.01.14 |