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
'🧶 𝗪𝗲𝗯 > Spring' 카테고리의 다른 글
[Spring] Lombok 다운 및 세팅 (0) | 2022.12.02 |
---|---|
[Spring] MyBatis 환경 세팅 (0) | 2022.10.20 |
[Spring] RequestMapping 방법 - url 매핑 (0) | 2022.10.19 |
[스프링 입문] 2.스프링 웹 개발 기초 - API (0) | 2021.10.05 |
[스프링 입문] 2.스프링 웹 개발 기초 - MVC와 템플릿 엔진 (0) | 2021.10.05 |