상세 컨텐츠

본문 제목

[SPRING] 커스텀 리스너에서 빈 주입하기(@Autowired 성공하기)

JAVA/SPRING

by ranlan 2022. 12. 29. 22:58

본문

728x90

관련 포스팅 >  2022.12.27 - [여러가지/웹과 개발] - [SERVLET, JSP] 다양한 이벤트 리스너(Listener)

 

[SERVLET, JSP] 다양한 이벤트 리스너(Listener)

리스너(Listener) 특정 이벤트가 발생하면 정의한 내용(메서드)을 실행하는 컴포넌트로 '이벤트 핸들러'라 부르기도 한다. 서블릿(Servlet)에서 활용되는 리스너는 웹 어플리케이션 수행과 관련하여

juran-devblog.tistory.com

 

커스텀 리스너를 작성하고 다른 서비스나 DAO 사용을 위해 @Autowired로 빈 주입을 하면 오류가 발생한다.

 

사실 전에 봤던 에러는 500 에러가 아니였던거같은데 쨋든, 대충 로그를 보면 @Autowired를 인식하지 못하는 빈 주입이 안되는 오류가 발생한다.

구글링했을 때 어디서 서블릿 리스너만 해당인지 모든 리스너인지 모르겠는데 빈 사이클과 다르게 흘러가서? @Autowired가 제대로 적용 안된다고 보았다.

그 포스팅을 다시 한번 읽어보고싶은데 도저히 아무리 구글링해도 안나온다..... 누가 찾으면 젭알 알려주세요...🙏🏻

 

 

암튼 리스너에서 @Autowired로 빈 주입이 안될 때 직접 주입해주는 방법

먼저 리스너 내에서 어떤 서비스나 DAO와 같은 객체가 필요할 때 아래처럼 정의를 하게 되는데 막상 주입은 안되는 문제 발생

@Autowired
private BoardService boardService;

@Autowired
private MemberDAO memberDAO;

그럼 직접 어플리케이션 컨텍스트 정보에서 해당 빈을 찾아 직접 설정해준다.

WebApplicationContext ctx=WebApplicationContextUtils.getWebApplicationContext(sre.getServletContext());
this.boardService=(BoardService)ctx.getBean("boardService");
this.memberDAO=(MemberDAO)ctx.getBean("memberDAO");

* 주의할 점은 주입할 객체로 형변환을 해줘야 한다는 점과 빈 이름을 잘 매핑해야한다는 점!

 

WebApplicationContext는 DispatcherSerlvet에 의해 생성되며 DispatcherSerlvet이 직접 사용하는 컨트롤러를 포함한 웹 관련 빈을 등록하는데 사용한다. DispatcherSerlvet는 독자적인 WebApplicationContext를 가진다.

어플리케이션 컨텍스트에 대해 자세한건 다음에..

 

728x90

관련글 더보기

댓글 영역