FireDrago

[Spring] AOP 본문

프로그래밍/Spring

[Spring] AOP

화이용 2024. 1. 2. 12:18

Intro

 

AOP(Aspected - Oriented - programming)가 무엇이고 왜 사용하는지, 어떻게 사용하는지 작동원리까지 알아보자

 

AOP란

 

 메서드 하나를 상상해보자 회원가입된 회원을 전부 호출하고, 메서드 시작 시간과 호출이 끝난 시간의 차를 출력한다.

 또 다른 메서드는. 회원가입을 시행하고, 역시 시작시간과 끝난시간의 차이를 출력한다. 

여기서 핵심기능공통기능을 분리할 수 있다. 핵심기능은 회원호출, 회원가입 기능이고,공통기능은 실행 시간 출력 기능이다.

AOP는 공통 기능을 흩어져 있는 여러 메서드에 적용하는 기술이다.

천개의 메서드에서 실행시간 기능을 사용하더라도, AOP 를 통해, 한 곳에서 관리할 수 있다.

훨씬 더 객체지향적이고, 재사용성이 높아진다. 대표적인 AOP 기능으로 로깅, 트랜잭션관리 등이 있다.

 

※ 컴포넌트

- 재사용 가능한 '모듈'  (즉 재사용 가능한 기능의 집합)

※ 모듈

- 기능의 집합 (회원가입 모듈 : 회원정보 입력기능, 유효성검사, db중복확인, db정보입력 기능의 집합)

 

 

AOP 사용법

 

- @Aspect : 핵심기능 전,후에 공통기능 실행해야 할때 사용 (try{} finally {} 구문 사용)

   - @ After : 핵심기능 이후에 공통기능 실행 , @Before 핵심기능 전에 공통기능 실행

- @Component : 스프링 빈으로 등록

- @Around('execution( [접근제어자] [리턴타입] [클래스] [메서드] [파라미터]')

   - * : 모든 접근 제어자

   - hello.hellospring.. : '..' (와일드카드) 이용하여 패키지 하위의 모든 클래스에 적용

   - * : 모든 메서드

   - (..) : 모든 파라미터

@Around('execution * hello.hellospring.member.join(String)')

hellospring 패키지의 member클래스의 String을 파라미터로 가지는 join 메서드에만 적용

 

- joinPoint.proceed() : 핵심기능 호출

 

 

AOP 작동원리

 

 

1. 스프링은 AOP 기능을 스프링 컨테이너에 빈으로 등록한다.

2. AOP가 적용되는 객체의 Proxy 객체를 생성한다. proxy 객체에서 AOP를 실행하고

    joinPoint.proceed() 를 통해 원래 객체의 기능을 실행한다.

 

※ proxy 객체

- 핵심기능 호출 전,후에 공통기능을 호출하는 객체

- 프록시 객체를 생성할 수 있는 이유는 스프링컨테이너에서 스프링 빈을 관리하는 스프링의 특성 덕분이다.

 

이 글은 인프런 김영한님의 스프링 입문 강의를 바탕으로 작성했습니다.