노트

스프링 프록시

Spring AOP Proxy

백엔드#spring · 연결된 개념 11개

쉽게 말하면

스프링 프록시는 사장님 대신 전화를 먼저 받는 비서 같아요. 호출하는 쪽은 사장님과 통화하는 줄 알지만, 비서가 앞뒤로 트랜잭션 열기·커밋 같은 일을 끼워 넣고 진짜 객체에 연결해 주죠.

비유가 깨지는 곳 비서는 밖에서 걸려 온 전화만 받아요. 같은 클래스 안에서 this.method()로 부르면 프록시를 거치지 않아서 @Transactional 같은 부가 기능이 빠져요.

스프링이 빈을 감싼 대리 객체를 대신 주입해서, 메서드 호출 앞뒤에 트랜잭션·보안 같은 부가 기능을 끼우는 방식. aop(Aspect-Oriented Programming)의 기본 구현이다.

  • @Transactional은 프록시가 호출 전에 트랜잭션을 열고, 끝나면 커밋하거나 롤백한다
  • 같은 클래스 안에서 this.method()로 부르면 프록시를 거치지 않아 부가 기능이 빠진다 → 자기 호출 문제
  • JPA 지연 로딩도 비슷한 아이디어로, 연관 엔티티 자리에 프록시를 두고 처음 접근할 때 조회한다
  • 인터페이스 기반 JDK 동적 프록시(JDK Dynamic Proxy)와 하위 클래스를 만드는 CGLIB(Code Generation Library) 프록시가 있고, Spring Boot는 기본으로 CGLIB를 쓴다

이 방식은 GoF 디자인 패턴의 프록시 패턴을 프레임워크가 대신 적용한 것이다. 프록시 패턴은 실제 객체와 같은 인터페이스를 가진 대리 객체를 앞에 두고 접근을 가로채, 권한 확인·지연 로딩·캐싱·원격 호출 같은 통제를 끼워 넣는다. 호출하는 쪽은 진짜와 대리를 구분하지 않는다. 같은 "감싸기"라도 기능을 덧붙이는 데 목적이 있으면 데코레이터 패턴, 인터페이스를 바꾸면 어댑터 패턴으로 구분한다(구조 패턴).

참고: Proxying Mechanisms — Spring Framework · Proxy — Refactoring.Guru

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 스프링에서 외부 API 호출

    스프링 앱에서 다른 서버의 REST API를 부르는 도구는 여러 세대가 있다. 지금 새 코드라면 동기 호출은 RestClient, 리액티브·비동기는 WebClient, 인터페이스 선언 방식은 HTTP Interface나 OpenFeign이 흔한 선택이다(2026 기준).

  • 스프링 설정 외부화와 프로파일

    스프링 부트는 설정값을 코드 밖(application.yml·환경변수·명령줄 인자 등)에 두고, 실행 환경에 따라 다른 값을 주입하게 해 준다. 같은 빌드 산출물을 개발·QA·운영에 그대로 쓰고 설정만 바꾸는 것이 목표다.

  • Spring MVC 요청 흐름

    Spring MVC는 모든 HTTP 요청을 DispatcherServlet 하나가 받아, 알맞은 컨트롤러 메서드로 보내고 결과를 응답으로 바꾸는 프런트 컨트롤러(Front Controller) 구조다. 스프링 이전에는 URL마다 서블릿을 직접 만들고 매핑했다.

  • 동기·비동기와 블로킹·논블로킹

    동기·비동기는 결과를 언제 어떻게 받느냐, 블로킹·논블로킹은 기다리는 동안 호출한 스레드가 멈추느냐의 문제다.

  • CSRF

    CSRF(Cross-Site Request Forgery, 사이트 간 요청 위조)는 로그인한 사용자가 악성 사이트를 방문했을 때, 그 사이트가 사용자의 브라우저를 시켜 사용자 모르게 원래 사이트에 요청을 보내게 하는 공격이다. 공격자는 토큰을 훔치지 않는다. 브라우저가 쿠키를 알아서 붙여 준다는 점을 이용한다.

보기 옵션