프록시 패턴과 AOP에 대해 연관성

2025. 5. 25. 11:45·Spring

프록시 패턴을 설명하기 전에 AOP 에 대해 먼저 설명을 해야할 것 같다.

AOP 란 (Aspect-Oriented Programming)  '관점 지향 프로그래밍'으로, 객체지향 프로그래핑(OOP)를 보완하는 새로운 프로그래밍 패러다임이다. 소프트웨어에 흩어져 나타나는 공통적인 관심사들을 Aspect 라는 별도의 모듈로 분리하여 관리함으로써, 모듈성을 높이는 것을 목표로 한다.

 

예를 들어 로깅, 트랜잭션, 보안 같은 기능들은 여러 모듈에서 공통적으로 필요하다. OOP(객체지향 프로그래밍)에서는 이러한 기능들을 각 모듈에 중복으로 구현하거나, 상속을 통해 처리해야 할 수 있는데, 이는 코드의 중복과 복잡성을 증가시킨다.

(여기서 모듈은 패키지나 클래스의 집합과 같이 특정 기능 단위로 묶어놓은 소프트웨어 구성 요소를 의미함)

 

AOP는 이러한 관심사들을 핵심 비즈니스 로직과 분리하여 독립적으로 개발하고, 필요한 곳에 적용함으로써 코드의 유지보수성과 재사용성을 향상 시킨다.

 

AOP의 주요 개념

  • Aspect (애스펙트): 여러 모듈에 걸쳐 나타나는 공통 관심사(로깅, 보안 등)를 모듈화한 것
  • Join Point (조인 포인트): 애스펙트가 적용될 수 있는 프로그램 실행 지점(메서드 호출, 예외 발생 등)을 의미함
  • Advice (어드바이스): 조인 포인트에서 애스펙트가 수행할 실제 동작 코드임. (예: 메서드 실행 전/후에 로깅을 수행하는 코드)
  • Pointcut (포인트컷): 특정 애드바이스가 적용될 조인 포인트들의 집합을 정의하는 표현식.
  • Weaving (위빙): 애스펙트가 핵심 코드에 삽입되는 과정. 컴파일 시점, 클래스 로드 시점 또는 런타임에 이루어질 수 있음. Spring AOP는 대부분 런타임 위빙을 사용하며, 주로 프록시 기반으로 동작함.

이제 프록시 패턴에 대해 알아보자.

프록시는 클라이언트와 서버 사이의 중간 다리 역할이다.

 

프록시(Proxy)는 대리인 또는 대신하는 것 이라는 의미를 가진다. 프록시 패턴은 다른 객체(실제 객체)에 대한 접근을 제어하는 중간자 역할을 하는 디자인 패턴이다. 클라이언트가 실제 객체를 직접 호출하는 대신, 프록시 객체를 통해 실제 객체에 접근하게 한다.

이 프록시 객체는 실제 객체에 대한 호출을 가로채어, 호출 전이나 특정 작업을 추가적으로 수행할 수 있다. 

 

특징 및 사용 목적

  • 접근 제어: 실제 객체에 대한 접근을 제한하거나 특정 조건을 만족할 때만 접근을 허용함.
  • 지연 초기화(Lazy Initialization): 실제 객체가 필요한 시점까지 객체 생성을 미루어 자원을 절약함. 예를 들어, 대용량 이미지나 비디오 파일을 미리 로딩하는 대신, 사용자가 실제로 볼 때 로딩을 시작하는 경우에 사용됨.
  • 부가 기능 추가: 로깅, 캐싱, 트랜잭션 관리, 보안 등 핵심 비즈니스 로직과 관련 없는 부가적인 기능을 실제 객체에 영향을 주지 않고 추가함.
  • 원격 객체 제어: 원격 서버에 있는 객체에 대한 로컬 프록시를 제공하여 원격 객체와의 통신을 단순화함.

장점

  • OCP(개방-폐쇄 원칙) 준수: 기존 코드를 변경하지 않고 새로운 기능을 추가할 수 있음.
  • SRP(단일 책임 원칙) 준수: 실제 객체는 본연의 책임만 가지게 하고, 부가적인 책임은 프록시에게 위임할 수 있음.
  • 유연성: 다양한 용도로 활용될 수 있으며, 실제 객체의 초기화 지연이나 기능 추가에 유용함.

단점

  • 코드 복잡도 증가: 프록시 객체가 추가되면서 코드 구조가 복잡해질 수 있음.
  • 성능 저하: 프록시를 거치면서 오버헤드가 발생할 수 있음.

예시

  • 캐싱 프록시: 데이터를 한 번 가져온 후 임시로 저장해 두었다가, 같은 요청이 오면 저장된 데이터를 반환하여 성능을 향상시킴
  • 보호 프록시: 사용자 권한에 따라 특정 객체에 대한 접근을 허용하거나 거부함.
  • 가상 프록시: 실제 객체를 필요할 때만 생성하여 메모리 사용량을 최적화함.

그렇다면 프록시와 AOP 는 어떤 연관이 있을까? 둘이 연관이 있는 가장 큰 이유는 우리가 사용하는 스프링 프레임워크 때문이다.

Spring AOP 는 프록시 패턴을 기반으로 AOP 기능을 구현한다. Spring AOP 는 개발자가 정의한 애스펙트(공통된 모듈)를 적용하기 위해, 런타임에 동적으로 프록시 객체를 생성한다. 이 프록시 객체가 클라이언트의 요청을 가로채고, 정의된 부가 기능을 실행한 다음, 실제 우리가 만든 객체의 메소드를 호출하는 방식으로 동작한다.

 

즉 프록시 패턴은 AOP 를 구현하기 위한 하나의 기술적인 방법이라 볼 수 있다. 프록시 패턴은 특정 객체에 대한 접근 제어에 초점을 맞춘 디자인 패턴이고, AOP 는 횡단 관심사의 분리라는 프로그래밍 패러다임을 달성하기 위한 방버론이며, 이때 프록시 패턴이 효과적인 구현 도구로 사용될 수 있다.

 

보다 확실한 예시를 보기 위해 Spring 에서 aop 가 프록시 패턴을 사용하는 방식을 찾아봤다.

 

 

  • 기존 코드 수정 없이 기능 추가 (OCP 준수): 핵심 비즈니스 로직이 담긴 실제 Bean 클래스를 전혀 수정하지 않고도, 로깅, 트랜잭션 같은 횡단 관심사를 적용할 수 있다. 이는 개방-폐쇄 원칙(OCP)을 강력하게 준수하게 해준다.
  • 런타임 적용: Spring AOP는 주로 런타임에 프록시를 생성하여 AOP를 적용한다. 이는 애플리케이션 시작 시점에 동적으로 AOP를 구성할 수 있게 하여 유연성을 높인다. (반면 AspectJ와 같은 다른 AOP 프레임워크는 컴파일 시점이나 로드 타임 위빙을 사용하기도 한다.)
  • Spring IoC 컨테이너와의 통합: Spring의 핵심인 IoC 컨테이너가 Bean을 관리하는 과정에서 자연스럽게 프록시를 생성하고 주입할 수 있도록 설계되었다. 개발자가 명시적으로 프록시를 만들고 관리할 필요 없이, 설정만으로 AOP를 적용할 수 있게 해준다.

 

결론적으로, 프록시 패턴은 Spring AOP 가 관심사를 핵심 비즈니스 로직과 분리하여 적용하는 기술적인 메커니즘을 제공하낟.

AOP 라는 개념을 실현하기 위한 도구로 프로깃 패턴이 사용된다고 이해하면 된다.

 

'Spring' 카테고리의 다른 글

Maven과 Gradle의 역할과 기능은 무엇일까?  (0) 2025.05.29
[Spring] @SpringBootApplication 은 어떤 역할을 할까?  (0) 2025.05.26
[Java] Dependency Injection에 대해서, 그리고 왜 사용할까?  (0) 2025.05.21
[Spring] Spring 프레임워크란 무엇일까?  (2) 2025.05.20
[Spring] ResponseEntity 와 RESTful API 설계에 대해  (0) 2025.05.19
'Spring' 카테고리의 다른 글
  • Maven과 Gradle의 역할과 기능은 무엇일까?
  • [Spring] @SpringBootApplication 은 어떤 역할을 할까?
  • [Java] Dependency Injection에 대해서, 그리고 왜 사용할까?
  • [Spring] Spring 프레임워크란 무엇일까?
동준1234
동준1234
공부 기록
  • 동준1234
    dongjundev
    동준1234
  • 전체
    오늘
    어제
  • GitHub
    • 분류 전체보기 (150)
      • 일상 (1)
      • 복습 및 회고록 (26)
      • Spring (17)
      • JAVA (32)
      • kubernetes (1)
      • Front-End (13)
      • Server (11)
      • SQL (20)
        • JDBC (1)
      • 자격증 (7)
        • 정보처리기사 필기 준비 (6)
        • 정보처리기사 실기 준비 (0)
        • SQLD (1)
      • project (18)
        • 백준 및 코딩테스트 공부 (6)
        • 대학교 캡스톤 디자인 (6)
        • 4학년 캡스톤 디자인 및 전시회 (3)
      • 네트워크 (3)
      • AI 머신러닝 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    JavaScript
    개발자
    jQuery
    프론트
    react
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
동준1234
프록시 패턴과 AOP에 대해 연관성
상단으로

티스토리툴바