[Spring MVC] - QueryString

QueryString

URL로 전달되는 문자열

사용자가 "list? p=1"과 같이 URL에 쿼리 스트링을 사용해 특정 조건을 요청할 경우 request 객체를 가져와 사용할 수 있습니다.

Servlet Programming 에서는 다음과 같은 방식으로 HTTP 요청의 파라미터를 얻을 수 있습니다.

@RequestMapping("/index")
public void index(HttpServletRequest req) {
    String p = req.getParameter("p");
    int value = Integer.parseInt(p);
}

 

하지만 Spring MVC 는 위와 같은 방식보다 조금 더 편한 방식을 제공해주고 있습니다. 사용 방법은 아래와 같습니다.

@RequestMapping("/index")
public void index(String p) {
    int value = Integer.parseInt(p);
}

 

이는 스프링의 Front Controller 에서 getParameter() 함수를 통해 미리 전달된 값을 해당 함수의 매개변수로 전달함으로써 가능하게 되는 것입니다. 여기서 'p'라는 변수명은 프론트 컨트롤러와 컨트롤러 간의 묵시적인 약속이라고 할 수 있습니다.

쿼리 이름이 p 가 아닌 no 라면 no 라고 지정해 주어야 합니다.

 

하지만 만약 컨트롤러에서 변수명을 바꾸고 사용하고 싶다면 어떻게 해야 할까요? 예를 들어 'p'가 아닌 'page' 같은 변수명으로 바꾸고 싶다면 말이죠.

 

우선 다음과 같이 구현할 경우 당연히 프론트 컨트롤러에서 생성된 변수명과 매칭되지 않기 때문에 page 변수에는 null 값이 전달되게 됩니다.

@RequestMapping("/index")
public void index(String page) {
    int value = Integer.parseInt(page);
}

 

이러한 경우 @RequestParam 어노테이션을 사용하여 프론트 컨트롤러의 변수명과 컨트롤러의 변수명을 매칭시킬 수 있습니다.

@RequestMapping("/index")
public void index(@RequestParam("p") String page) {
    int value = Integer.parseInt(page);
}

 

때로는 사용자가 쿼리 스트링을 전달하지 않는 경우도 생길 수 있습니다. 이럴 경우 위에서처럼 사용할 경우 오류가 발생하게 됩니다. 따라서 @RequestParam 어노테이션의 defaultValue 속성을 지정하여 기본값을 지정해주어야 합니다.

@RequestMapping("/index")
public void index(@RequestParam(name="p", defaultValue="1") String page) {
    int value = Integer.parseInt(page);
}

 

하지만 여기서 더 나아가 defaultValue 가 꼭 필요없는 경우, 만약 쿼리가 없어도 그냥 무시하고 싶은 경우 required 옵션을 추가해 주면 됩니다. 해당 옵션을 false로 주면 쿼리 스트링을 전달하지 않아도 오류가 발생하지 않습니다.

@RequestMapping("/index")
public void index(@RequestParam(value="p", required=false) String page) {
    int value = Integer.parseInt(page);
}

 

여기서 name 을 value라고 바꾸어 봤는데 name, value 어떤 값을 쓰든 상관이 없습니다.

쿼리 스트링 객체 타입으로 받기

앞서 예시에서 설명한 것처럼 쿼리스트링을 받지 않을 때 따로 설정하지 않는다면 오류가 나지만, 객체 타입으로 파라미터를 받는다면 Null 값이 들어와도 오류가 나지 않습니다.

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 + "]";
	}

}
@Controller
public class ParamController {

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

 

이렇게 설정을 하면 자동으로 쿼리가 세팅이 됩니다.

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

@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"));
	}
}

'Spring' 카테고리의 다른 글

Spring - @Value  (2) 2024.12.20
Spring Bean 을 등록하는 3가지 방법  (1) 2024.12.19
스프링 빈(Bean) 이란?  (1) 2024.12.16
Spring - 경로 변수  (0) 2024.12.12