본문 바로가기
공부/Java

# 객체 # 프록시 객체

by 앙팡공기팡 2024. 11. 28.

이전에 트랜잭션 관련하여 프록시 객체라는 단어를 사용했었다.

트랜잭션중에는 세부적인 DB의 변동을 트랜잭션이 끝난 뒤에 해야하며, Lazy Loading이 필요하므로,

기본 Entity 객체로는 다음과 같은 기능을 사용할 수 없다.

그렇기 때문에 @Transactional 이 붙은 메서드는 객체 생성 시 일반 객체가 아닌,

프록시 Entity 객체를 생성한다. 

프록시 객체는 일반 객체와는 다른 특수한 기능을 수행하는 객체라고 보면 된다.

위에서 언급했듯이, 주요기능은 DB 커밋, 롤백, Lazy Loading이 필요할 때 트랜잭션 경계를 설정해,

안전한 데이터 처리 환경을 제공한다.

 

그 외의, 프록시 객체가 사용되는 경우는 다양하며,

프록시 객체의 기능도 목적에 따라 아주 다양하다.

트랜잭션외에도 자주 사용하는 경우를 추가적으로 다뤄보고자 한다.

 

이전에, 의존성 주입 시 Bean과 Spring Container에 대해 기억하는가?

이때, 우리는 Bean의 객체 등록을 통해 싱글톤 패턴을 유지하며, 손 쉽게 의존성 주입을 하는 기능을 소개했었다.

기본적으로 그 과정에 필요한 기능은 @Bean과 @RequiredArgsConstructor에 대해 소개했었다.

이 두 어노테이션의 공통점은 객체를 Bean으로 등록해 Spring Container에 보관하는 것이라고 언급했었다.

그렇다면 차이점으로도 객체의 등록 방식을 설명했던걸 기억할 것이다.

@Bean의 경우 메서드의 반환 객체 타입을 통해 Bean으로 등록한다. (메서드 단위)

@RequiredArgsConstructor의 경우 클래스자체의 객체를 Bean으로 등록한다.(클래스 단위)

이때, 우리는 @Bean으로 등록하는 방법에서 한가지 의문점을 품을 수 있다.

만약, 여러 메서드에서 같은 타입의 클래스 객체를 반환하면 어떤 일이 일어날까?

 

이때, Spring Container의 사용 목적 중 싱글톤 패턴을 유지한다는 것에 초점을 맞춰야한다.

Spring Container는 클래스에서 단일 객체를 Bean으로 등록하여, 메모리 효율화에 기여한다.

그렇기 때문에  같은 타입의 클래스 객체를 반환한다면 클래스 객체는 하나만 등록되어야한다.

이 과정을 위해 우리는 @Configuration을 @Bean 사용 클래스에 추가하는 것을 종종 보았을 것이다.

@Configuration의 목적은 싱글톤을 유지하기 위한 것이다.

이 어노테이션을 통해 우리는 Spring Container에 한 객체만 유지하는 것을 보장한다.

이 때, 사용되는 것이 프록시 객체이다.

다음 예시를 보자

 

@Configuration
public class AppConfig {
    @Bean
    public UserService userService() {
        return new UserService();
    }

    @Bean
    public UserController userController() {
        // 프록시 객체가 userService() 호출을 가로채어 동일 객체 반환
        return new UserController(userService());
    }
}

 

이 클래스에서 프록시 객체가 하는 역할은 다음과 같다.

 

중복 생성 방지:

  • @Bean 메서드가 여러 번 호출될 경우, 프록시 객체는 컨테이너에 이미 생성된 Bean을 반환합니다.
  • 예를 들어, 다른 @Bean 메서드 내부에서 userService()를 호출해도 동일한 객체가 반환됩니다.

메서드 간의 호출 관리:

  • 프록시 객체는 클래스 내부 메서드 간 호출 시에도 Spring 컨테이너가 관리하는 Bean을 반환하여 싱글톤 패턴을 유지합니다.
  • 만약 일반 객체로 등록하면 메서드 간 호출 시 새 객체가 생성될 수 있습니다.

 

설명하자면 다음과 같다.

@Bean이 사용된 다른 메서드에서 이미  객체로 Bean에 등록된  객체를 사용할 경우,

프록시 객체로 생성된 @Confiruration 클래스 객체는 Return 시 해당 객체를 사용한다.

 

 

'공부 > Java' 카테고리의 다른 글

# List # List 타입과 활용  (1) 2024.11.29
#JPA 2# JpaRepository와 JPQL  (0) 2024.11.28
#JPA 1# JPA와 트랜잭션  (0) 2024.11.26
#API# Spring의 API 생성 방식과 Model  (0) 2024.11.26
#의존성 2# Spring의 의존성 주입 기능  (0) 2024.11.25