Spring MVC/02.Spring @MVC

03. Controller 작성 2

  • -

이번 시간에는 요청 처리 메서드의 리턴과 페이지 이동에 대해 살펴보자.

요청 처리 메서드의 리턴

 

return type

요청 처리 메서드는 일반적으로 String을 반환 한다. 이 값은 논리적인 View 이름(logical view name)으로 D.S을 거쳐 ViewResolver(예: ThymeleafViewResolver)로 전달된다.

ViewResolver는 사용하는 View 기술에 따라 미리 정해진 설정을 이용하여 실제 View 페이지와 연결된다. 다음은 application.properties에 설정된 기본 옵션이다. 아래 설정을 보면 왜 /templates/경로에 템플릿 파일을 저장해야 하는지 알 수 있다.

spring.thymeleaf.prefix=classpath:/templates/          # 기본 값이므로 설정할 필요는 없다.
spring.thymeleaf.suffix=.html

 

return 타입으로 void를 사용할 수도 있는데 이 경우는 request path 와 동일한 이름의 page를 사용하는 경우이다.

예를 들어 다음 코드는 결과적으로 index를 리턴하는 것과 동일한 효과가 있다.

@GetMapping("/index")
public void index(Model model) {
    model.addAttribute("message", "index");
}

이 외에도 ModelAndView를 반환할 수 있는데 이 객체는 이름 그대로 Modle과 View를 함께 설정할 수 있는 객체이다.

 

rorword

웹에서 컴포넌트 간(Servlet -> JSP 등) 호출을 위해서는 forward와 redirect가 사용된다.

리턴 값으로 view name만 넘긴 경우 내부적으로 forward 기법을 이용해서 page를 호출한다. forward는 request scope에 저장된 정보를 활용할 수 있는데 Model 객체에 저장한 attribute가 이 영역에 저장된다.

기본 이동을 forward

이제까지 처리했던 기본 이동 방식으로 forward를 이용한 방식이므로 별도의 테스트는 생략한다.

 

redirect와 flash scope

만약 redirect 형식으로 다른 자원을 호출하려는 경우는 redirect:를 추가해준다. path가 /로 시작하는 경우 절대경로를 의미하는데 이때 최상위 경로는 context path 이다. HttpServletResponse를 통해서 redirect 할 때는 /가 container root여서 추가로 context root를 개입시켜야 했는데 이 부분이 좀 더 편리해졌다.

redirect를 이용한 페이지 이동

 

redirect로 이동한 페이지에서는 최초의 요청과는 다른 전혀 새로운 요청이 생성된다. 따라서 추가적인 정보를 전달하기 위해서는 Model에 정보를 저장하는 것은 의미가 없다. 그럼 어떤 방식으로 정보를 전달해야 할까?

redirect된 페이지에서 정보를 확인하기 위해서는 queryString을 이용하거나 session을 사용할 수 있다. 이것들을 편리하게 사용할 수 있게 도와주는 클래스로 RedirectAttributes가 제공된다. RedirectAttributes는 Model을 상속받았기 때문에 사용법은 Model과 유사하다.

  • queryString 형태로 url 뒤에 붙여주기: 가장 간단히 url 뒤에 redirect:/url?paramName=paramValue 형태로 추가해준다. RedirectAttributes의 attribute레 설정한 데이터는 URL에 queryString 형태로 전달된다.
  • session 활용: request scope 보다 큰 영역인 session scope에 데이터를 저장한다. 하지만 로그인 정보처럼 여러 요청에 거쳐서 사용되는 정보가 아니라 특정 요청에 대한 결과를 세션에 저장하는 것은 공간의 낭비를 유발하므로 바로 지워줘야 하는 번거로움이 존재한다. 이를 위해 Spring에서는 flash scope라는 것을 제안하는데 이는 1회성 세션으로 session 영역에 데이터를 저장했다가 한번 실행하면 삭제해준다. flash scope에 데이터를 저장하기 위해서는 addFlashAttribute를 이용한다.
@GetMapping("/redir")
public String redir(Model model, RedirectAttributes redir) {
    log.debug("redir");
    redir.addAttribute("redirAttr", "redirAttr");
    redir.addFlashAttribute("flashAttr", "flashAttr");
    model.addAttribute("modelAttr", "modelAttr");
    return "redirect:/index";                   
}
@Test
public void redirectTest() throws Exception{
    // given
    String url = "/redir";
    MockHttpServletRequestBuilder builder =  MockMvcRequestBuilders.get(url);
    // when
    ResultActions result = mock.perform(builder);
    // then
    result.andExpect(MockMvcResultMatchers.status().is3xxRedirection())
            .andExpect(MockMvcResultMatchers.model().attributeDoesNotExist("modelAttr"))
            .andExpect(MockMvcResultMatchers.redirectedUrl("/index?redirAttr=redirAttr"))
            .andExpect(MockMvcResultMatchers.flash().attribute("flashAttr", "flashAttr"));
    }

 

'Spring MVC > 02.Spring @MVC' 카테고리의 다른 글

06. 파라미터의 formatting  (0) 2020.07.07
05. Handler Interceptor  (1) 2020.07.03
04. 웹과 관련된 설정  (0) 2020.07.02
02. Controller 작성 1  (0) 2020.06.30
01. Spring MVC 개요  (5) 2020.06.29
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.