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: BeanPostProcessor는 Spring 컨테이너에서 빈이 초기화되기 전후에 커스텀 로직을 삽입할 수 있도록 해주는 인터페이스입니다.
문제 원인은 패턴을 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