오늘은 Spring의 Proxy에 대해서 알아 볼 예정이다.

추가로 Proxy에 대해 알아보려면 Spring의 AOP에 대해서도 이해하면 좋기 때문에 이도 같이 다룰 예정이다.

Proxy?

Proxy Server

프록시는 어디서 들어본 것 같은 느낌이 많이 드는데, 이는 프록시 서버 떄문일 것같다.

프록시 서버는 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해 주는 시스템 혹은 프로그램을 뜻한다.

클라이언트와 서비스 사이의 중계기능을 하는 것을 뜻하며, 쉽게 말하자면 중계 서비스, 즉 대리로 동작을 수행하는 것이다.

즉, 프록시 서버는 대리 통신을 해준다고 생각하면 된다.

Spring에서의 Proxy

그렇다면 Spring에서 Proxy는 어떻게 사용될까?

Spring에서도 물론 Proxy는 대리인의 입장으로, 클라이언트와 실제 요청을 처리하는 타깃 사이에서 기능을 수행하는 역할을 한다.

Untitled

Proxy는 원래 객체를 대신해서 클라이언트의 요청을 받아들이고, 부가기능을 처리하며 타겟을 호출하여 핵심 기능을 실행시키도록 하는 것이다.

이러한 방식으로 동작하는 이유는 Proxy에서 처리하는 부가기능은 중복될 여지가 있기 때문이다.

부가기능은 트랜잭션 관리, 로깅, 보안과 같은 기능들을 말한다.

@Slf4j
@Service
@RequiredArgsConstructor
public class MemberService {

    private final MemberRepository memberRepository;

		@Transactional // Proxy에서 관리 
    public Member getUser(Principal principal) {
			log.info("서비스 실행"); // Proxy에서 로깅 실행
			Member member = memberRepository.findByUsername(principal.getName()); // 보안 부가기능 실행, 핵심로직 호출
			log.info("회원 조회"); // Proxy에서 로깅 실행
			return member;
    }
}

위 코드의 주석에 설명한 것 처럼 트랜잭션, 로깅, 보안과 같은 부가기능은 Proxy 실행하며 핵심로직은 호출하는 방식으로 진행된다.

위와 같이 Proxy에서 처리하는 방식이 바로 **AOP(Aspect-Oriented Programming)**에서 사용되며, 로깅, 트랜잭션 관리, 보안 등과 같은 공통의 관심사를 분리해 처리하게 한다.