static 메서드 또는 자바 에서 spring 빈 가져오기

스프링을 사용하다보면 부득이하게 “spring bean“을 일반 자바 또는 “static 메서드“로
선언된 곳에서 spring bean을 호출을 해야 하는 경우가 있습니다.

예를 들어서 “Servlet Filter“에서 “특정 spring bean”사용 한다 거나 특히, “유틸리티” 기능을
하는 클래스들(“주로 static으로 메서드가 선언된 클래스“)에서 사용할 경우가 대표적인
예라고 할 수 있습니다.

위와 같은 경우 어떻게 사용하는지에 대해서 “recipe“를 알려 드리겠습니다.

(1) 스프링 빈 설정

먼저 호출되어질 “스프링 빈“을 간단하게 설정하도록 하겠습니다.

SampleBean.java

/*
 * Revision History
 * Author                    Date              Description
 * ------------------        --------------  ------------------
 * @beyondj2ee for twitter   2012. 12. 6
 */
package pe.beyondj2ee.springframework.sample

public class SampleBean {
	//~ Static fields/initializers ~
	//~ Instance fields ~
	//~ Constructors ~
	//~ Implementation Method (interface/abstract) ~
	//~ Self Methods ~
	/**
	 * 메세지를 리턴 한다.
	 *
	 * @return the string
	 * @throws Exception the exception
	 */
	public String echo () throws Exception {
		return "My Bean!!!";
	}
	//~ Getter and Setter ~
}

위의 클래스를 스프링 빈으로 설정 합니다.
bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:p="http://www.springframework.org/schema/p" xmlns:oxm="http://www.springframework.org/schema/oxm"
	xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm.xsd
	http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

	<bean id="sampleBean" class="com.ucore2.migration.simulator.SampleBean"/>
		
</beans>

(2) web.xml 설정

아래와 같이 “web.xml”에 스프링 컨텐스트를 설정 합니다.
여기서 중요한 부분은 “RequestContextListener” 리스너 입니다.
해당 리스너의 역할은 “현재 요청되어진 “HttpServletRequest” 객체의 레퍼런스
정보를 저장하는 기능을 갖고 있습니다.
즉 , current request에 대한 정보를 노출시켜주는 기능 입니다.


	<context-param>
    	<param-name>contextConfigLocation</param-name>
    	<param-value>classpath*:/bean.xml</param-value>
	</context-param>

	<listener>
	    <listener-class>
	        org.springframework.web.context.ContextLoaderListener
	    </listener-class>
	</listener> 
	<listener>  
		<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
	</listener>

(2) utility 클래스 작성

“스프링 빈”를 호출해서사용하는 “utility 클래스” 입니다.
“RequestContextHolder” 클래스를 사용해서, 현재 요청한 “HttpServletRequest”
객체를 가져 옵니다.
나머지 코드는 기본적으로 스프링 빈을 가져오는 코드들 입니다.

</pre>
/*
 * Revision History
 * Author Date Description
 * ------------------ -------------- ------------------
 * @beyondj2ee for twitter 2012. 12. 6
 */
package pe.beyondj2ee.springframework.sample;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.context.support.WebApplicationContextUtils;

/**
 * 메세지를 리턴하는 클래스.
 */
public class StaticUtil {
 //~ Static fields/initializers ~
 //~ Instance fields ~
 //~ Constructors ~
 //~ Implementation Method (interface/abstract) ~
 //~ Self Methods ~
 /**
 * 메세지 정보를 리턴 한다.
 *
 * @return the message
 * @throws Exception the exception
 */
 public static String getMessage () throws Exception {

 //현재 요청중인 thread local의 HttpServletRequest 객체 가져오기
 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

 //HttpSession 객체 가져오기
 HttpSession session = request.getSession();

 //ServletContext 객체 가져오기
 ServletContext conext = session.getServletContext();

 //Spring Context 가져오기
 WebApplicationContext wContext = WebApplicationContextUtils.getWebApplicationContext(conext);

 //스프링 빈 가져오기 & casting
 SampleBean sBean = (SampleBean)wContext.getBean("sampleBean");

 return sBean.echo();
 }
 //~ Getter and Setter ~

}

(2) controller 적용하기

컨트롤러에서 위의 “utility 클래스“를 호출 합니다.

/*
 * Revision History
 * Author                     Date              Description
 * ------------------         --------------  ------------------
 * @beyondj2ee for twitter  2012. 12. 6
 */
package pe.beyondj2ee.springframework.sample;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/static")
public class BasicController extends AbstractController {
	// ~ Static fields/initializers ~
	/** this logger. */
	private static final Logger logger = LoggerFactory.getLogger(BasicController.class);

	// ~ Instance fields ~
	// ~ Constructors ~
	// ~ Implementation Method (interface/abstract) ~
	// ~ Self Methods ~

	/**
	 * 기본 요청을 처리하는 컨트롤러.
	 *
	 * @return the model and view
	 * @throws Exception the exception
	 */
	@RequestMapping(method = RequestMethod.GET)
	public void handleGET() throws Exception {
		logger.info("message : " + StaticUtil.getMessage());
	}
	// ~ Getter and Setter ==============================================================================================
}

컨트롤러를 실행하면 아래와 같이 결과가 출력 됩니다.
이미지 1

Conclusion

해당 방법은 “HpptServletRequest” 객체를 참조하기 어려운 클래스에서 호출시에
좋은 “tip“이 될것 입니다. 참고로 “Web Application“에서만 해당 된다는 점을
유념 하시기 바랍니다.

Published by: beyondj2ee

Past SI AA, now I am pikicast developer in yellow mobile and daddy, Java, Spring, OpenSource, Application Architect :) Java Application Architect. mail : beyondj2ee@gmail.com twitter : twitter.com/beyondj2ee facebook : https:www.facebook.com/beyondj2ee blog: http:beyondj2ee.wordpress.com

Categories Uncategorized댓글 남기기

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중