[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의 용어들에 대해서 살펴볼께요.
- 어드바이스
- 조인포인트
- 포인트컷
- 애스팩트
- 인트로덕션
- 위빙
제가 이해한것을 토대로 예를 들어보면 만약 회원가입을 한다고 했을때, 어떠한 작업(커밋, 로깅, 에러처리)을 언제(커밋 = 문제없이 처리가 끝난시점, 로깅 = 회원가입 처리 메소드 호출시, 에러처리 = 회원가입도중 문제가 생겼을 경우)할지 정의된것으로 보여집니다.
여기서 '어떠한 작업'은 작업 내용에 따라 달라진다고 생각되니 패스하고, '언제'에 대해서 적어보겠습니다.
- 이전(before) : 호출하려는 메소드가 호출되기 전에 기능을 수행한다.
제생각으로는 권한체크를 할때 유용하다고 생각됩니다. 만약 관리자메뉴에 접근하려고 한다면 관리자 메뉴 호출전에 권한이 있는지 없는지를 먼저 확인해볼때 유용하지않을까요?? 굳이 권한체크가 아니더라도 게시글을 읽는데 포인트가 소모된다고 하면, 포인트가 있는지 확인하는 작업을 여기서 할수도 있을것같아요. (이게 맞나 모르겠습니다...) - 이후(after) : 결과에 상관없이 어드바이스 대상 메소드가 완료된 후에 어드바이스 기능을 수행한다.
어떠한 작업을 할때 에러가 났던, 성공적으로 마쳤던 해당 메소드가 끝났을 경우 수행되는 부분이라고 합니다. 어거지로 예를하나 들자면, 메소드가 성공 또는 실패 후에 해당 결과에 관한 로그를 남긴 뒤에, 해당메소드가 끝났다는것을 로그에 남길수있겠죠. - 반환 이 후(after-returning) : 어드바이스 대상 메소드가 성공적으로 완료된 후에 기능을 수행한다.
만약 회원가입을 한다고 할 경우, 회원가입이 정상적으로 완료된 후에 커밋하는 부분을 구현하면 될것같아요. - 예외 발생 이후(after-throwing) : 어드바이스 대상 메소드가 예외를 던진 후에 어드바이스 기능을 수행한다.
회원가입을 진행하는데 하나의 테이블에만 추가하라는 법은 없습니다. 각 테이블들에 정보를 순차적으로 추가하다가(중복되는 데이터 말구요ㅠㅠ) 중간에 예외상황이 생겨서 정상적으로 마치지 못할경우 이 정보들을 롤백하는 부분을 구현하면 될거같아요. - 주위(around) : 어드바이스가 대상메소드를 감싸서 호출 전/후에 기능을 수행한다.
1번과 2번을 합쳐놓은 느낌인거같아요. 이해가 잘 가지 않아서 다른글도 살펴보다가 읽은것을 말씀드리면, 떄에따라 해당 메소드를 SKIP할수도 있다고합니다! 어떤 예시를 들어야 할지는 잘 모르겠지만.. 메소드 실행 전과 실행 후에 같은동작을 하는것일텐데 도대체 뭘까요.. 이해는 되는데 어디에 사용해야할지 잘 모르겠어요ㅠ
- 컴파일시 위빙
컴파일할때 알맞은 위치에 공통코드(횡단관심사를 모듈화하여 구현한 코드)를 삽입한다. - 클레스 로딩시에 위빙하기
로딩한 클래스의 바이너리 정보를 변경하여 알맞은 위치에 공통코드를 삽입한 후에 새로운 클래스 바이너리 코드를 사용하도록 한다고 한다. 원본 바이너리 코드 + 공통관심사 = 새로운 바이너리 코드 이거겠지?? - 런타임시 위빙
스프링에서 자체적으로 지원하고있는 기능이며, 1번과 2번처럼 코드를 수정하지 않고, 프록시를 사용하여 AOP를 적용한다.
객체에 직접 겁근하는것이 아니라 중간에 프록시를 생성하여 접근하는데, 프록시는 메서드의 호출에 한해서만 어드바이스를 적용할 수 있다. 위 내용중 '포인트컷'이 한정적으로 되는 이유가 이때문이 아닐까 생각된다.
뭐 원한다면 포인트컷의 영역을 늘릴수도 있겠지만!!
- http://najuung.tistory.com/category/%EC%BB%B4%ED%93%A8%ED%84%B0%20%EA%B3%B5%EB%B6%80/Spring
- http://ssad.tistory.com/50
- 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 |