반응형
1. Controller의 매개변수 사용
- Controller에서 필요한 정보를 쿠키로 저장하거나 세션으로 저장하기 위해서는 HttpServletRequest나 HttpServletResponse를 사용했다.
- 스프링에서도 역시나 쿠키나 세션처럼 HttpServletRequest나 HttpServletResponse을 사용할 때가 있다.
- 이럴 때는 Model을 매개변수에 선언해서 사용하는 것처럼 매개변수로 선언해준 다음에 사용하면 된다.
- JSP 때처럼 선언한 것을 그대로 가져와서 필요한 대로 사용하면 된다.
2. Redirect
- 데이터의 변환이 있을 때는 request의 데이터를 초기화하고 페이지를 이동하는 Redirect의 방법을 써야 한다.
- 스프링도 역시 이 방법을 이용해서 페이지를 이동해야 한다.
- 기존에 페이지를 이동할 때 ViewResolver가 앞뒤로 경로를 붙여주기 때문에 그냥 문자열 하나만 반환을 해줌으로 페이지 이동을 하였다.
- 하지만 Redirect로 페이지를 이동할려면 반환 값에 "redirect:요청명"을 반환해주면 된다.
- 이때 redirect : 뒤에는 jsp명이 아니라 요청명을 써줘야 원하는 페이지로 갈 수 있게 된다.
- Redirect로 페이지 이동을 할 때 Model를 사용하여 필요한 데이터를 보내게 되면 Redirect는 Model도 초기화를 시키게 돼서 되지 않는다.
- 그래서 Redirect로 페이지 이동을 할 때는 Model이 아니라 RedirectAttributes 객체를 이용하면 된다.
- 그리고 데이터를 보낼때에는 '객체명.addFlashAttribute("이름",값);' 으로 보내면 된다.
3. Controller Test 환경
- 개발을 하면서 mapper 테스트는 물론 Service 테스트도 해줘야 하며 당연하게 Controller도 잘 돌아가고 원하는 뷰로 가는지 Test를 해줘야 한다.
- Controller Test는 다른 거와 달리 따로 선언을 해줘야 하는 것이 있다.
- Controller를 테스트를 하기 위해서는 MVC가 필요하다.
- 그래서 우리는 가짜 MVC인 MockMvc를 만들어 이것을 MVC로 사용해 Test를 한다.
- Spring을 이용하기 때문에 @RunWith을 해줘야 하고 Controller 테스트는 Servlet을 이용해 뷰로 이동하는 것도 테스트하기 때문에 servlet-context.xml과 root-context.xml 둘 다 필요로 한다.
- 그리고 WebApplicationContext가 필요하므로 @WebAppConfiguration을 선언해줘야 한다.
- 가짜 MVC를 만들기 위해서는 WebApplicationContext가 필요로 하기 때문에 주입을 위해 @Setter를 해주고 테스트를 하는 모든 컨트롤러에는 MVC가 있어야 하므로 반복적으로 MVC를 만들어야 한다.
- 그래서 @Before이라는 어노테이션을 사용해 @Test를 하기 전에 무조건 실행을 시켜줌으로써 mvc 객체를 생성한다.
- mvc.perform으로 요청을 보내면 된다.
- mvc.perform(요청).andReturn().getModelAndView(); 로 perform으로 요청을 보내고 andReturn으로 반환 값을 받아 ModelAndView를 반환해줘서 ModelAndView 객체로 받는다.
- 그 받은 객체로 원하는 것을 log로 출력해서 우리가 원하는 Controller로 실행되고 있는지 테스트하면 된다.
- perform() 안에 있는 요청을 get, post 방식에 따라 나눌수 있고,. param을 이용해 요청에 필요한 파라미터도 보내줄 수 있다.
package com.koreait.controller;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.ModelAndView;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@Log4j
@ContextConfiguration({
"file:src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml",
"file:src/main/webapp/WEB-INF/spring/root-context.xml"
})
@WebAppConfiguration
public class UserControllerTests {
@Setter(onMethod_ = @Autowired)
private WebApplicationContext wac;
// 가짜 MVC
// 마치 브라우저에서 사용하는 것처럼 만들어서 Controller를 실행해 볼 수 있다.
private MockMvc mvc;
// org.junit.Before
// 적용된 메소드들을 모든 테스트 전에 한번씩 실행한다.
@Before
public void setup() {
// 컨트롤러를 테스트하기 위해서는 mvc가 필요하다 그래서 테스트 전에 무조건 mvc를 만들어놓는다.
mvc = MockMvcBuilders.webAppContextSetup(wac).build();
}
// @Test
// public void joinTest() throws Exception {
// ModelAndView mav = mvc.perform(MockMvcRequestBuilders.get("/user/join")).andReturn().getModelAndView();
//
// log.info(mav.getViewName());
// log.info(mav.getModelMap());
// }
@Test
public void joinTest() throws Exception {
// mvc.perform(요청) : 해당 요청대로 mockMVC가 수행
// 요청제작자 post 방식으로 /user/join으로 보내는 요청을 생성 요청을 보낼 때 파라미터 추가해서 요청 보내기
ModelAndView mav = mvc.perform(MockMvcRequestBuilders.post("/user/join").param("userid", "banana").param("userpw", "abcd1234").param("username","반하나")).andReturn().getModelAndView();
log.info(mav.getViewName()); // 반환된 결과 : 응답(뷰, 모델 등을 포함)
log.info(mav.getModelMap()); // 응답에서 모델과 뷰를 포함하고 있는 타입의 객체 받기
}
}
반응형
'웹개발 > Spring' 카테고리의 다른 글
[Spring] REST(Representational State Transfer), JSON(JavaScript Object Notation), Ajax(jQuery) (0) | 2022.08.03 |
---|---|
[Spring] MyBatis의 동적 태그, <![CDATA[ ]]> (0) | 2022.07.22 |
[Spring] 명명 규칙, Service, domain (0) | 2022.07.13 |
[Spring] Exception 처리, 스프링 MVC 프로젝트의 기본 구성(3-tier) (0) | 2022.07.06 |
[Spring] 스프링 MVC Controller의 특징, Postman (0) | 2022.07.04 |