본문 바로가기
Spring/스프링 퀵 스타트

‘스프링 퀵 스타트’ 정리 2일차

by 유서담 2023. 7. 23.

스프링 AOP

비즈니스 컴포넌트 개발에서 가장 중요한 원칙은 낮은 결합도와 높은 응집도를 유지하는 것.

 

스프링의 DI ( 의존성 주입 ) 을 이용하면 비즈니스 컴포넌트를 구성하는 객체들의 결합도를 떨어트릴 수 있어 의존관계를 쉽게 변경할 수 있다

 

스프링의 IoC는 결합도와 관련된 기능

AOP( Aspect Oriented Programming )는 응집도와 관련된 기능

AOP에서 가장 중요한 핵심은 관심분리 (Separation of Concerns)

AOP에서는 메소드마다 공통으로 등장하는 로깅, 예외, 트랜잭션 처리 같은 코드들을 횡단관심 ( Crosscutting Concerns).

사용자의 요청에 따라 실제로 수행되는 핵심 비즈니스 로직을 핵심 관심( Core Concerns).

 

OOP처럼 모듈화가 뛰어난 언어를 사용하여 개발하더라도 공통모듈에 해당하는 클래스 객체를 생성하고 공통 메소드를 호출하는 코드가 비즈니스 메소드에 있다면 핵심관심과 횡단관심을 완벽하게 분리할 수는 없다

 

하지만 스프링의 AOP는 OOP의 이런 한계를 넘을 수 있게 도와준다.

 

스프링의 AOP는 클라이언트가 핵심관심에 해당하는 비즈니스 메소드를 호출할 때, 횡단관심에 해당하는 메소드를 적절하게 실행해준다. 이 때 핵심관심 메소드와 횡단관심 메소드 사이에서 소스상의 결합은 발생하지 않는다

 

이것이 AOP를 사용하는 주된 목적

AOP용어

Joinpoint ( 조인포인트 ) : 클라이언트가 호출하는 모든 비즈니스 메소드.

 

Pointcut ( 포인트컷 ) : 클라이언트가 호출하는 모든 비즈니스 메소드가 조인포인트라면, 포인트컷은 필터링된 조인포인트

     포인트컷을 사용하는 이유 : 비즈니스 메소드 중에서 우리가 원하는 특정 메소드에서만 횡단관심에 해당하는 공통기능을 수행시키기 위해서

 

Advice ( 어드바이스 ) : 횡단관심에 해당하는 공통기능의 코드. 독립된 클래스의 메소드로 작성

    어드바이스로 구현된 메소드가 언제 동작할 지 스프링 설정 파일을 통해 지정가능

    어드바이스 동작시점에 따라서 before, after, after-returning, after-throwing, around 로 나뉘어짐

 

Weaving (위빙) : 포인트컷으로 정된 핵심관심 메소드가 호출될 때, 어드바이스에 해당하는 횡단관심 메소드가 삽입되는 과정.

    위빙을 통해서 비즈니스 메소드를 수정하지 않고도 횡단관심에 해당하는 기능을 추가하거나 변경이 가능하다

 

Asepect or Advisor : AOP의 핵심. 포인트컷과 어드바이스의 결하브로서 어떤 포인트컷 메소드에 대해서 어떤 어드바이스 메소드를 실행할지 결정한다.

    이 Aspect의 설정에 따라 AOP의 동작 방식이 결정되기 때문에 AOP 용어 중 가장 중요한 개념.

 

AOP 엘리먼트

<aop : config> 엘리먼트 : 루트 엘리먼트. 여러번 사용가능.

    하위에는 <aop : pointcut> , <aop : aspect> 엘리먼트가 위치할 수 있다

 

<aop : pointcut> 엘리먼트 : 포인트컷을 지정하기 위해서 사용.

     <aop : config>, <aop : aspect>의 자식 엘리먼트로 사용할 수 있다

     <aop : aspect> 하위에 설정된 포인트컷은 해당 <aop : aspect>에서만 사용이 가능하다.

    여러개 정의할 수 있고, 유일한 아이디를 할당하여 Aspect를 설정할 때 포인트컷을 참조하는 용도로 사용이 가능

 

<aop : aspect> 엘리먼트 : 핵심관심에 해당하는 포인트컷 메소드와 횡단관심에 해당하는 어드바이스 메소드를 결합하기 위해서 사용.

    Aspect를 어떻게 설정하느냐에 따라서 위빙결과가 달라지므로 AOP에서 가장 중요한 설정

 

<aop : advisor> 엘리먼트 : <aop : advisor> 엘리먼트는 포인트컷과 어드바이스를 결합한다는 점에서 Aspect와 같은 기능을 한다. 하지만 트랜젝션 설정 같은 특수한 경우는 Asepct가 아닌 어드바이저를 사용해야한다.

 

포인트컷 표현식

EX

execution ( * com.multicampus.biz. Impl . get*(..) )

리턴타입 / 패키지경로 / 클래스명 / 메소드명 매개변수

 

리턴타입 지정

* 리턴타입 허용 ( 가장 기본적인 방법 )

void 리턴타입이 void인 메소드 선택
!void 리턴타입이 void가 아닌 메소드 선택

패키지 지정 ( 패키지 경로를 지정할 때는 ‘*’ , ‘..’ 캐릭터를 이용 )

com.springbook.biz 정확하게 com.springbook.biz 패키지만 선택

com.springbook.biz.. com.springbook.biz 패키지로 시작하는 모든 패키지 선택
com.springbook..impl com.springbook 패키지로 시작하면서 마지막 패키지 이름이 impl로 끝나는 패키지 선택

클래스 지정 ( 클래스 이름을 지정할 때는 ‘*’ , ‘+’ 캐릭터를 이용한다 )

BoardServiceImpl 정확하게 BoardServiceImpl 클래스만 선택

*Impl 클래스 이름이 Impl로 끝나는 클래스만 선택
BoardService+ 클래스 이름뒤에 ‘+’가 붙으면 해당 클래스로부터 파생된 모든 자식 클래스 선택. 인터페이스 뒤에 ‘+’가 붙으면 해당 인터페이스를 구혀난 모든 클래스 선택

메소드 지정 ( 메소드 지정할땐 주로 ‘*’ 캐릭터를 사용하고 매개변수 지정할때는 ‘..’ 사용 )

*(..) 가장 기본 설정으로 모든 메소드 선택

get*(..) 메소드 이름이 get으로 시작하는 모든 메소드 선택

매개변수 지정 ( 매개변수로 지정할 때는 ‘..’ , ‘*’ 캐릭터를 사용하거나 정확한 타입 지정 )

(..) 가장 기본 설정으로서 ‘..’ 은 매개변수의 개수와 타입에 제약이 없음을 의미

(*) 반드시 1개의 매개변수를 가지는 메소드만 선택
( com.springbook.user.UserVO) 매개변수로 UserVO를 가지는 메소드만 선택. 이 때 클래스의 패키지 경로가 반드시 포함되어야 함
( !com.springbook.user.UserVO) 매개변수로 UserVO를 가지지 않는 메소드만 선택
( Integer, ..) 한 개 이상의 매개변수를 가지되, 첫 번째 매개변수의 타입이 Integer인 메소드만 선택
( Integer, *) 반드시 두 개의 매개변수를 가지되, 첫 번째 매개변수의 타입이 Integer인 메소드만 선택