본문 바로가기
java spring/AOP

AOP - 1

by 킹차니 2021. 4. 28.

스프링을 공부하기 위해 알아야할 것이 AOP이다.

https://www.youtube.com/watch?v=y2JkXjOocZ4&list=PLq8wAnVUcTFVUMCKI4CL_EHWW5ykPnL0z

 

AOP

aspect oriented programming의 약자로 스프링이 AOP라는 것이 아니라, 프로그래밍의 방법론 중 하나이다.

만약 어떤 서비스에 클라이언트가 요청을 하면 그 요청을 처리하는 주업무가 있을 것이다. 하지만 서버 코드에 주 업무의  코드만 있는 것은 아니다. 

서버의 개발자나, 운영자가 로그처리, 보안, 트랜잭션 처리 등으로 인해 코드를 추가해야하는 경우가 있다. 이러한 로직은 사용자에게 보여지는, 즉 사용자가 필요로하는 서비스가 아닌 개발자의 필요에 의해 만들어지는 로직이다.

A라는 서비스가 있다면 그 안에는

[개발자의 필요에 의한 보조업무로직] -> [사용자를 위한 주 업무] -> [개발자의 필요에 의한 보조업무로직]

와 같은 순서로 한 클래스안에서 수행된다. 하지만 AOP로 이를 나누는 것이다.

 

즉 클라이언트가 특정 서비스를 요구하면 프록시를 통해 개발자의 업무를 수행하게 하고 그 프록시 안에서 원래 사용자가 요구하는 주 업무를 호출하여 수행한다. 수행을 마치면 남은 개발자의 업무를 수행하게 하는 것이다.

(개발자의 필요에 의한 업무는 cross-cutting concern, 사용자가 요구하는 주업무는 core concern이라 한다.)

 

먼저 이 둘을 분리하기 전에 특정 업무의 수행 시간이 얼마나 걸리는지 알기 위한 cross-cutting concern을 core concern로직에 추가한 코드를 먼저 보자.

위의 코드에서 주황색 네모 박스가 cross-cutting concern이라 할 수 있다. total()메서드는 원래 총점을 구하고 반환해주는 함수인데 그안에 이 메서드가 수행되는데 시간이 얼마나 걸리는지에 대한 코드가 담겨있다. 즉 core concern과 cross-cutting concern이 하나의 클래스에 있는 것이다. 이를 실행하면 다음과 같다.

Program.java

 

이제 cross-cutting concern을 total()메서드에서 꺼내고 프록시를 사용하여 cross-cutting concern가 core concern을 호출하는 방식으로 코드를 바꿔보자. 이는 실행부인 Program.java에 코드를 추가한다.

위의 코드에서 invoke함수의 내용이 cross-cutting concern을 실행하는 부분이다. 또한 실행 중간 연두색 박스에서 원래의 core concern을 실행하여 그 결과를 result에 저장한다. 이와 같은 방식으로 AOP를 구현하느 것이다.

물론 스프링을 사용하면 이보다 쉽게 AOP를 구현하게 해준다. 다음에 그 방법을 알아보자.