[Spring] HTTP 요청 파라미터 & Response view

보람·2023년 4월 26일
0

Spring

목록 보기
3/18

1. HTTP 요청 파라미터

  • 스프링이 제공하는 @RequestParam, @ModelAttribute을 사용하면 요청 파라미터를 매우 편리하게 이용할 수 있다.

(1) @RequestParam

  • String, int같은 단순 타입의 파라미터를 받아올 때 사용
  • 파라미터 이름으로 바인딩하는 방법

💡 기본 예시

	@ResponseBody
	@RequestMapping("/request-param-v2")
	public String requestParamV2(@RequestParam("username") String memberName, @RequestParam("age") int memberAge) {
		// 콘솔창에 띄우기
		System.out.println("username : " + memberName);
		System.out.println("age : " + memberAge);
		// 브라우저에 띄우기
		return "ok v2";
	}

📌 @ResponseBody

  • view조회를 무시하고, HTTP message body에 직접 해당 내용 입력
  • http://localhost:9090/request-param-v2?username=홍길동&age=17
    • @RequestParam("username") String memberName
      • username으로 파싱해서 String memberName으로 받아옴
      • memberName = 홍길동
    • @RequestParam("age") int memberAge
      • age로 파싱해서 int memberAge으로 받아옴
      • memberAge = 17

💡 HTTP 파라미터 이름이 변수 이름과 같으면 @RequestParam("XXX") 생략 가능

	@ResponseBody
	@RequestMapping("/request-param-v3")
	public String requestParamV3(@RequestParam String username, @RequestParam int age) {
		
		System.out.println("username : " + username);
		System.out.println("age : " + age);
	
		return "ok v3";
	}

@RequestParam("username") String memberName@RequestParam String username

💡 String, int 등의 단순 타입이면 @RequestParam도 생략가능

	@ResponseBody
	@RequestMapping("/request-param-v4")
	public String requestParamV4(String username, int age) {
		
		System.out.println("username : " + username);
		System.out.println("age : " + age);
	
		return "ok v4";
	}

@RequestParam String username, @RequestParam int ageString username, int age

💡 파라미터값에 대한 필수 여부

	@ResponseBody
	@RequestMapping("/request-param-required")
	public String requestParamRequired(@RequestParam(required = true) String username, @RequestParam(required = false) Integer age) {
		
		System.out.println("username : " + username);
		System.out.println("age : " + age);
	
		return "ok required";
	}

required = false : 파라미터 누락 가능
required = true : 파라미터 반드시 필요

int등 단순 변수 타입에 null값 ❌ -> wrapper 타입으로 변경 Integer age

💡 defaultvalue : 기본값 세팅

	@ResponseBody
	@RequestMapping("/request-param-default")
	public String requestParamDefault(@RequestParam(required = true, defaultValue = "guest") String username, @RequestParam(required = false, defaultValue = "-1") Integer age) {
		
		System.out.println("username : " + username);
		System.out.println("age : " + age);
	
		return "ok defaultValue";
	}

required = true : 파라미터 반드시 필요
defaultValue = "guest" : username 기본값 "guest"
defaultValue = "-1" : age 기본값 "-1"

localhost:9090/request-param-default?username=처럼 빈 문자열도 사용가능

(2) @ModelAttribute

  • String, int같은 단순 타입 외에 사용자 정의 객체 사용 시

💡 기본 예시

  • 객체 생성
public class HelloData {

	private String username;
	private int age;
	

	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	@Override
	public String toString() {
		return "HelloData [username=" + username + ", age=" + age + "]";
	}
	
}
	@ResponseBody
	@RequestMapping("/model-attribute-v2")
	public String modelAttributeV2(@ModelAttribute HelloData helloData) {
		
		System.out.println("username : " + helloData.getUsername());
		System.out.println("age : " + helloData.getAge());
		System.out.println("helloData : " + helloData.toString());
		
		return "ok hellodata";
	}

@ModelAttribute : 다음의 코드 자동화

		HelloData helloData = new HelloData();
		helloData.setUsername(username);
		helloData.setAge(age);

💡 @ModelAttribute 생략가능

	@ResponseBody
	@RequestMapping("/model-attribute-v3")
	public String modelAttributeV3(HelloData helloData) {
		
		System.out.println("username : " + helloData.getUsername());
		System.out.println("age : " + helloData.getAge());
		System.out.println("helloData : " + helloData.toString());
		
		return "ok hellodata3";
	}

@ModelAttribute HelloData helloDataHelloData helloData

2. Response View

💡 뷰 생성

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<p th:text="${data}">empty</p>
</body>
</html>

(1) ModelAndView

💡 사용 예시

	@RequestMapping("/response-view-v1")
	public ModelAndView responseViewV1() {
		ModelAndView mav = new ModelAndView("response/hello")
									.addObject("data","hello");
		return mav;
	}

new ModelAndView("response/hello") : 뷰 경로
.addObject("data","hello") : 데이터 담는 곳
"data" : key 값
"hello" : value 값

(2) Model

💡 사용 예시

	@RequestMapping("/response-view-v2")
	public String responseViewV2(Model model) {
		model.addAttribute("data","hello2");
		return "response/hello";
	}

model.addAttribute("data","hello2") : 데이터 담는 곳
"data" : key 값
"hello2" : value 값

💡 @ResponseBody를 사용한다면

	@ResponseBody
	@RequestMapping("/response-view-v3")
	public String responseViewV3(Model model) {
		model.addAttribute("data","hello2");
		return "response/hello";
	}

@ResponseBody ❌ : response/body로 뷰 리졸버가 실행되어서 뷰를 찾고 렌더링
@ResponseBody ⭕ : 뷰 리졸버를 실행하지 않고 , http 메시지 바디에 직접 response/body라는 문자열을 반환

profile
안녕하세요, 한보람입니다.

0개의 댓글