'AOP란'에 해당되는 글 1건

  1. 2015.08.23 [Spring] 01. Spring AOP

[Spring] 01. Spring AOP

개발공부/Spring 2015. 8. 23. 16:19

안녕하세요~ 오늘은 Spring에 관해서 적어볼까 해요!!

Spring은 저도 공부하는중이라서 '다른'게 아니라 '틀릴'수도 있어요!!

참고는 하시되 너무 맹신하지 마시고, 저역시 알려드리는게 아닌 공부하는것이니 틀린부분이 있으면 지적 부탁드립니다!!


오늘부터 스프링으로 프로젝트를 만들어보려고 이것저것 찾아봤습니다.

사실 다른분들 블로그나 개발예제 같은거 주로 보고 나름대로 다시 정리하는겁니다 ㅋㅋㅋ

나중에 제가 잊어버리면 다시보기위해서 말이죠 ㅋㅋㅋ


저는 처음에 Spring의 개념을 잡기위해 'Spring 개념'으로 검색을 하다가 AOP에 대한글을 먼저 읽었습니다.

그러므로 오늘은 AOP를 이야기해보도록 할께요.


1. AOP란?


Aspect Oriented Programming의 약자라고 합니다.

저는 영어를 못해서 이게 뭔소린지 알아먹지 못하기때문에, 구글번역기를 돌려봤습니다.


이거래요. 뭐 구글님이 이거라고하시니 이게 맞을껍니다.

'관점 지향 프로그래밍' 이라고 합니다. 다른분이 블로깅하신 글을 보면


AOP는 '어플리케이션을 다양한 관점으로 분해하여 객체지향에서 추구하는 모듈화를 더욱 잘 지원하도록 하는 프로그래밍 기법'

이라고 설명해 주셨네요. 자 여기서 다른건 좀 알아먹겠는데, '다양한 관점' 이라는말이 도대체 무슨말인지 이해가 되지 않아요ㅠ

다양한 관점이란 무엇을 말하는것인지 알수가없으니 좀더 알아보겠습니다.


'다양한 관점'에는 두가지 관점이 있다고 합니다. '핵심관심사'에대한 관점과, '횡단관심사'에대한 관점이죠.

제가 읽어보고 이해한 바로 적어놓겠습니다.



핵심관심사

'각 모듈마다 수행되는 기본적이고 대표적인 기능' 이렇게 적혀있습니다.

말그대로 제가 작성한 모듈이 해야하는 일 자체를 '핵심관심사' 라고 부르는거같습니다.


횡단관심사

'여러개의 모듈에 걸치는 시스템의 부가적인 업무' 이렇게 적혀있습니다.

이것만 들어서는 도대체 무슨말인지 잘 와닿지 않았습니다. 그러나 친절하게 아래 예를 적어주셔서 좀 나았어요.

ex : 로깅, 사용자 인증, 성능 관리

예시를 보니 어플리케이션이 운영되는 전반에 걸쳐서 사용자에게 편의를 주기보다, 사용자를 컨트롤(사용자 인증, 사용자별 권한)하고 어플리케이션의 자체를 관리(로깅, 성능, 트랜잭션)하는 부분을 의미하는 것 같습니다.


아래 제가 참고한 사이트의 출처를 적어놓았습니다.

들어가보시면 이미지도 있어요!! 참고해보시면 좋을거같습니다.

출처 : http://blog.naver.com/dworyu/100028862065


2. AOP의 목적 및 장점


AOP의 시작은 '중복을 줄여서 조금만 수정해도 프로젝트 전체의 변화를 줄수있도록 하자!!' 로 출발했다고 합니다.

위에서 설명한 '두가지 관점'들을 생각하고 관점을 분리하여 작업한다고 하는데 실제로 프로젝트 셋팅 및 개발에 들어가기 전까지는 크게 와닿지 않을것으로 생각됩니다....ㅠㅠ 일단은 그러한 개념이 있고, 그걸 기반으로 한다는 부분이 중요하다고 생각되니 기억해 두는걸로 만족해야겠습니다!! 개발작업에 들어가면서도 이해가 안되면 다시 읽어보고 더 찾아봐야겠어요!!(설마 그러겠어? 라고 생각은되지만 설마가 사람잡는다 고 진짜 그럴거가은 느낌적인 느낌...ㅋㅋ)


장점으로는

  • 중복되는 코드 제거
  • 효율적인 유지보수
  • 높은 생산성
  • 재활용성의 극대화
  • 변화수용에 용의하다
라고 적혀있지만... 거의 모든사람들이 이런것을 추구하지 않을까 하는 생각이 들어요. 뭔가 개발자들이 '이랬으면 좋겠어!!' 한걸 모아놓은 느낌이랄까... 감사합니다ㅠ 정말 이러면 너무좋지요ㅠ 과연 저는 저장점들을 얼마나 살리면서 작업이 가능할까요..ㅋㅋ



3. AOP 용어


이번엔 AOP의 용어들에 대해서 살펴볼께요.

  1. 어드바이스
  2. 조인포인트
  3. 포인트컷
  4. 애스팩트
  5. 인트로덕션
  6. 위빙
순으로 읽고 작성해보겠습니다.

어드바이스
어떠한 작업을 언제할지 정의한것을 어드바이스라고 한다고 합니다.

제가 이해한것을 토대로 예를 들어보면 만약 회원가입을 한다고 했을때, 어떠한 작업(커밋, 로깅, 에러처리)을 언제(커밋 = 문제없이 처리가 끝난시점, 로깅 = 회원가입 처리 메소드 호출시, 에러처리 = 회원가입도중 문제가 생겼을 경우)할지 정의된것으로 보여집니다.


여기서 '어떠한 작업'은 작업 내용에 따라 달라진다고 생각되니 패스하고, '언제'에 대해서 적어보겠습니다.


  1. 이전(before) : 호출하려는 메소드가 호출되기 전에 기능을 수행한다.
    제생각으로는 권한체크를 할때 유용하다고 생각됩니다. 만약 관리자메뉴에 접근하려고 한다면 관리자 메뉴 호출전에 권한이 있는지 없는지를 먼저 확인해볼때 유용하지않을까요?? 굳이 권한체크가 아니더라도 게시글을 읽는데 포인트가 소모된다고 하면, 포인트가 있는지 확인하는 작업을 여기서 할수도 있을것같아요. (이게 맞나 모르겠습니다...)

  2. 이후(after) : 결과에 상관없이 어드바이스 대상 메소드가 완료된 후에 어드바이스 기능을 수행한다.
    어떠한 작업을 할때 에러가 났던, 성공적으로 마쳤던 해당 메소드가 끝났을 경우 수행되는 부분이라고 합니다. 어거지로 예를하나 들자면, 메소드가 성공 또는 실패 후에 해당 결과에 관한 로그를 남긴 뒤에, 해당메소드가 끝났다는것을 로그에 남길수있겠죠.

  3. 반환 이 후(after-returning) : 어드바이스 대상 메소드가 성공적으로 완료된 후에 기능을 수행한다.
    만약 회원가입을 한다고 할 경우, 회원가입이 정상적으로 완료된 후에 커밋하는 부분을 구현하면 될것같아요.

  4. 예외 발생 이후(after-throwing) : 어드바이스 대상 메소드가 예외를 던진 후에 어드바이스 기능을 수행한다.
    회원가입을 진행하는데 하나의 테이블에만 추가하라는 법은 없습니다. 각 테이블들에 정보를 순차적으로 추가하다가(중복되는 데이터 말구요ㅠㅠ) 중간에 예외상황이 생겨서 정상적으로 마치지 못할경우 이 정보들을 롤백하는 부분을 구현하면 될거같아요.

  5. 주위(around) : 어드바이스가 대상메소드를 감싸서 호출 전/후에 기능을 수행한다.
    1번과 2번을 합쳐놓은 느낌인거같아요. 이해가 잘 가지 않아서 다른글도 살펴보다가 읽은것을 말씀드리면, 떄에따라 해당 메소드를 SKIP할수도 있다고합니다! 어떤 예시를 들어야 할지는 잘 모르겠지만.. 메소드 실행 전과 실행 후에 같은동작을 하는것일텐데 도대체 뭘까요.. 이해는 되는데 어디에 사용해야할지 잘 모르겠어요ㅠ

조인포인트
어드바이스를 적용할 수 있는 포인트를 의미한다고 합니다.
어드바이스를 적용하는 포인트라고 합니다. 스프링에서는 메소드 호출에 한해서만 조인포인트를 지원한다고 합니다!
어드바이스의 '언제'와 상당히 비슷해보이는데 맞는지 모르겠네요.. 써보면 개념이 좀 잡힐거같아요!

포인트컷
어드바이스의 조인포인트 영역을 좁혀주는 역할을 한다고 합니다.
스프링에서는 메소드 호출에 한해서만 조인포인트를 지원한다고 위에서 말씀드렸는데... 더이상 영역을 좁힐수있나요??
스프링에만 관해서 한정적으로 생각해서 그런거같긴한데....
일단! 스프링을 기준으로 작성하겠습니다!

애스팩트
어드바이스와 포인트컷을 결합한 형태로 어디에서 언제 무엇을할지 정의한 것이라고 합니다.
애스팩트와 포인트컷을 결합하여 작업한 형태의 예로 위에서 적은 횡단관심사를 예로들고 있네요.
예를들어 로그를 작성한다고 하면, 어드바이스 하는 메소드 내에서(어디에서) 메소드 호출시(언제) 로그를 작성(무엇을) 하는것을 애스팩트 라고 하는것같아요.

인트로덕션
기존의 코드를 수정하지 않고, 해당 클레스에 새로운 메소드 및 맴버변수를 추가하는 기능이라고 합니다.
이건 딱 이렇다라고 개념만 잡는게 정신건강에 좋을거같아요..
예제소스는 다른분 블로그를 보기는걸 추천합니다ㅠ

저는 http://www.javajigi.net/pages/viewpage.action?pageId=1084 여기서 설명 및 소스를 보고 이해했어요!!

위빙
어드바이스를 적용하는 것을 말한다고 합니다.
그런데 애스팩트가 어드바이스 + 포인트컷이면 애스팩트를 적용하는것이 맞는건 아닌가 하는 생각이 들어요.
일단 '횡단관심사'를 적용하는 것이라고 이해하는게 좋을거같아요.

위빙의 방식에는 3가지가 있다고 합니다.
  1. 컴파일시 위빙
    컴파일할때 알맞은 위치에 공통코드(횡단관심사를 모듈화하여 구현한 코드)를 삽입한다.

  2. 클레스 로딩시에 위빙하기
    로딩한 클래스의 바이너리 정보를 변경하여 알맞은 위치에 공통코드를 삽입한 후에 새로운 클래스 바이너리 코드를 사용하도록 한다고 한다. 원본 바이너리 코드 + 공통관심사 = 새로운 바이너리 코드 이거겠지??

  3. 런타임시 위빙
    스프링에서 자체적으로 지원하고있는 기능이며, 1번과 2번처럼 코드를 수정하지 않고, 프록시를 사용하여 AOP를 적용한다.
    객체에 직접 겁근하는것이 아니라 중간에 프록시를 생성하여 접근하는데, 프록시는 메서드의 호출에 한해서만 어드바이스를 적용할 수 있다. 위 내용중 '포인트컷'이 한정적으로 되는 이유가 이때문이 아닐까 생각된다.
    뭐 원한다면 포인트컷의 영역을 늘릴수도 있겠지만!!


참고
  1. http://najuung.tistory.com/category/%EC%BB%B4%ED%93%A8%ED%84%B0%20%EA%B3%B5%EB%B6%80/Spring
  2. http://ssad.tistory.com/50
  3. http://blog.naver.com/andwise/220144147253


'개발공부 > Spring' 카테고리의 다른 글

[Spring] err-02. spring 한글 깨짐  (0) 2015.09.13
[Spring] err-01. @Autowired  (0) 2015.09.13
[Spring] 04. Spring + tiles 설정  (28) 2015.09.09
[Spring] 03. Spring 프로젝트 생성  (7) 2015.08.25
[Spring] 02. Spring 플러그인 추가  (0) 2015.08.24
: