[Spring] HTTP 요청 데이터 조회

형이·2023년 9월 22일

Spring

목록 보기
6/21
post-thumbnail

📝 HTTP 요청 데이터 조회

  • core3 파일의 RequestParamController 참고하면서 공부하기!

🖥️ 1. @RequestMapping

📌 스프링을 통해 깔끔하고 효율적으로 요청 데이터를 전달하는 방법을 알아보자!

	// 반환 타입이 없으면서 이렇게 응답에 값을 직접 넣으면 view 조회 X
	// http://localhost:9090/request-param-v1?username=hello&age=10
	// @RequestMapping : get, post 방식 상관 없이 사용하겠다는 의미
	@RequestMapping("/request-param-v1")
	public void requestParamV1(HttpServletRequest request, HttpServletResponse response) throws IOException {
		String username = request.getParameter("username");
		int age = Integer.parseInt(request.getParameter("age"));
		
		System.out.println("username : " + username);
		System.out.println("age : " + age);
		response.getWriter().write("ok");
	}

🖥️ 2. @RequestParam / @ResponseBody

  • 스프링이 제공하는 @RequestParam을 사용하면 요청 파라미터를 매우 편리하게 사용할 수 있다.
	/*
	 * @ResponseBody
	 *  - view 조회를 무시하고 Http message body에 직접 해당 내용 입력
	 * @RequestParam
	 *  - 파라미터 이르으로 바인딩
	 *  - @RequestParam("username")
	 *     = request.getParameter("username")
	 */
	@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 "ok2";
	}


	/*
	 * @RequestParam
	 *  - HTTP 파라미터 이름이 변수 이름과 같으면 @RequestParam(name="...") 생략 가능
	 */
	@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 "ok3";
	}


	/*
	 * @RequestParam
	 *  - String, int 등의 단순 타입이면 @RequestParam 생략 가능
     	  (파라미터에 대한 인지가 떨어질 수 있기 때문에 권장하는 방법은 아니다)
	 *  <주의사항>
	 *   - @RequestParam 어노테이션을 생략하면 스프링 MVC 내부에서 required=false를 적용한다.
	 *   - @RequestParam이 있으면 명확하게 요청 파라미터에서 데이터를 읽는다는 것을 알 수 있다.
	 */
	@ResponseBody
	@RequestMapping("/request-param-v4")
	public String requestParamV4( String username, int age ) {

		System.out.println("username : " + username);
		System.out.println("age : " + age);
		return "ok4";
	}

2-1. @RequestParam의 'required'

	/*
	 * required = true 이면 반드시 파라미터 값이 들어와야 한다.
	 */
	// http://localhost:9090/request-param-required?username=admin
    //		→ age의 값에 'null'을 넣는데 int 타입에는 null을 받아올 수가 없다.
	// int 타입에 'required = false'를 쓸 경우에는 Integer 타입으로 넣어주기!
	/*
	 *  1) /request-param-required : username이 없으므로 Exception 발생
	 *  2) /request-param-required?username= : 빈 문자열로 통과
	 *  3) /request-param-required?username=admin : int age에서 Exception 발생
     												(null을 int에 입력하는 것은 불가능하기 때문에 Integer로 변경해야 함)
	 *  											또는, defaultValue를 사용하면 된다.
	 */
	@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 "required";
	}

2-2. @RequestParam의 'defaultValue'

	/*
	 * defaultValue
	 *  - defaultValue는 빈 문자열의 경우에도 적용
	 *  - 이미 기본값이 있기 때문에 required는 의미가 없다.
	 */
	@ResponseBody
	@RequestMapping("/request-param-default")
	public String requestParamDefault( @RequestParam(required = true, defaultValue = "guest") String username, @RequestParam(required = false, defaultValue = "-1") int age ) {

		System.out.println("username : " + username);
		System.out.println("age : " + age);
		return "default";
	}

2-3. @RequestParam 파라미터를 Map으로 조회

	/*
	 * 파라미터를 Map으로 조회
	 *  - Map<key, value>
	 */
	@ResponseBody
	@RequestMapping("/request-param-map")
	public String requestParamMap( @RequestParam Map<String, Object> paramMap ) {

		System.out.println("username : " + paramMap.get("username"));
		System.out.println("age : " + paramMap.get("age"));
		return "map";
	}

🖥️ 3. @ModelAttribute


	// DTO로 받아오기
	// 사용 전
	@ResponseBody
	@RequestMapping("/request-attribute-v1")
	public String requestAttributeV1( @RequestParam String username, @RequestParam int age ) {
		HelloData helloData = new HelloData();
		helloData.setUsername(username);
		helloData.setAge(age);
		
		System.out.println("username : " + helloData.getUsername());
		System.out.println("age : " + helloData.getAge())
		;
		return "attr1";
	}
	
	// 사용 후
	/*
	 * @ModelAttribute
	 *  - model.addAttribute(helloData) 코드도 함께 자동 적용됨.
	 *  - 요청 파라미터의 이름으로 HelloData 객체의 프로퍼티를 찾는다.
     *  - 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩)한다.
	 */
	@ResponseBody
	@RequestMapping("/request-attribute-v2")
	public String requestAttributeV2(@ModelAttribute HelloData helloData) {
		
		System.out.println("username : " + helloData.getUsername());
		System.out.println("age : " + helloData.getAge());
		System.out.println("helloData : " + helloData.toString());
		return "attr2";
	}
	
	/*
	 * @ModelAttribute의 생략 가능
	 *  - String, int 같은 단순 타입 = @RequestParam 생략
	 *  - 객체로 파라미터가 넘어왔을 때 생략 = @ModelAttribute 생략
	 */
	@ResponseBody
	@RequestMapping("/request-attribute-v3")
	public String requestAttributeV3(HelloData helloData) {
		
		System.out.println("username : " + helloData.getUsername());
		System.out.println("age : " + helloData.getAge());
		System.out.println("helloData : " + helloData.toString());
		return "attr3";
	}

0개의 댓글