이전에 트랜잭션 관련하여 프록시 객체라는 단어를 사용했었다.
트랜잭션중에는 세부적인 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 |