@Transactional 어노테이션에 대해서 공부를 하던 중 @Transactional 어노테이션을 사용하게되면 스프링에서 해당 메서드에 대한 프록시를 만든다는 글을 보고 프록시 패턴에 대한 궁금증이 생겨 정리하게 되었습니다.
개념
대상 원본 객체를 대리하여 대신 처리하게 함으로써 로직의 흐름을 제어하는 행동 패턴이다.
어떤 객체를 사용하고자 할 때, 객체를 직접적으로 참조하는 것이 아닌 해당 객체의 프록시 객체를 통해 대상 객체에 접근하는 방식을 사용하면 해당 객체가 메모리에 존재하지 않아도 기본적인 정보를 참조하거나 설정할 수 있고, 실제 객체의 기능이 필요한 시점까지 객체의 생성을 미룰 수 있다.
사용 시기
- 접근을 제어하거나 기능을 추가하고 싶은데, 기존의 특정 객체를 수정할 수 없는 상황일 때
- 초기화 지연, 접근 제어, 로깅, 캐싱 등 기존 객체 동작의 수정 없이 로직을 추가하고 싶을 때
사용했을 때 효과
- 보안
- 프록시는 클라이언트가 작업을 수행할 수 있는 권한이 있는지 확인하고 검사 결과가 긍정적인 경우에만 요청을 대상으로 전달한다.
- 캐싱
- 프록시가 내부 캐시를 유지하여 데이터가 캐시에 아직 존재하지 않는 경우에만 대상에서 작업이 실행되도록 한다.
- 데이터 유효성 검사
- 프록시가 입력을 대상으로 전달하기 전에 유효성 검사한다.
- 지연 초기화
- 대상의 생성 비용이 비싸다면 프록시는 그것을 필요로 할 때까지 연기할 수 있다.
- 로깅
- 프록시는 메소드 호출과 상대 매개변수를 인터셉트하고 이를 기록한다.
- 원격 객체
- 프록시는 원격 위치에 있는 객체를 가져와서 로컬처럼 보이게 할 수 있다.
장단점
장점
- 기존 대상 객체의 코드를 변경하지 않고 새로운 기능을 추가할 수 있다. (OCP 준수)
- 대상 객체는 자신의 기능에만 집중하고, 그 이외 부가 기능을 제공하는 역할을 프록시 객체에 위임하여 다중 책임을 회피할 수 있다. (SRP 준수)
- 사이즈가 큰 객체가 로딩되기 전에 프록시를 통해 참조할 수 있다.
단점
- 객체를 생성할 때 한 단계를 거치게 되므로, 빈번한 객체 생성이 필요한 경우 성능이 저하될 수 있다.
- 프록시 내부에서 객체 생성을 위해 스레드가 생성, 동기화가 구현되어야 하는 경우 성능이 저하될 수 있다.
- 로직의 복잡성이 증가할 수 있고, 이로 인해 가독성이 떨어질 수 있다.
- 프록시 클래스 자체에 들어가는 자원이 많다면, 서비스로부터 응답이 지연될 수 있다.
종류
가상 프록시
- 지연 초기화 방식
- 가끔 필요하지만 항상 메모리에 적재되어 있는 무거운 객체가 있는 경우
- 실제 객체의 생성에 많은 자원이 소모되지만 사용 빈도는 낮을 때 쓰는 방식
- 꼭 필요로 하는 시점까지 객체의 생성을 연기하고, 해당 객체가 생성된 것처럼 동작하도록 만들고 싶을 때 사용하는 패턴
원격 프록시
- 프록시 클래스는 로컬에 있고, 대상 객체는 원격 서버에 존재하는 경우
- 프록시 객체는 네트워크를 통해 클라이언트의 요청을 전달하여 네트워크와 관련된 불필요한 작업들을 처리하고 결과값만 반환
- 클라이언트 입장에선 프록시를 통한 객체를 이용하는 것이므로 원격이든 로컬이든 상관없음
- 프록시는 진짜 객체와 통신을 대리
보호 프록시
- 프록시가 대상 객체에 대한 자원으로의 액세스 제어
- 특정 클라이언트만 서비스 객체를 사용할 수 있도록 하는 경우
로깅 프록시
- 대상 객체에 대한 로깅을 추가하려는 경우
- 프록시는 서비스 메서드를 실행하기, 전달하기 전에 로깅을 하는 기능을 추가하여 재정의
캐싱 프록시
- 데이터가 큰 경우 캐싱하여 재사용 유도
- 클라이언트 요청의 결과를 캐시하고 이 캐시의 수명 주기를 관리
참고
사진
https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9D%EC%8B%9C_%ED%8C%A8%ED%84%B4
내용
https://velog.io/@max9106/Spring-%ED%94%84%EB%A1%9D%EC%8B%9C-AOP-xwk5zy57ee
잘못된 부분이 있거나 오타가 있다면 댓글 부탁드리겠습니다. :)
'자잘한 cs' 카테고리의 다른 글
JPA의 N+1 문제에 대해서 설명해주세요. (0) | 2024.11.22 |
---|---|
엔티티 매니저에 대해 설명해주세요. (0) | 2024.11.20 |
JPA의 ddl-auto 옵션은 각각 어떤 동작을 하고 어떤 상황에서 사용해야 할까요? (0) | 2024.11.18 |
Redis가 빠른 이유 (0) | 2024.06.10 |
reverse proxy란? (0) | 2024.05.10 |