[Spring] Parameter 로 query string 가져오기
🧶 𝗪𝗲𝗯/Spring

[Spring] Parameter 로 query string 가져오기

 

 

 parameter 로 query string 가져오기 

개요

이번에는 url query 를 가져오는 방법에 대해서 알아보겠습니다.

원래는 Servlet 에서 HttpServletRequest 을 통해서 request.getParameter("name") 이런식으로 가져오던 것을 Spring 에서는 method 파라미터로 바로 가져올 수 있습니다.

package com.mycom.myapp;


import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;


@Controller
public class ParamController {

	@RequestMapping("/hello")
	public void m1(HttpServletRequest request) {
		System.out.println(request.getParameter("no"));
	}
}

물론 Spring 에서도 HttpServletRequest 을 이용해서 query string 을 가져올 수 있습니다.

 

 

Parameter 로 받기

package com.mycom.myapp;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;


@Controller
public class ParamController {

	@RequestMapping("/hello")
	public void m1(int no) {
		System.out.println(no);
	}
}

request.getParameter() 하던 것을 바로 int no 파라미터로 받아 사용할 수 있습니다.

이는 그러나 쿼리로 no 가 들어오지 않으면 (즉, "/hello" 가 되면) 오류가 생깁니다.

java.lang.IllegalStateException: Optional int parameter 'no' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.

이러한 로그가 찍힙니다.

 

 

m1(@RequestParam(value="no", required=false) int no)

package com.mycom.myapp;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;


@Controller
public class ParamController {

	@RequestMapping("/hello")
	public void m1(@RequestParam(value = "no", required = false) int no) {
		System.out.println(no);
	}
}

no 가 값이 들어오지 않아도 오류가 생기지 않게 하려면, required 옵션을 false 로 주면 됩니다.

true 로 주면 default 이기 때문에 null 이 들어오면 오류가 발생합니다.

 

 

m1(Integer no)

package com.mycom.myapp;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;


@Controller
public class ParamController {

	@RequestMapping("/hello")
	public void m1(Integer no) {
		System.out.println(no);
	}
}

int no 은 null 이 들어오면 오류가 나지만, 객체 타입으로 파라미터를 받으면 null 이 들어와도 오류가 나지 않습니다.

 

 

m1(Hello h)

package com.mycom.myapp;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.mycom.myapp.dto.Hello;


@Controller
public class ParamController {

	@RequestMapping("/hello")
	public void m1(Hello h) {
		System.out.println(h);
	}
}

Hello Dto 로 파라미터를 받으면 자동으로 쿼리가 세팅이 됩니다.

원래는 getParameter("no") 이런식으로 받아서 h.setNo(no) 이렇게 세팅을 했었죠.

무척 간편한 방법입니다.

어떻게 이렇게 바로 세팅을 하는 걸까요? 아래는 만든 Hello Dto 입니다.

package com.mycom.myapp.dto;


public class Hello {
	private int no;
	private String lang;


	public int getNo() {
		return no;
	}


	public void setNo(int no) {
		this.no = no;
	}


	public String getLang() {
		return lang;
	}


	public void setLang(String lang) {
		this.lang = lang;
	}


	@Override
	public String toString() {
		return "Hello [no=" + no + ", lang=" + lang + "]";
	}

}

여기서 보시면 getter, setter 가 query string 과 매핑이 됩니다.

멤버 변수는 상관이 없고 getter, setter 의 이름이 중요합니다.

 

 

m1(@RequestParam Map<String, String> params)

package com.mycom.myapp;


import java.util.Map;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;


@Controller
public class ParamController {

	@RequestMapping("/hello")
	public void m1(@RequestParam Map<String, String> params) {
		System.out.println(params.get("no"));
		System.out.println(params.get("lang"));
	}
}

만약 여러가지 query 을 받고 그중에서 몇개만 쓰고 싶을 때는 이렇게 Map 으로 params 를 받아서 필요한 것만 get() 해서 사용하면 됩니다.

 

 

header 정보 받기

package com.mycom.myapp;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;


@Controller
public class ParamController {

	@RequestMapping("/hello")
	public void m1(
	    @RequestHeader(value = "Accept") String accept,
	    @RequestHeader(value = "host") String host
	) {
		System.out.println(accept);
		System.out.println(host);
	}
}

@RequestHeader 을 이용하면 됩니다.

 

 

 

 

 

 

 

 

 

 

 

# Spring RequestMapping parameter # Spring parameter # Spring parameter mapping


 

728x90