공부하는 블로그

AOP 개념 본문

Develop/Spring

AOP 개념

모아&모지리 2017. 12. 10. 21:36

스프링의 대표적인 기능은 DI와 AOP다. DI가 부품의 연결을 특기로 한다면 AOP는 각 부품이 해야 할 일에만 전념하게 한다.


DIxAOP 컨테이너의 AOP(Aspect Oriented Programming: 관점 지향 프로그래밍)부분을 설명하겠다. 로그 출력이나 트랜잭션 처리 등과 같은 공통화할 수 있는 처리는 오브젝트 안에 없는 편이 소스 코드의 가독성도 좋아지고 결과적으로 컴포넌트로서의 역할도 명확해진다. 게다가 테스트도 쉬워진다. AOP를 이용해 오브젝트 안에 있는 공통된 처리를 제거해보자.




*AOP를 사용하기 전

public class EmployeeServiceImpl implements EmployeeService{

     @Autowired

           private EmployeeDao dao;

           public int insert(Employee emp) throws Exception{

                     if(Log.flag){

                                System.out.println(“***Start”);

                     }

                     Connection conn = null;

                     try{

                                ret = dao.insert(conn, emp);

                                conn.commit();

                     }catch(Exception e){

                                conn.rollback();

                     }finally{

                                //…Connection 해제 등…

                     }

                      if(Log.flag){

                                System.out.println(“***End”);

                     }

                     return ret;

           }

}




*AOP를 사용한 후


public class EmployeeServiceImpl implements EmployeeService{

           @Autowired

           private EmployeeDao dao;

           public int insert(Employee emp) throws Exception{

                     return dao.insert(emp);

           }

}




AOP란? 업무 등 특정 책임이 있는 클래스안에 본질적인 처리만 기술하고, 본질적이지 않은 처리는 밖으로 꺼내는 기술이다. 공통화할 수 있는 처리를 Aspect라는 하나의 단위로 모아서 어떤 오브젝트가 원래 해야할 일만을 하게 만드는 기술이다. 본질적인 처리와 Crosscutting Concerns(횡단관심사:복수의 오브젝트에 걸쳐 기술되기 쉬운 처리)를 분리해 모듈성을 높인다.


*Aspect


Crosscutting Concerns의 동작과 Crosscutting Concerns에 적용하는 소스 코드상의 포인트를 모은 것이다. 다시 말해, 하나 또는 그 이상의 Advice(동작)와 Pointcut(조건)을 조합한 것이다.




*Joinpoint

Advice가 실행하는 동작을 끼워 넣을 수 있는 때를 말한다. 코딩 상에서는 위치를 말하지만, 실행된 때는 Advice가 동작하는 때인 것이다. Joinpoint는 개발자가 고려해서 만들어 넣을 수 없는 AOP의 사양이다.

// 조인포인트는 클라이언트가 호출하는 모든 비즈니스 메소드로서, BoardServiceImpl, UserServiceImpl 클래스의 모든 메소드를 조인 포인트라고 한다.




*Advice

Joinpoint에서 실행되는 코드다. 로그 출력이나 트랜잭션 관리 등의 코드가 기술된다.




*Pointcut

Pointcut은 Joinpoint와 Advice 중간에 있으면서 처리가 Joinpoint에 이르렀을 때 Advice를 호출할지 선별한다. 예를 들어 Pointcut에 메소드명에 Hello라는 문자열이 있으면 Advice를 호출하지 않거나 메소드명에 Service라는 문자열이 있으면 Advice를 호출한다고 기술해둔다.
// 클라이언트가 호출하는 모든 비즈니스 메소드가 조인포인트라면 , 포인트컷은 필터링된 조인 포인트를 말한다.




어드바이스의 형태


설명


Before

조인포인트 앞에서 실행할 어드바이스


After

조인포인트 뒤에서 실행할 어드바이스


AfterReturning

조인포인트가 완전히 정상 종료한 다음에 실행되는 어드바이스


Around

조인포인트 앞뒤에서 실행되는 어드바이스


AfterThrowing

조인포인트에서 예외가 발생했을 때, 실행되는 어드바이스


* 트랜잭션처럼 대표적인 어드바이스는 직접 만들 필요 없이 AOP에서 이미 트랜잭션 처리를 구현해서 제공해준다.



출처 : https://m.blog.naver.com/lhm0812/220693970681


// 18.03.06 추가


관점지향 프로그래밍은 비즈니스 메소드를 개발할 때, 핵심 비지니스 로직과 각 비즈니스 메소드마다 반복해서 등작하는 공통로직을 분리함으로써 응집도가 높게 개발할 수 있도록 지원한다.


공통으로 사용하는 기능들을 외부의 독립된 클래스로 분리하고, 해당 기능을 프로그램 코드에 직접 명시하지 않고 선언적으로 처리하여 적용하는 것이 AOP의 기본 개념이다. 이렁게 되면 공통 기능을 분리하여 관리할 수 있으므로 응집도가 높은 비즈니스 컴포넌트를 만들 수 있을 뿐만 아니라 유지보수를 혁신적으로 향상시킬 수 있다.



'Develop > Spring' 카테고리의 다른 글

Spring 이란?  (0) 2018.03.06
Spring MVC Controller(컨트롤러)가 무엇을 처리해 주는가?  (0) 2017.12.12
JUnit 개념과 설치법  (0) 2017.11.23
Session을 받아오는 방법  (0) 2017.09.29
bean config 설정 분리하기  (0) 2017.09.29