티스토리 뷰

면접 질문

[면접 준비] AOP

lkh's 2019. 3. 8. 01:20

1. AOP 정의


AOP는 애플리케이션 전체에 걸쳐 사용되는 기능을 재사용할 수 있도록 지원한다. AOP는 Aspect Oriented Programming의 약자이다.

관점 지향 프로그래밍이라고 하는데, 여기서 말하는 관점은 기존에 자바를 개발했던 핵심 모듈에 대한 관점에서 부가 기능의 관점으로 바꾸어 프로그래밍을 

한다는 것이다. 하나의 애플리케이션을 개발하기 위해서는 비즈니스 로직과 비즈니스 로직을 지탱하는 인프라 로직이 필요하다.

OOP는 비즈니스 로직의 중복성 제거의 목표를 두고, AOP는 인프라 로직의 중복을 제거하는 것에 목표를 두고 있다. 


 - 비즈니스 로직 : 데이터의 상태값을 조작하는 로직 (회원가입, 회원정보 수정 ...)

 - 인프라 로직 : 데이터에 대한 저장, 변경은 하지 않으면서 성능을 높이고, 보안을 강화하기 위해처리하는 로직 (권한 체크, DB 트랜잭션, 로깅, 성능측정)


인프라 로직은 애플리케이션 모든 영역에 존재하며, 많은 중복 코드를 양산한다. 또한, 코드의 가독성과 유지보수의 효율도 낮추어준다.

예를들어, 회원정보를 관리하는 기능인 join(), modify() 메소드에 성능 측정이 필요하다고 할 때, 각 메소드에 성능 측정을 위한 로직을 추가하게 된다.

그렇게 되면 join() 메소드는 성능 측정과 가입 두가지 기능을 하게 된다. 비즈니스 로직과 인프라 로직이 공존한다. 한 가지의 역할만을 수행하지 않게 된다.

그렇기 때문에 AOP를 사용해서 인프라 로직의 중복을 제거하면 하나의 메소드는 하나의 역할만을 수행하게 되고, 비즈니스 로직에만 집중할 수 있게 된다.


 - 애플리케이션 전체 영역에 흩어진 인프라 로직에 대한 중복을 제거할 수 있고, 한 영역에서 관리 가능 → 유지보수 효율 증가 

   하나의 영역에서 관리되기 때문에 인프라 로직을 일일이 찾을 필요없이 한곳만 수정하면 전체 적용 가능

 - 해당 모듈은 자신의 비즈니스 로직에만 집중 가능


결국 OOP는 비즈니스 로직의 중복 제거, AOP는 인프라 로직의 중복을 제거하는 것이 목표이기 때문에 서로 다른 개념이 아니라 같이 혼용해서 사용해야 한다.

AOP는 비즈니스 로직과 인프라 로직을 분리하기 위해, 인프라 로직을 Aspect 모듈로 만들어서 설계하고 개발하는 방법을 의미한다.


2. AOP 용어


@Around("execution(* com.blogcode.board.BoardService.getBoards(..))")


Target (com.blogcode.board.BoardService.getBoards)

인프라 로직을 부여할 대상 (예 : 회원가입, 회원정보 수정)


Aspect

인프라 로직, 인프라 로직을 구현한 Advice와 Advice를 어느 메소드에 적용할지를 결정하는 Pointcut으로 구성


Advice (@Around)

인프라 로직을 실제로 구현한 구현체. 인프라 로직이 무엇을 하며, 어떻게 적용할지를 정의

 - @Around : Target 호출 전, 후에 Advice 수행 (중간에 process() 메소드가 존재하는데, 이 메소드는 Target 메소드에 해당, 이 메소드 기준으로 앞뒤에서 호출)

 - @AfterThrowing : 타겟 메소드를 호출하는 과정에서 예외가 발생했을 때 Advice 호출

 - @AfterReturning : 타겟 메소드를 정상적으로 처리한 후, Advice 호출


Pointcut ("excution ... ")

인프라 로직을 부여할 메소드를 선정하는 방법. Advice를 적용할 JoinPoint를 선별하는 기능을 정의


JoinPoint

Advice가 적용될 수 있는 위치 목록. 다른 AOP 프레임워크와는 달리, Spring에서는 메소드 JoinPoint만 제공


Proxy

Target을 포장해서 타겟의 요청을 대신 받아주는 Wrapping 객체

예를들어, 클라이언트가 회원가입 메소드를 호출하면, 회원가입 메소드를 즉시 호출하는 것이 아닌, 회원가입 기능을 감싸고 있는 Proxy가 호출된다.

Proxy는 회원가입 선처리, 후처리가 있는 인프라 로직을 호출해준다.


Weaving

Target 객체에 Aspect를 적용해서 새로운 Proxy 객체를 생성하는 과정


3. AOP vs Interceptor vs 서블릿 필터


인터셉터 (Interceptor)

인터셉터란 컨트롤러에 들어오는 요청과 컨트롤러가 내보내는 응답을 가로채는 역할을 수행


서블릿 필터

서블릿과 컨테이너 사이에 존재하며, 서블릿에서 들어오고 나가는 요청, 응답을 가로채는 역할을 수행


인터셉터와 서블릿 필터의 차이는 호출되는 시점이다. 실행 시점이 다르기 때문에 예외처리도 다른 모습을 보인다.

서블릿 필터는 예외가 발생하면 웹 애플리케이션에서 처리해야 한다. 그리고 인터셉터가 예외가 발생하면 @ControllerAdvice, @ExceptionHandler를 사용한다.

인터셉터와 서블릿 필터는 서블릿 실행, 컨트롤러의 실행 시점에만 처리가 가능하다는 한계점을 가지고 있다.

만약, 애플리케이션 전체 소스 코드에 대해 Aspect를 적용하고 싶다면 AOP를 적용하자! 좀더 넓은 범위를 지원할 수 있다.


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함