2007년 10월 25일 목요일

Spring 컨테이너가 아닌곳에서도 Service 사용하기

Service를 Spring 컨테이너가 아닌 일반 서블릿에서도 사용가능하다!!!

프로젝트를 하다보면 간혹가다가 서블릿으로 일부 어플리케이션을 만들어야 할 필요가 있다.
특히나 파일 다운로드를 구현하다보면 더욱 그러하다.
또한 일반 서블릿을 제외하고도 라이브러리나 기타 다른 클래스에서 직접 특정된 어플리케이션의 서비스인스턴스를 받아서 처리하려면 여간 힘들지 않다.

이런 경우 보통은 ApplicationContext를 ThreadLocal 변수에 저장시켰다가 다른 곳에도 호출하면서 사용한다. 하지만 한가지 단점은 ThreadLocal 변수를 초기화하지 않은채 특정된 어플리케이션을 호출하면 ApplicationContext 인스턴스를 가져올수가 없게 된다.

사실 서블릿 컨텍스트에는 ApplicatioinContext 인스턴스를 가지고 있다. 하지만 이 경우 나의 관심사는 다른 여타의 빈즈보다는 특정된 서비스이다. 솔직히 말해서 아래에 첨부한 소스를 조금 변경하면 서비스 인스턴스가 아닌 다른 인스턴스도 가져올수 있다.

먼저 그럼 소스부터 첨부하겠다.

소스열기

위에서와 같이 ServiceHelper 클래스를 만들었다면 bean으로 선언된 서비스 인스턴서를 받어오려면 아래와 같이 호출 하면된다.

SysUpfileService sysUpfileService = SysUpfileServiceHelper.getBoardService(getServletContext());

getBoardService 메소드가 static으로 선언되였으므로 별도로 SysUpfileServiceHelper 를 인스턴스화 할 필요는 없다.
위 소스에 대하여 간단하게나마 설명을 하자면 실제 Servlet에서 bean을 접근 할수가 없므로 WebApplicationContext 인스턴스를 통하여 접근을 시도한다.
WebApplicationContext 인스턴스를 받게 되면 우리가 접근하려고 하는 bean 네임만 주고 실제 bean 인스턴스를 리턴받아 온다. 사실 이 루틴은 아예 이런 빈을 사용하려는 클래스에 포함시켜서 사용할 수 있다. 하지만 여러 곳에서 이런 서비스를 빈을 필요로 하는 경우가 존재하기때문에 별도로 serviceHelper라는 클래스로 추출하였었다. 사용자는 실제 자신의 상황에 마추에 이부분 코딩을 해주면 된다.

댓글 없음:

댓글 쓰기