• 스프링 퀵 스타트 2일차

    2017. 10. 11. 22:59

    by. 위지원

    즐거운 연휴를 보내고 후후후 2일차 시작


    비즈니스 컴포넌트 개발은 낮은 결합도와 높은 응집도를 유지해야한다.


    -스프링 IoC(Lnversion of Control) _제어의 역전 은 프로그램의 제어 흐름 구조가 바뀌는것으로 는 결합도 와 관련된 기능이다.

    -스프링 AOP(Aspect Oriented Programming) _ 관점 지향 프로그래밍은 상황중심 프로그래밍이라고도 하며 응집도와 관련된 기능이다.


    엔터프라이즈[각주:1] 어플리케이션의 메서드들은 대부분 복잡한 코드로 이루어져있는데 이는 핵심 비즈니스 로직은 몇줄밖에 안되고 나머지는 부가적인 코드이다.

    이런 부가적인 코드는 반복되는 경우가 많은데 이를 효율적으로 관리하는데에 주목해야한다.


    AOP에서 관심 분리(Separation of Concerns)는


    -횡단 관심(Crosscutting Concerns)는 AOP에서 메서드마다 공통으로 등장하는 부가적인 코드(예외,트랜잭션처리)를 말한다.

    -핵심 관심(Core Concerns)는 사용자에 요청에 따라 실제로 수행되는 핵심


    하지만 기존 OOP(Object Oriented Programming)코드는 이를 완벽하게 분리해내기가 힘들다.왜냐하면,예를들어


    ⓒLogAdvice 내에 ⓜpringLog 가 있다고 하자.

    ⓒBoardService에서 ⓜpringLog를 사용하면 수정하고자할때 ⓒLogAdvice를 수정하면 되니 편리해진다.그럼 두 클래스는 강하게 결합이 되어져버린다....넘나 끈끈한 우정인것..ⓒLog4jAdvic라는 클래스를 작성해서 ⓒBoardService에서 사용한다고 해보자. 그러면 또 ⓒLogAdvice기준으로 작성되었던 코드를 다~ 수정해야하는것이다 땋씨- ㅜ_ㅜ 그래서 이를 AOP가 해결해줄것이다.



    사용하기


    1.AOP는 이런점을 해결할 수 있도록 도와준다.AOP를 사용하기 위해서는  aspectj 디펜던시를 추가 해줘야한다.


    <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.10</version>
    </dependency>



    2.spring 설정파일 작성


    2-1.아래 spring  설정파일에서 namespace의 aop 네임 스페이스를 추가한다.



    2-2.aop관련 설정을 해준다.



    이렇게하면 LogAdvice를 Log4jAdvi경로로만 변경해주면 되는것이다! 오호오호오호 (*-_-*)


    여기서 expression에 해당하는 value가 무슨 의미인가 하니

    com.springbook.biz 패키지로 시작하는 클래스들 중에서 이름이 Impl로 끝나는 모든 메서드를 포인트 컷으로 설정한다는 의미이다.



    1.리턴타입

    -*

    -void

    -!void

    2.패키지 경로

    -패키지..: 패키지로 시작하는 모든 패키지 선택

    -패키지..Impl : 패키지로 시작하면서 끝이 Impl로 끝나는 패키지 선택


    3.클래스

    -*클래스명 : 클래스명으로 끝나는 클래스

    -클래스명+ : 해당 클래스로부터 파생된 클래스 또는 인터페이스를 구현한 모든 클래스


    4.메서드

    -*(..) : 모든 메서드 선택

    -get*(..) : get으로 시작하는 메서드


    5.매개변수

    -(..): 개수 타입 제약 없음

    -(*): 반드시 1개의 매개변수만 가지는 메서드

    -(com.sprigbook.user.UserVo) : UserVo를 메서드로 가짐 * 클래스의 패키지경로가 무조건 포함되어야함!

    -(!com.sprigbook.user.UserVo) : 안가지는것

    -(Integer,..) : 한개이상의 매개변수를 가지되 첫번째는 정수형

    -(Integer,*) : 반드시 두개의 매개변수를 가지되 첫번째는 정수형



    AOP 용어 및 기본정리


    1.조인 포인트(join point)

    -클라이언트가 호출하는 모든 비즈니스 메서드

    -조인포인트 메서드

    1.Signature getSignature() : 클라이언트가 호출한 메서드의 시그니처(리턴타입,이름,매개변수)정보다 저장된 시그니처 객체

    -리턴된 시그니처가 제공하는 메서드는

    1.getName : 메서드 이름만

    2.toLongString : 모오든 정보

    3.toShortString : 시그니처를 축약한 문자열

    2.Object getTarget() : 클라이언트가 호출한 비즈니스 메서드를 포함하는 비즈니스 객체

    3.Object[] getArgs() : 클라이언트가 메서드를 호출할때 넘겨준 인자목록을 오브젝트 배열로 리턴



    2.포인트컷(point cut)

    필터링 된 조인 포인트 아래와같이 추가하면 된다. 후에 아이디로 참조



    getPintcut의 의미는 com.springbook.biz 패키지로 시작하는 클래스들 중에서 get으로 시작하는 메서드만 포인트 컷으로 설정한다는 의미이다.


    3.어드바이스(Advice)

    횡단 관심에 해당하는 공통 기능의 코드로 독립된 클래스의 메서드로 작성됨



    어드바이스의 동작 시점을 정해줄 수 있다.

    before,after,after-returning,atfer-throwing,around의 5가지가 있다.

    -before:비즈니스 메서드가 실행되기 전

    -after : 예외 발생 여부없이 무조건 수행

    -atfer-returning : 비즈니스 메서드가 리턴할 결과 데이터를 다른 용도로 처리할때 사용

    -after-throwing : 비즈니스 메서드가 예외를 발생시켰을때 예외 처리로직을 제공

    -around : 사전,사후 처리를 모두 해결하고자할때 사용



    바인드 변수가 추가되었을때에는


    -returning은 <aop:atfer-returning> 엘리먼트에 returning="returnObj" 를 추가해주고

    -throwing은 <aop:after-throwing> 엘리먼트에 throwing="exceptObj"를 추가 해준다.


    -어드바이스의 시점인 Around를 구현할때에는 ProceedingJoinPoint라는 인터페이스를 상속하여 구현한다.이는 around는 다른 시점과는 다르게 proceed()메서드가 필요하기 때문이다.

    4.위빙(weaving)

    -포인트컷으로 지정한 관심 메서드가 호출 될때 어드바이스에 해당하는 횡단 관심 메서드가 삽입되는 과정

    -컴파일 타임,로딩 타임 2가지가 있지만 스프링은 런타임 위빙 방식만 지원


    5.애스팩트(Aspect) 또는 어드바이저(Advisor)

    -AOP의 철자중 Aspect에 들어가는 애스팩트는 포인트컷+어드바이스이다. 그래서 어떤 포인트컷 메서드에 대해서 어떤 어드바이스 메서드를 실행할지 결정한다.

    -또는 어드바이저라고 한것은 애스팩트 대신 어드바이저를 쓸때가 있는데 대표적으로 트랜잭션 설정에서 사용한다


    위에서 알아본 용어들을 한줄로 말해보자면


    사용자는 시스템을 사용하면서 비즈니스 컴포넌트의 여러 1.조인 포인트를 호출하게 된다.

    이때 특정 2.포인트컷으로 지정한 메서드가 호출한 순간 3.어드바이스 객체의 어드바이스 메서드가 실행(동작 시점은 지정할 수 있다)

    이 메서드가 호출될때 어드바이 메서드를 삽입하도록 하는 설정을 5.애스팩트라고 하며 이 애스팩트 설정에 따라 4.위빙이 처리된다.



    AOP엘리먼트



    위의 사진을 보고 하나씩 알아보자


    1.<aop:config> : 루트 엘리먼트이며 여러번 사용할 수 있다.

    2.<aop:pointcut> : 포인트컷을 지정하며 <aop:aspect>하위 자식으로도 사용 가능하다.

    3.<aop:aspect> : 포인트컷 메서드와 어드바이스 메서드를 결합하기 위해 사용. 애스팩트 설정에 따라 위빙이 달라지므로 가장 중요한 설정

    위의 사진으로 설명하자면 pointcut-ref로 지정된 allpointcut이 호출될 때 ref="log"로 되어있는 부분의 bean에 있는 클래스에 있는 method="pringlog" 즉 pringlog가 실행되고 그 시점은 before이다.


    4.<aop:advisor> 는 트랜잭션 처리와 같은 특수한 상황에서 사용한다. <tx:advice>라는 엘리먼트로 등록된 트랜잭션 관리 기능의 어드바이스 객체를 참조할때 사용

    <tx:advice id="txAdvice" transaction-manager="txManager">

    <aop:advisor pointcut-ref="allpointcut" advice-ref="txAdvice">


    AOP어노테이션


    -사용하기 전에 스프링 설정 파일에 <aop:aspectj-autoproxy/>를 선언 해주어야 한다.

    -bean에 등록하거나 @Service 어노테이션을 사용하여야 한다.


    1.포인트컷

    @Pointcut(execution(* com.springbook.biz..*Impl.*(..))")

    2.어드바이스

    @Before("allPointcut()")

    @AfterReturning(pointcut="getPointcut()",returning="returnObj")

    3.애스팩트

    @Aspect //반드시 포인트컷과 어드바이스가 코드내에 있어야한다.왜냐면 애스팩트 자체가 두개의 결합아니겠는가!


    1. (컴퓨터를 사용하는 조직 전체를 가르키는말) [본문으로]

    '2017년 > Spring' 카테고리의 다른 글

    스프링과 JPA연동 설정 기초  (0) 2017.10.19
    JPA 입문  (0) 2017.10.16
    스프링 퀵 스타트 1일차  (0) 2017.09.27
    tiles를 알아보자  (0) 2017.09.22
    spring xml파일 설정  (2) 2017.09.21