스프링 프레임웍을 사용하여 개발 할때 서비스 객체나 DAO 객체의 빈(bean)을 얻기위해서는 @Autowired 또는 @Resource(name = "빈이름") 같은 annotation 을 사용해서 얻게 됩니다.
HttpServletRequest, HttpServletResponse, HttpSession과 같은 서블릿(Servlet)객체를 얻기 위해서는 Controller 메소드의 인자로 지정해서 값을 얻고 필요하면 서비스 객체로 보내기 위해서 서비스 객체의 인터페이스에 인자로 정의해서 사용합니다.
이 이외에 유틸리티성 객체에서 데이터베이스에 접근하고자 할때나, 컨트롤러(Controller)나 서비스 객체가 아닌 리스너나, AOP 등에서 서비스객체 또는 DAO 객체를 사용해야 할 경우가 있습니다.
이럴때 필요한 빈(Bean)이나 서블릿(Servlet) 객체에 직접 접근 하는 방법입니다. 빈을 직접 얻기 위해서는 ContextLoader로부터 현재의 WebApplicationContext 를 얻은 후 getBean() 메소드로 빈을 얻을 수있습니다.
WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext();
서블릿 객체들은 RequestContextHoler로부터 현재의 ServletRequestAttributes 객체를 얻은후, 필요한 객체를 얻을 수 있습니다.
ServletRequestAttributes attr = (ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();
다음은 이러한 기능을 모아둔 유틸리티 클래스 입니다. 필요에 따라 수정해서 사용하면 되겠습니다. com.tistory.pentode.util.ContextUtil.java 파일 입니다.
package com.tistory.pentode.util;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
public class ContextUtil {
/**
* 빈을 직접 얻습니다.
*
* @param beanName
* @return
*/
public static Object getBean(String beanName) {
WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext();
return context.getBean(beanName);
}
/**
* HttpServletReqeust 객체를 직접 얻습니다.
* @return
*/
public static HttpServletRequest getRequest() {
ServletRequestAttributes attr =
(ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();
return attr.getRequest();
}
/**
* HttpServletResponse 객체를 직접 얻습니다.
* @return
*/
public static HttpServletResponse getResponse() {
ServletRequestAttributes attr =
(ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();
return attr.getResponse();
}
/**
* HttpSession 객체를 직접 얻습니다.
*
* @param gen 새 세션 생성 여부
* @return
*/
public static HttpSession getSession(boolean gen) {
return ContextUtil.getRequest().getSession(gen);
}
/**
* REQUEST 영역에서 가져오기
*
* @param key
* @return
*/
public static Object getAttrFromRequest(String key) {
ServletRequestAttributes attr =
(ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();
return attr.getAttribute(key, ServletRequestAttributes.SCOPE_REQUEST);
}
/**
* REQUEST 영역에 객체 저장
*
* @param key
* @param obj
*/
public static void setAttrToRequest(String key, Object obj) {
ServletRequestAttributes attr =
(ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();
attr.setAttribute(key, obj, ServletRequestAttributes.SCOPE_REQUEST);
}
/**
* SESSION 영역에서 가져오기
*
* @param key
* @return
*/
public static Object getAttrFromSession(String key) {
ServletRequestAttributes attr =
(ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();
return attr.getAttribute(key, ServletRequestAttributes.SCOPE_SESSION);
}
/**
* Session 영역에 객체 저장
*
* @param key
* @param obj
*/
public static void setAttrToSession(String key, Object obj) {
ServletRequestAttributes attr =
(ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();
attr.setAttribute(key, obj, ServletRequestAttributes.SCOPE_SESSION);
}
}
사용법
* Object getBean(String beanName) - 빈 이름으로 필요한 빈 객체를 직접 가져옵니다. LoginDAO 가 @Repository("LoginDAO") 로 빈 이름이 지어져 있다면 다음과 같이 가져올 수 있습니다. LoginDAO loginDao = (LoginDAO)ContextUtil.getBean("LoginDAO");
* HttpServletRequest getRequest() - HttpServletRequest 객체를 직접 얻습니다.
* HttpServletResponse getResponse() - HttpServletResponse 객체를 직접 얻습니다.
* HttpSession getSession(boolean gen) - HttpSession 객체를 직접 얻습니다. 내부적으로 HttpServletRequest 객체를 먼저 구한 다음에 그 객체로부터 HttpSession 객체를 얻습니다.
* Object getAttrFromRequest(String key) - REQUEST 범위에 저장된 객체를 가져옵니다.
* void setAttrToRequest(String key, Object obj) - REQUEST 범위에 객체를 저장합니다.
* Object getAttrFromSession(String key) - SESSION 범위에 저장된 객체를 가져옵니다.
* void setAttrToSession(String key, Object obj) - SESSION 범위에 객체를 저장합니다.
지금까지 스프링 빈과 서블릿 객체를 직접 얻어서 사용하는 방법 및 REQUEST, SESSION SCOPE에 객체를 직접 저장하거나, 가져오는 방법을 알아보았습니다.
'프로그래밍 > 스프링프레임워크' 카테고리의 다른 글
전자정부 표준프레임워크 - dataSource (DBCP) 설정하기 (0) | 2018.04.17 |
---|---|
전자정부 표준프레임워크 - JUnit 4 Test Case 생성하기 (1) | 2018.04.12 |
스프링프레임웍 - Ajax 통신(@RequestBody, @ResponseBody) (8) | 2018.04.09 |
스프링프레임웍 - Spring Security(3) : 사용자/권한 정보 DB사용하기 (15) | 2018.04.09 |
스프링프레임웍 - Spring Security(2) : 커스텀 로그인 화면 및 권한에 따른 접근 제어 (0) | 2018.04.08 |