Programming/Spring

[Spring] 요청 메서드의 반환 자료형

Isaac S. Lee 2023. 11. 22. 12:42

요청 메서드의 반환 자료형은 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 데이터를 배열로 묶어서 보낼 수 있다.