인프런 커뮤니티 질문&답변

Truestar님의 프로필 이미지
Truestar

작성한 질문수

스프링 프레임워크 핵심 기술

IoC 컨테이너 2부: ApplicationContext와 다양한 빈 설정 방법

Bean 을 특정 Application...Event 발생 후, 등록하는 방법이 궁금합니다

해결된 질문

작성

·

456

0

`App 초기화 이후 App..Event 발생시점에 Bean 등록이 가능할까요?`

이런 방법이 필요한 배경은 이렇습니다.
DB 데이터가 초기화 된 이후, S.Security 에서 URL 리소스를 불러들이는 클래스가 있는데,


이 클래스(Filter)가
@Bean 으로 되어 있으면, DB 에 데이터가 INSERT 되기 전에
Bean 등록과 동시에 Security 설정이 완료가 되버려 DB에 없는 URL 인가정보를 SELECT 해서 인가처리가 불가능 하더라구요. 그래서 사용한 방법이 Filter POJO화 입니다.

Filter @Bean 등록 메서드에 @Bean 주석처리 후
 POJO 화 시킨다음 초기화시 POJO 를 사용하고,

러닝타임(ContextRefreshedEvent 발생이후) 부터 기존 POJO 를 Bean 으로 등록하여 사용하려는 목적 때문에
이런 방법을 시도해보게 되었습니다.

강의영상에서 가능 할 듯한 내용을 확인한 부분은

  • context = new ApplicationConfigApplicationContext(Config.class)

즉, context 를 통해 Filter 가 빈으로 등록되는 Config 를 만들어 등록하려는데요,


질문입니다

   @EventListener(ContextRefreshedEvent.class)
public void onContextRefreshedEvent() {
...
...
}
  1. 이렇게, 핸들러 안에서 AppConfigAppContext 를 생성하여 등록하는 방법이 가능한가요?

  2. 불가능하다면, 가능한 방법이 있을까요?

이런 부분에 대해 조언을 구합니다.
읽어주셔서 감사해요

답변 3

0

Truestar님의 프로필 이미지
Truestar
질문자

강사님.
전혀 다른 방법으로 해결을 봤어요..
@Bean 이나, Data INSERT 시점을 변경하는 것은
무모했지만, 학습효과는 대단했습니다 ㅎㅎㅎ

Data 를 reload 하는 메서드를 Filter 내부에 작성하고/
App..ReadyEvent 핸들러에서 호출 하는 것으로 해결되었습니다.

질문과 자문자답으로, 실마리를 찾은거 같아 참 다행인것같습니다.
관심가져주셔서 감사드려요.. 고맙습니다.

0

Truestar님의 프로필 이미지
Truestar
질문자

강사님 답변 감사드립니다.

알려주신 BFPP 의 postProcessBeanFactory() 메서드가 발동 되도록 적용해보면
JPA 를 통해 데이터 INSERT 가  되기 이전에 실행되는것으로 판단이 되었어요.
( 테이블 생성 전 )


저도 이 부분을 이전에도 시도해 봤었지만,  ContextRefreshedEvent   가 발생하는 시점이
데이터 INSERT 가  끝나기 때문에, @Bean 을 재등록 해야 하는 상황이 필요하게 되었습니다

어떻게 해야 BFPP 를 Query 실행 이후 작동되게 할 수 있을까요?

Query 실행이 된 이후, Bean 전/후처리가 가능하거나,
Query 실행을 Bean 등록보다 먼저 되게 해야 할것 같은데요..
방법을 도무지 모르겠어요ㅠ

혹시 제가 놓치고 있는게 있는지 궁금합니다
읽어주셔서 감사해요

0

백기선님의 프로필 이미지
백기선
지식공유자

안녕하세요. BeanFactoryPostProcessor 라는 인터페이스가 있습니다. 아마 빈 라이브사이클에서 제가 잠시 언급했을 텐데 이 인터페이스의 구현체를 사용하시면 빈 팩토리가 만들어진 이후에 원하는 일들을 하실 수 있을겁니다. 스프링 @AOP를 생각해 보시면 특정 빈을 감싼 프록시 빈을 만들어 등록해 주는 일을 하는데 그때도 역시 BFPP의 구현체가 사용됩니다.

Truestar님의 프로필 이미지
Truestar

작성한 질문수

질문하기