본문 바로가기
Web/Spring

[Spring] AOP (feat. Proxy Pattern)

by 희조당 2022. 9. 21.
728x90

✍️ 학습 목표

  • AOP 이해하기
  • 프록시 패턴이란?

📌 AOP

Spring의 핵심 전략 중 하나인 AOP는 Aspect Oriented Programming의 약자이다.

AOP은 횡단 관심사의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다.

위키백과에서 가져온 정의는 역시 전혀 와닿지 않는다. 그림으로 이해해보자.

 

🧷 Before AOP

위 그림을 보면 각 클래스들은 중복되는 부분을 가지고 있다.

이렇게 구현하면 A 클래스에 구현된 주황색 코드를 수정하게 된다면 클래스 B, C에 구현된 모든 코드를 수정해야 한다.

당연히 중복된 모든 코드를 수정하기 힘들 것이고 나아가 유지보수도 힘들 것이다.

🧷 After AOP

AOP를 적용하게 된다면 다음과 같이 중복된 코드를 모듈화하여 하나의 컴포넌트로 관리할 수 있다.

중복된 코드의 관리가 당연히 쉬워질 것이다.

 

정리하면, 관점 지향 프로그래밍(AOP)은 중복된 코드(흩어진 관심사)를 모듈화 시키는 프로그래밍 기법이다.

즉, AOP는 스프링의 핵심 전략인 "비지니스 로직에 집중" 을 지킬 수 있도록 해주는 것이다.

✔️ AOP, OOP

처음에 AOP에 대해서 공부할 때 머릿속에 존재하는 익숙한 개념 때문에 전혀 이해가지 않았다. 

바로 객체지향 프로그래밍이다. 둘의 차이를 잡고 넘어가야 한다.

 

먼저 선수를 치자면, AOP는 OOP를 OOP답게 만들어 준다. 상호 대체 가능한 개념이 아니다.

위 그림에서 횡단관심이 AOP의 초점 즉, 흩어져있는 관심사(Aspect)이다.

객체지향 설계로 반복되는 코드를 많이 줄일 수 있지만 아예 없앨 수는 없다.

AOP는 없앨 수 없는 이 반복되는 코드에 초점을 둔 것이다.

OOP로 반복되는 핵심 로직들을 구현하면, AOP로는 그 외에 반복되는 부가 기능들을 구현하는 것이다.

이렇게 AOP를 사용하면 재활용성을 극대화하고, 변화에 유연한 개발을 가능하게 한다.


 📌Proxy Pattern

스프링의 AOP는 프록시 패턴을 사용하기 때문에 프록시 패턴에 대한 이해는 필수적이다.

프록시 패턴이란?? 어떤 객체의 특정 동작을 대신 수행하는 또 다른 객체를 제공하는 패턴이다.

Proxy의 사전적 정의 "대리자" 에서 유래되었다.

 

1️⃣ 왜 필요할까?

엄청 많은 자원을 요구하는 객체가 있다. 이 객체를 매번 부를 수 없기 때문에 정말 필요할 때 부르고 싶다.

보통 이럴 때 지연 처리를 사용하지만, 구현하자니 힘들고 코드를 빌려오자니 오픈 소스가 아닐 수도 있다.

이런 객체 접근 문제 등을 Proxy로 해결할 수 있다. 

 

2️⃣ 어떻게 문제를 해결할까?

기존 서비스들을 가지고 있는 프록시 객체를 만들어 모든 요청을 프록시가 전달받게 한다.

그리고 프록시가 요청을 받으면 진짜 서비스 객체를 만들어 모든 작업들을 위임한다.

 

3️⃣ 무엇이 좋을까?

프록시를 사용하면 작업 이전이나 이후에 요청받은 작업을 작업 대상을 변경하지 않고 수행할 수 있다.

즉, 필요한 객체가 메모리에 없어도 참조와 설정을 할 수 있고, 정말 필요할 때까지 객체의 생성을 미룰 수 있다. 

우리가 원하는 시점에 사용할 수 있도록 흐름을 제어해준다는 말이다.😋😋

 

4️⃣ 완벽 예시

프록시 패턴의 완벽한 예시

현금과 카드로 프록시 패턴을 이해해보자.

현금은 결제할 때 외엔 사용하지도 않으면서 들고 다니긴 불편하고, 강도의 위험도 존재한다.

반면에 카드는 안전하고 들고 다니기에 부담이 없으며 현금 대신 사용할 수 있다. 

 

ㅘ..! 현금은 딱 많은 자원을 요구하는 객체다. 

이렇게 카드 즉, 프록시를 사용하면 문제들을 해결할 수 있고 편하게 내 돈(자원)을 사용할 수 있게 된다.

 

물론~ 카드를 발급하는 과정 즉, 코드를 짜는 과정이 복잡할 수도 있다는 점이 단점이겠다.😋😋


- Reference

https://uuukpyo.tistory.com/10

https://refactoring.guru/design-patterns/proxy

'Web > Spring' 카테고리의 다른 글

[토비의 스프링] 테스트 (2장)  (0) 2023.01.16
[토비의 스프링] 오브젝트와 의존관계 (1장)  (0) 2022.12.21
[Spring] Servlet, 서블릿  (0) 2022.09.15
[Spring] Spring의 MVC  (0) 2022.09.14
[Spring] Spring의 DB 접근 기술  (0) 2022.08.23

댓글