강좌/Spring 3.0

008. AOP - Aspect? 관점? 핵심관심사항? 횡단관심사항?

여름나라겨울이야기 2013. 1. 22. 17:05
728x90

스프링의 핵심 그 두번째는 AOP 입니다.

 

AOP 의 풀영문은 Aspect-Oriented Programming 이고 이걸 한글화 했더니 관점 지향 프로그래밍이 되어버립니다.

 

그럼 관점이란 또 무엇이냐를 따지고 싶겠지만 그러지 마세요.  그냥 Aspect 로 기억하시는게 좋습니다.

 

스프링 DI 가 의존성(new) 에 대한 주입이라면

스프링 AOP 는 로직(code) 주입이라고 볼 수 있습니다.

 

여러 책과 블러그 등을 통해 AOP 개념에 대해 잘 설명되어 있는데요.  여기에 허접한 설명을 더 하나 추가해 봅니다.

 

일단 AOP 라는 글귀에서 OOP 가 생각나실 것이고 "그럼 OOP 다음이 AOP 인가?" 라는 오해를 하실 수 있는데 결코 아닙니다.

 

 

위의 그림을 보시고 바로 "아~" 이런 느낌이 오시나요?  로깅, 보안, 트랜잭션 등등 다수의 모듈에서 반복적으로 나타나는 부분이 존재하는데 바로 이것을 횡단관심이라고 하죠.  혹시라도 DB 프로그램을 해 보신 경험이 있다면 insert 하던, update, delete, select 를 하던 항상 패턴 처럼 나오는 다음과 같은 형태를 코딩 해오셨을 겁니다.

 

DB 커넥션 준비

Statement 객체 준비

try {

    DB 커넥션 연결

    Statement 객체 셋팅

insert / update / delete / select 실행

} catch ... {

예외 처리

} catch ... {

예외 처리

} finaly {

DB 자원 반납

}

 

위를 보시면 빨간색 부분은 어떤 DB 작업을 하던 공통적으로 나타나는 코드이고 이것을 횡단관심사항이라고 합니다.  그리고 파란색 부분핵심관심사항이라고 합니다.

 

코드 = 핵심관심사항 + 횡단관심사항

 

핵심관심사항은 모듈별로 다 다르지만 횡단관심사항은 모듈별로 중복 코딩이 일어나는 부분입니다.  중복이라는 단어 들으시면 프로그래머로써 딱 생각나시는게 있죠.  ^^

중복은 분리해서 한 곳에서 관리하라.  네 기존에는 이랬습니다.  그런데 AOP 에서는 더욱 더 게을러지기 시작합니다.  C&i 기억하시죠? 기억 안 나시면 뒤로 back to 하셔서 잠깐 컨닝하고 오세요.

 

자 이렇게까지 했는데 못 알아듣는다.  읽는 분이 바보라서? 아니죠.. ^^

그래서 최대한 간략한 현실 상황을 두고 설명해 보겠습니다.

 

남자와 여자가 있습니다.  이들이 집에 들어가서 하는 일을 최대한 단순하게 의사 코드로 만들어 보겠습니다.

 

남자용 의사코드

열쇠로 문을 열고 집에 들어간다.

컴퓨터로 게임을 한다.

소등하고 잔다.

자물쇠를 잠그고 집을 나선다.

 

-------------------------------------------

예외사황처리: 집에 불남 - 119 에 신고한다.

 

여자용 의사코드

열쇠로 문을 열고 집에 들어간다.

요리를 한다.

소등하고 잔다.

자물쇠를 잠그고 집을 나선다.

-------------------------------------------

예외사황처리: 집에 불남 - 119 에 신고한다.

 

두 개의 의사코드에서 중복되게 나타나는 횡단관심사항과 각 의사코드에서만 나타나는 핵심관심사항을 분리해 보세요.  분리 다 하셨나요?  아직 안 하셨다면 빨간 볼펜으로 횡단관심사항을, 파란 볼펜으로 핵심관심사항을 밑줄 그어 보세요.  모니터에.. ^^  제 모니터 아니거든요.

 

자 그럼 aop001 패키지를 작성하고 다음 3 개의 클래스를 만들도록 하겠습니다.

 

package aop001;

public class Boy {
 public void housework() {
  System.out.println("열쇠로 문을 열고 집에 들어간다.");
  
  try {
   System.out.println("컴퓨터로 게임을 한다.");
  } catch (Exception ex) {
   if(ex.getMessage().equals("집에 불남")) {
    System.out.println("119 에 신고한다.");
   }   
  } finally {
   System.out.println("소등하고 잔다.");
  }
  
  System.out.println("자물쇠를 잠그고 집을 나선다.");
 }
}

 

 

package aop001;

public class Girl {
 public void housework() {
  System.out.println("열쇠로 문을 열고 집에 들어간다.");
  
  try {
   System.out.println("요리를 한다.");
  } catch (Exception ex) {
   if(ex.getMessage().equals("집에 불남")) {
    System.out.println("119 에 신고한다.");
   }   
  } finally {
   System.out.println("소등하고 잔다.");
  }
  
  System.out.println("자물쇠를 잠그고 집을 나선다.");
 }
}

 

 

package aop001;

public class Start {
 public static void main(String[] args) {
  Boy romeo = new Boy();
  Girl juliet = new Girl();
  
  romeo.housework();
  juliet.housework();
 }
}

 

흠흠 실행해 보도록 하죠.  실행은 어서 하시는지 당연히 아시죠. 
main 함수가 있는 곳에서 Run As > Java Application

 

자 간단하게 핵심관심사항과 횡단관심사항이라는 부분에 대해 이야기를 나누어 보았습니다.

 

시작할 때

 

스프링 DI 가 의존성(new) 에 대한 주입이라면

스프링 AOP 는 로직(code) 주입이라고 볼 수 있습니다.

 

이런게 시작했었는데요.  로직(code) 주입을 한다면 어디에 주입할 수 있을까요?

 

객체지향에서 code 가 있는 곳은 당연히 메서드 안 입니다.  그럼 메소드에서 코드를 주입할 수 있는 곳은 몇 군데 일까요?

힌트는 아래 그림에 있습니다.

 

몇 군데라고 답하셨나요?

 

5군데 입니다. Around, Before, After, AfterReturning, AfterThrowing
그림에서는 시작 전, 종료 후라고 짭게 표현했는데요.  정확하게는 시작 직후, 종료 바로 전이 맞는 표현이겠지요.

먼 훗날 책 보시고 위에 그림 보시면 조금 더 쉽게 이해하실 수 있으리라 믿어 봅니다.

 

다음 시간에는 스프링 AOP 를 통해서 어떻게 횡단관심사항을 분리해 낼 수 있는지,  분리된 횡단관심사항(로직)을 어떻게 실행 시간에 메서드에 주입한 효과를 내는지를 살펴보도록 하겠습니다.

 

그럼 주의 이름오시는 이여.. 호산나.. ^^/

반응형