Spring 의 큰 특징 중 하나인 관점 지향프로그래밍(AOP) 에 대해 설명하는 글 입니다.
관점 지향은 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고, 그 관점을 기준으로 각각 모듈화 하여 사용하는 것을 의미한다.
#CF) 모듈화 : 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 의미
핵심적인 관점 : 적용하고자 하는 핵심 비지니스 로직
부가적인 관점 : 핵심 로직을 실행하기 위해서 행해지는, 데이터베이스 연결, 로깅, 파일 입출력을 예로 들을 수 있다.
프록시 패턴의 목적은 기존 코드 변경 없이 접근 제어 또는 부가 기능을 추가하기 위해서이다.
@Primary
@Service
public class ProxySimpleEventService implements EventService {
@Autowired
private SimpleEventService simpleEventService;
@Override
public void createEvent() {
long begin = System.currentTimeMillis();
simpleEventService.createEvent();
System.out.println(System.currentTimeMillis() - begin);
}
@Override
public void publishEvent() {
long begin = System.currentTimeMillis();
simpleEventService.publishEvent();
System.out.println(System.currentTimeMillis() - begin);
}
@Override
public void deleteEvent() {
}
}
위 ProxySimpleEventService는 실제 핵심 코드를 담당하는 SimpleEventService 클래스 코드를 Field로 주입 받고 있다. 즉 기존의 SimpleEventService 클래스의 코드에는 성능측정하는 코드를 작성하지 않아도 된다는 장점이 생겼다. 하지만, 이런 방식도 메소드가 많다면, 코드 중복이 일어날 것이고 , 매번 Proxy Class를 만들어야 한다는 점에서 큰 단점이 존재한다. 이것들을 해결하기 위해 나온 것이 Spring AOP이다.
AOP의 핵심 기능은 코드를 수정하지 않으면서 공통 기능의 구현을 추가하는 것이다.
공통 기능을 추가하는 방법에는 아래와 같이 3가지 방법이 존재한다.
스프링 aop는 런타임에 많이 사용하며, 프록시 객체를 자동으로 만들어준다. 따라서 위에서 본 ProxySimpleEventService 클래스 처럼 상위 타입의 인터페이스를 상속 받은 클래스를 직접 구현할 필요가 없다. 단지 공통 기능을 구현한 클래스만 잘 구현하면 된다.
https://engkimbs.tistory.com/746
https://devlog-wjdrbs96.tistory.com/398