Whiteship's Note


Spring 컨트롤러와 request scope bean

모하니?/Coding : 2008.04.16 19:07


스프링 컨트롤러와 request scope관한 이메일이 왔습니다.

...

제가 느끼고 있는 궁금증은 Controller 사용시 bean scope에 관한 부분입니다.

몇번의 프로젝트에서  SpringMVC를 이용하여 프로젝트를 했었는데요.
하나의 Controller에서 요청을 처리를 하기 위해 MultiActionController를 사용했습니다.
 
BaseController를 정의해서 BaseController가 MultiActionController를 상속받도록 만들었고,
모든 Controller는 BaseController를 상속 받아 쓰는 형식으로 구조를 잡았습니다.
 
BaseController에는 handleRequestInternal() 메소드를 오버라이드 해서 모든 request 값을
파싱하여 Map에 담도록 해놓았구요. (map에서 값을 꺼내 요청을 처리하도록 말이죠.)
 
테스트를 위해 Controller 내에서 sleep() 을 준 뒤, 몇개의 요청을 날려보면
가장 나중에 요청된 정보로 앞의 정보들이 변경되더군요.
아마도 scope이 singleton이라 그런것 같더군요.
그래서 빈 설정시에 Controller에 대한 scope을 모두 request로 바꿔줬습니다.
 
<bean id="memberController" class="MemberController" scope="request">
 
이렇게 바꾸어주니 이전과 같은 현상은 발생하지 않더군요.

과연 이렇게 하는 것이 맞는 것인지, 아니면 BaseController를 scope="request"로 만들면 그걸
상속받는 다른 빈도 request가 되는 것인지 정확한 판단이 서질 않더군요.

제가 알기로는 Spring에서 Controller 이용시 threadsafe 한 설계는 개발자의 몫이라고 들었습니다.
어디를 봐도 정확한 가이드가 나와있지 않아서 혼자 헤매다 이렇게 메일을 드리게 되었습니다.

...

그리고 다음과 같이 답변해드렸습니다.

more..


request scope 빈을 써본지가 까마득한데 이런 경우에 유용하게 쓸 수 있겠네요. 내용 공유를 허락해주셔서 감사합니다.
top


rails로 생성한 scaffold 코드 살펴보기 - Controller

RUBY/on Rails : 2007.05.26 23:42



class CategoriesController < ApplicationController
  def index
    list
    render :action => 'list'
  end

컨트롤러의 첫부분 입니다. list 메소드를 호출하고 list라는 이름의 뷰를 사용하도록 render :action 을 사용합니다.

  def destroy
    Category.find(params[:id]).destroy
    redirect_to :action => 'list'
  end

컨트롤러의 마지막 부분으로 지우고 난 뒤 list 페이지로 이동하도록 redirect_to :action 을 사용합니다.

컨트롤러 곳곳에서 사용하고 있는 find, find_all, new, save, update_attributes, destroy 이런 메소드들은 ActiveRecord에 있는 메소드를 사용한다고 합니다. ActiveRecord에 대한 공부가 필요하군요. 이 전 글에서 제가 궁금해 했었던 Dao 역할을 하는 녀석이 바로 이 녀석이였던 것 같습니다.

RadRails의 RI 탭에서 검색하면 바로 레퍼런스를 참조 할 수 있습니다. 그런데 조금 오래 걸립니다. 뻗어버린 줄 알았습니다...
사용자 삽입 이미지



top


13.3. Controllers

Spring/Chapter 13 : 2007.05.09 23:12


컨트롤러는 MVC중 C에 해당하며 사용자의 입력을 받은 뒤 뷰에 보여주기 적당한 모델로 바꿔준다.

Spring은 다양한 컨트롤러들을 제공하는데 크게 폼 컨트롤러, 커맨드 기반 컨트롤러, 마법사 스타일의 컨트롤러로 나뉩니다.

Spring 컨트롤러의 가장 상위에 위치한 Controller 인터페이스는 다음과 같습니다.
public interface Controller {

    /**
     * Process the request and return a ModelAndView object which the DispatcherServlet
     * will render.
     */
    ModelAndView handleRequest(
        HttpServletRequest request,
        HttpServletResponse response) throws Exception;

}

모든 Controller 구현체들은 재사용 가능하며, Thread-safe 해야합니다.

Workflow
사용자 삽입 이미지
Request 요청이 들어오면 DisptacherServlet에서 Locale, Theme 등등을 확인하고 HandlerMapping을 사용하여 요청을 담당할 컨트롤러를 물색합니다.

요청을 처리할 컨트롤러를 찾으면 그 컨트롤러의 handleRequest 메소드에게 HttpServletRequest와 HttpServletReponse 객체를 인자로 넘겨주며 호출합니다.

해당 컨트롤러는 요청을 처리하고 넘겨줄 ModelAndView 객체가 있다면 DispatcherServlet에게 해당 객체를 넘겨줍니다.

Notes on design and testing

Servlet API에 종속되어 기존 Servlet 의 기능을 모두 사용할 수 있습니다.

Servlet API에 의해 제공되는 HttpServletRequest 와 HttpServletResponse의 Mock 객체를 사용하여 handleRequest 메소드를 테스트 할 수 있습니다.

'Spring > Chapter 13' 카테고리의 다른 글

13.4.2. SimpleUrlHandlerMapping  (0) 2007.05.11
13.4.1. BeanNameUrlHandlerMapping  (0) 2007.05.11
13.4. Handler mappings  (0) 2007.05.11
13.3.4. Command controllers  (0) 2007.05.11
13.3.3. The MultiActionController  (2) 2007.05.10
13.3.2. Other simple controllers  (4) 2007.05.10
13.3.1. AbstractController and WebContentGenerator  (0) 2007.05.10
13.3. Controllers  (0) 2007.05.09
13.2. The DispatcherServlet  (0) 2007.05.07
13.1. Introduction  (0) 2007.05.07
13. Web MVC framework  (0) 2007.05.07
top


숙제 3

Hibernate/study : 2007.03.01 23:43


Controller
- Spring reference :: Chapter 13
- Spring API :: Controller
- Spring MVC :: p52(71)
- Pro Spring :: p531
- 영회형 전 블로그 :: Spring MVC컨트롤러 탐험기[1] Controller와 ModelAndView

SimpleFormController
- Spring reference

more..

- Spring API :: SimpleFormController
- Spring MVC :: p65(84)
- Pro Spring :: p547

PropertyEditor
- Spring Reference :: Chapter 5
- Java API :: PropertyEditor
- 영회형 블로그 :: Spring 기본 지원 Property type
- 영회형 전 블로그 :: Spring MVC 사용시 다수의 문자열을 List로 받기
- Whiteship 전 블로그 ::  Spring reference 5장 정리
- Spring MVC :: p124(143)
- Pro Spring :: p126

CoC
- Convention over Configuration 의 약어로 "설정을 능가하는 규약" 정도의 의미.
- http://softwareengineering.vazexqi.com/files/pattern.html
- Convention vs Configuration
- CoC in Spring MVC

top


Controller



참조 : org.springframework.web.servlet.mvc.Controller

MVC 모델에서 C에 해당하는 녀석으로 주로 Servlet이 이 역할을 담당하고 있었고 Struts에서는 Action이라는 것이 역할을 하고 있었는데 Spring MVC를 사용하면 Servlet = Controller or Action = Controller 라고 외우지 않아도 "Controller는 Controller다." 라고 그냥 받아 들이면 되서 편하네요.

Controller API를 보면 책임이 딱 한 개 있는 것이 보입니다.
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
HttpServletRequest와 HttpServletResponse 객체를 받아서 ModelAndView 객체를 반환합니다.
사용자 삽입 이미지
이렇게 그리면 되는건지.. 흠..시퀀스 다이어그램은 익숙치가 않아서 많이 보고 그려봐야겠네요.

'Spring MVC > 6장 Controller' 카테고리의 다른 글

AbstractController  (0) 2007.06.21
Non-String DataBinding 테스트하기  (0) 2007.06.21
간단한 DataBinding 테스트하기  (0) 2007.06.20
MultiactionController  (0) 2007.06.19
SimpleFormController's onSubmit()  (0) 2007.04.11
SimpleFormController  (0) 2007.02.28
Controller  (0) 2007.02.28
top


DisplayTag 링크 기능



참조 : http://displaytag.sourceforge.net/11/tut_links.html

<display:column property="name" title="이름" href="detail.do" paramId="id" paramProperty="id" sortable="true" />
이런식으로 지정해 주면 detail.do 로 링크가 생기며 이 링크로 객체의 id를 id라는 이름으로 넘겨 줍니다.

이것을 받아서 member 한명에 대한 정보를 뿌리는 controller를 만듭니다.

more..

id로 넘어온 id를 받은 뒤 그것을 가지고 member 객체를 가져오고 다시 member 객체를 detail이라는 view와 함꼐 ModelAndView 객체에 담아서 리턴합니다. 그럼 viewResolver에 의해서 detail.jsp를 찾아가게 될 것입니다.

more..


JSTL을 사용하기 위해 taglib을 지정해 주고 이 페이지에 member객체가 넘어 왔을 테니깐 "${member.name}" 이런식으로 사용해주면 됩니다.

사용자 삽입 이미지

결과는..
사용자 삽입 이미지

'Spring > 주소록 만들기' 카테고리의 다른 글

DisplayTag 링크 기능  (0) 2007.02.08
Validator 사용하기  (0) 2007.02.07
검색창 하나로 모든 필드에서 검색하기.  (4) 2007.02.07
SimpleFormController 에피소드2  (0) 2007.02.02
SimpleFormController 에피소드1  (2) 2007.02.02
Spring's form tag  (0) 2007.02.01
DisplayTag과 SpringMVC  (0) 2007.01.31
DisplayTag 배끼기  (2) 2007.01.31
주소록 개발 카탈로그  (4) 2006.12.30
JSP 화면 작성  (0) 2006.12.29
Spring MVC configuration 파일들 설정 하기  (0) 2006.12.26
top


MVC 컨트롤러 작성



참고 : Spring MVC 어플리케이션 개발 <5> MVC 컨트롤러 작성

현재 진행 중인 이클립스 프로젝트(webAddress)에서 src폴더에 member.web 패키지를 만듭니다. Spring에서 제공하는 AbstractController를 상속받는 MemberListController 클래스를 생성합니다.

package member.web;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class MemberListController extends AbstractController {

    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest arg0,
            HttpServletResponse arg1) throws Exception {
        // TODO Auto-generated method stub
        return null;
    }

}


Member의 List를 반환하도록 handleRequestInternal() 메소드를 구현합시다. 그 전에 arg0과 arg1을 request와 response로 보다 명확한 이름을 사용하도록 바꿔줍니다.

구현하기전에 Spring MVC에 손대기 전에 만들어 두었던 Service, DAO, Domain layer를 구현했던 코드를 jar파일로 묶어서 WEB-INF/lib에 추가해줍니다. 그리고 개발 할 때 사용한 jar파일들도 추가해 줍니다.

more..


public class MemberListController extends AbstractController {

    private MemberRepository memberRepository;

    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest request,
            HttpServletResponse response) throws Exception {

        List<Member> memberList = memberRepository.getAllMembers();
        return new ModelAndView("index", "memberList", memberList);
    }

    public void setMemberRepository(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

Member의 List를 jsp에서 사용할 수 있도록 위와 같이 코딩을 합니다.
녹색 글자 부분은 MemberRespository[각주:1]를 Spring의 IOC를 이용하기 위한 것입니다.
파란 글자 부분은 기존에 구현해 둔 MeberRepository를 사용하여 Member 리스트를 가져오도록 코딩을 했습니다.
보라색 부분은 "index"라는 View 이름에게[각주:2] memberList(세번째 인자)를 memberList(두번째 인자)라는 이름으로 참조 할 수 있도록 던지는 부분입니다.

이제 코딩은 끝났고 환경 설정 파일을 이리 저리 바꿔주고 옮겨주는 일이 남았습니다.

  1. Service Interface입니다. [본문으로]
  2. View Resolver에서 해당하는 파일 이름으로 변환해 줍니다. [본문으로]

'Spring > 주소록 만들기' 카테고리의 다른 글

DisplayTag과 SpringMVC  (0) 2007.01.31
DisplayTag 배끼기  (2) 2007.01.31
주소록 개발 카탈로그  (4) 2006.12.30
JSP 화면 작성  (0) 2006.12.29
Spring MVC configuration 파일들 설정 하기  (0) 2006.12.26
MVC 컨트롤러 작성  (0) 2006.12.26
화면 작성  (0) 2006.12.26
Alt + Shift + X, R 주의  (2) 2006.12.25
Web Application Context 작성  (3) 2006.12.25
Spring MVC 구동을 위한 web.xml 작성  (0) 2006.12.25
이클립스에서 웹 프로젝트 생성하기  (0) 2006.12.25
top


Web Layer



Web Layer

이 계층에서 다루는 주요 기능 두가지
- Navigation Logic 담당
- Domain model 과 Service Layer의 중계자 역할

특징
- servlet 으로 간단하게 구현될 수 있다. 이런 servlet은 request 파라미터를 객체로 바꾸고 service 인터페이스의 메소드를 호출한다.
- 유저들을 위해서 비즈니스 exception들을 적당한 에러 메시지로 바꿔야 하는 책임도 있다.

Spring MVC가 하는 일
- Spring MVC는 request 파라미터를 비즈니스 로직이 직접 작동할 수 있는 POJO로 맵핑하는 등의 request 파라미터와 비즈니스 로직 계층간의 복잡한 메카니즘을 제공한다.
- Spring은 request들을 처리하고 확장이 편하도록 복잡한 업무 흐름을 구현하고 있다.

종속성
-Service Layer(web에서 받은 정보를 service layer에 전해 줄 domain 객체로 전환)
-Domain Layer
사용자 삽입 이미지
Spring MVC Web Layer API
- org.springframework.web.servlet.mvc.Controller 인터페이스
- HttpServletRequest와 HttpServletResponse를 받을 때 필요하다.
- client에게 정보를 돌려줄 때 ModelAndView 객체를 만든다.


'Spring MVC > 3장 Spring MVC' 카테고리의 다른 글

Spring MVC에서 사용하는 ApplicationContext와 WebApplicationContext  (6) 2008.07.03
Service Layer  (2) 2006.12.13
Web Layer  (0) 2006.12.12
User Interface Layer  (0) 2006.10.09
Layers of Abstractions  (0) 2006.10.08
top