요청 메서드의 반환 자료형은 String의 빈도가 가장 높고, 다음으로 3번의 redirect, 5번의 사용 빈도가 높다.
요청과 응답은 어떤 업무든 연관이 되어 있기 때문에 이에 대한 정리가 필요하다.
🌿String
//- JSP 파일명
//- ViewResolver 호출
@GetMapping(value="/ex06.do")
public String test() {
return "ex06";
}
문자열은 ViewResolver를 호출하면서 JSP 파일 이름을 나타내는 용도로 사용했다.
🌿void
@GetMapping(value="/ex06.do")
public void test() {
}
서블릿에서 jsp를 호출을 안 하는 것과 같다. 그러면 브라우저에서 하얀 화면이 나와야 한다.
그런데 화면이 출력된다. void로 하면 Spring이 분석하여 자동으로 요청 주소와 동일한 이름의 JSP 페이지를 찾아서 호출하기 때문이다.
🌿String(키워드)
- redirect
- forward
//3. String (redirect)
@GetMapping(value="/ex06.do")
public String test() {
//resp.sendRedirect("/ex05.do")
return "redirect:/ex05.do";
}
//3. String (forward)
@GetMapping(value="/ex06.do")
public String test() {
//pageContext.forward()
return "forward:/ex05.do";
}
약속한 키워드를 String으로 반환할 수 있다.
response 없이 돌아가고 싶은 주소 앞에 redirect 접두어를 붙이기만 하면 이동한다.
redirect는 사용중이던 request와 response가 새로 만들어지지만, forward는 유지되기 때문에 데이터를 넣어서 전송할 수 있다는 특징이 있다.
🍃RedirectAttributes
@GetMapping(value="/ex06.do")
public String test() {
return "redirect:/ex05.do?seq=10&type=2";
}
위와 같이 파라미터 데이터를 가지고 넘어가야 할 때 다음의 방법을 사용할 수 있다.
@GetMapping(value="/ex06.do")
public String test() {
String seq = "5";
String type = "2";
return "redirect:/ex05.do?seq=" + seq + "&type=" + type;
}
위와 같이 구현할 수도 있지만, Spring에서는 RedirectAttributes를 구현해 두었다.
이를 이용해서 키, 값 형태로 데이터를 넣을 수 있다.
@GetMapping(value="/ex06.do")
public String test(RedirectAttributes rttr) {
String seq = "5";
String type = "2";
rttr.addAttribute("seq", seq);
rttr.addAttribute("type", type);
//return "redirect:/ex05.do?seq=" + seq + "&type=" + type;
return "redirect:/ex05.do";
}
이 값은 자동으로 redirect의 주소 뒤에 쿼리 스트링으로 붙기 때문에 따로 작성하지 않아도 된다.
🌿JSON 반환
jar파일 설치: Jackson
DTO를 다른 타입으로 바꿔줄 Jackson jar 파일을 설치해야 한다.
https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind/2.16.0
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.16.0</version>
</dependency>
이 코드를 pom.xml에 추가한다.
@ResponseBody
@GetMapping(value="/ex06.do")
public @ResponseBody SpringDTO test() {
SpringDTO dto = new SpringDTO();
dto.setName("Isaac");
dto.setAge("20");
dto.setAddress("Seoul");
return dto;
}
JSON 형태로 값을 돌려주기 때문에 Ajax 요청에 대한 응답을 기존보다 편하게 할 수 있다.
JSON 배열
@GetMapping(value="/ex06.do")
public @ResponseBody List<SpringDTO> test() {
SpringDTO dto1 = new SpringDTO();
dto1.setName("Isaac");
dto1.setAge("20");
dto1.setAddress("Seoul");
SpringDTO dto2 = new SpringDTO();
dto2.setName("Sopia");
dto2.setAge("21");
dto2.setAddress("Seoul");
List<SpringDTO> list = new ArrayList<SpringDTO>();
list.add(dto1);
list.add(dto2);
return list;
}
JSON Array로 묶는 과정 없이 @ResponseBody를 이용하면 여러 개의 JSON 데이터를 배열로 묶어서 보낼 수 있다.