Spring

proxy 객체의 이해와 문제 발생 유형

디지털노마드-건물주 2024. 6. 28. 10:44
728x90

문제 추정 중..  afterPropertiesSet() deprecate? 

Root WebApplicationContext: initialization completed

ApplicationContext는  BeanFactory를 상속해서 실행하기 때문에 전체적인  Bean 초기화는 되었다. 

그런데 warn 즉, 경고창이 뜨는데 그 이유는 하나씩 확인하쟈 

문제1. afterPropertiesSet 

Unable to proxy interface-implementing method [public final void org.springframework.dao.support.DaoSupport.afterPropertiesSet() throws java.lang.IllegalArgumentException,org.springframework.beans.factory.BeanInitializationException] because it is marked as final: 
Consider using interface-based JDK proxies instead!

 

afterPropertiesSet() 란 

-  InintializingBean 인터페이스의 메소드로 BeanFactory에 의해 모든 property 가 설정되고 난 뒤 실행되는 메소드

 

문제 해석2. 인터셉터 Bean -> BeanPostProcessors 처리에 적합하지 않다.

- ⭐️(proxy 객체가 감싸야 하는) requestInterceptor Bean 은 BeanPostProcessors 가  proxy 객체를 자동 생성하지 못한다. 

Bean 'requestInterceptor' of type [com.shoppingmall.toaf.intercept.RequestInterceptor] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

 

뜻1: 빈을 원하는대로 조작할 수 있는 기능을 제공해주는 것이 바로 빈 후처리기

뜻2: BeanPostProcessorSpring 컨테이너에서 빈이 초기화되기 전후에 커스텀 로직을 삽입할 수 있도록 해주는 인터페이스입니다.

문제 원인은 패턴을 Action 클래스 안의 핸들러에 라우팅되지 않으면 위 에러가 나오고 Action패턴에 맞으면 에러가 나오지 않음 

@Bean	
public RegexpMethodPointcutAdvisor requestValueAdvisor() {  	
    RegexpMethodPointcutAdvisor requestValueAdvisor = new RegexpMethodPointcutAdvisor();
/** 
 * @Explain1: 어드바이스(처리 방법)를 설정 :  이 어드바이스는 특정 관점에서 '메소드 실행 전후에 실행될 코드'를 담고 있음
 * @Explain2: 어떤 포인트 커트(=requestValueAdvisor): 조인 포인트(requestInterceptor-invoke)와 어떤 어드 바이스(=requestInterceptor) 결합될지를 결정하는 필터
 * @Explain3: .*: 어떤 문자나 문자열˙이든 (빈 문자열 포함) 0회 이상 반복될 수 있음 -> Action 포함된 경우 매칭 
 */
    requestValueAdvisor.setAdvice(requestInterceptor);
    //*포인트 커트, 패턴 해석:.모든 Action클래스.모든 메서드: 
    requestValueAdvisor.setPattern(".*Action.*"); //
    return requestValueAdvisor;
}

원리를 이해해보쟈 

BeanPostProcessor를 사용하여 AOP 기능을 구현해결

DefaultAdvisorAutoProxyCreator는 AbsractAutoProxyCreator를 상속받아  객체를  생성한다 따라서 BeanPostProcessor 가 *Action패턴이 맞지 않는 핸들러는 auto-proxying 자격이 없다고 나오는  것이다.

/**
 * @Explain: Advisor가 적용될 모든 빈에 대해 자동으로 프록시를 생성하며, 어드바이스(Advice)가 적용될 시점에 메소드 호출을 인터셉트하여 추가 기능을 수행
 * 			 Advisor가 프록시로 변환되어야 한다.
*/

@Bean	
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() { 	
    DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
    // if not set this, it will use JDK dynamic proxy 
    defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);
    return defaultAdvisorAutoProxyCreator;
}

 

 

*Action 패턴에 맞는 로그인  페이지 는 인터셉터 정상적으로 proxy 객체를  생성한다.   

aop 정상 동작 

로그인 페이지 라우터

 

*Action 패턴 클래스 안의 로그인 핸들러 

aop 정상 동작 

로그인 후

*실행 순서: loginAction 클래스 패턴 인식 -> 리로드 + 로그인 후 추측 -> 테스트 필요  

728x90