요청 파라미터 처리

스프링 컨트롤러에서 요청 파라미터를 처리하는 방법에 대해 다룬다.

요청 파라미터란

요청 파라미터(Request Parameter)란 사용자가 요청한 주소에 포함되어 있는 데이터를 말한다.

다음 두 페이지는 같은 페이지이지만 내용상의 차이가 있다.

좌측과 우측의 주소를 살펴보면 다음과 같다

  • (좌) - https://www.sysout.co.kr/home/search?k=java

  • (우) - https://www.sysout.co.kr/home/search?k=python

주소를 보면 ? 기호가 있고, 뒷 부분인 빨간 글자에는 =로 두 개의 글자가 연결되어 있다. ? 앞부분이 요청 주소이고, ? 뒷부분의 글자는 요청 파라미터이다. 컨트롤러에서는 해당 주소의 처리를 위해 파라미터를 수신할 수 있어야 한다.

프로젝트 생성

boot03parameter 프로젝트를 생성한다.

컨트롤러 생성

src/main/javacom.hacademy.boot03 패키지를 만들고 DemoController 를 생성한다.

DemoController.java
@Controller
public class DemoController {

}

매핑 생성

파라미터를 불러올 수 있는 매핑을 생성하는 방법은 여러 가지가 있다.

  • HttpServletRequest 사용

  • @RequestParam 사용

  • @ModelAttribute 사용

예제에서는 String 타입의 name 파라미터와 int 타입의 score 라는 항목을 파라미터로 수신하는 방법에 대해서 살펴본다. 다음과 같은 모양의 주소를 처리하도록 구성한다.

http://localhost:8080/test?name=피카츄&score=75

HttpServletRequest

HttpServletRequest는 사용자의 요청 정보가 담긴 요청 객체이다. 이 안에는 파라미터 뿐 아니라 클라이언트의 정보와 다양한 내장객체들이 포함되어 있다. 이 중 getParameter() 메소드를 사용하면 해당 이름에 대한 파라미터 정보를 조회할 수 있다. 없을 경우 null이 반환된다.

@RequestMapping("/test1")
@ResponseBody
public String test1(HttpServletRequest request) {
	String name = request.getParameter("name");
	int score = Integer.parseInt(request.getParameter("score"));
	return "name = " + name+", score = " + score;
}

JSP와 연결하지 않고 직접 수신한 내용을 화면에 출력하도록 @ResponseBody를 추가하였다.

브라우저에서 다음 주소로 접속하여 파라미터가 정상적으로 입력되는지 확인한다.

name이 없는 경우는 null이 출력되지만 score가 null이라면 Integer.parseInt()에서 오류가 발생한다.

만약 null인 경우까지 고려해서 받고 싶다면 코드가 복잡해진다.

@RequestMapping("/test1")
@ResponseBody
public String test1(HttpServletRequest request) {
	String name = request.getParameter("name");
	String scoreStr = request.getParameter("score");
	Integer score = scoreStr == null? null : Integer.valueOf(scoreStr);
	return "name = " + name+", score = " + score;
}

int는 null을 보관할 수 없으므로 Integer로 처리하면 없는 경우도 가능하다.

@RequestParam

Spring에서는 자동화된 방식을 지원한다. @RequestParam 을 사용하여 매개변수에서 파라미터 수신 처리를 할 수 있다.

@RequestMapping("/test2")
@ResponseBody
public String test2(@RequestParam String name, @RequestParam int score) {
	return "name = " + name + ", score = " + score;
}

매개변수 좌측에 @RequestParam 선언을 하여 파라미터임을 명시하면 Spring에서 해당하는 파라미터를 찾아 값을 대입한다. 필요하다면 자료형 변환도 자동으로 수행한다.

이 경우 파라미터가 존재하지 않으면 400 error가 발생한다.

만약 파라미터가 존재하지 않는 경우도 처리하고 싶다면 @RequestParam에 옵션을 설정해야 한다.

@RequestMapping("/test2")
@ResponseBody
public String test2(
	@RequestParam(required=false) String name, 
	@RequestParam(required=false) Integer score) {
	return "name = " + name + ", score = " + score;
}

defaultValue 옵션을 통해 기본값을 설정할 수 있다.

@ModelAttribute

@ModelAttribute를 사용하면 객체를 이용하여 파라미터를 처리할 수 있다. 먼저 파라미터를 담을 객체의 클래스(DemoEntity)를 생성한다.

DemoEntity.java
 public class DemoEntity {
	private String name;
	private int score;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
	@Override
	public String toString() {
		return "DemoEntity [name=" + name + ", score=" + score + "]";
	}
}

Lombok을 사용할 경우 setter, getter, toString() 등을 생략할 수 있다.

컨트롤러에 다음과 같이 매핑을 추가한다.

@RequestMapping("/test3")
@ResponseBody
public String test3(@ModelAttribute DemoEntity entity) {
	return entity.toString();
}

이 경우 파라미터가 존재하지 않아도 실행이 되며, 클래스에 기본값을 설정했다면 해당하는 값으로 초기화된다.

@ModelAttribute로 생성한 객체는 Model을 선언한 경우 Model 객체에 자동 추가된다.

Last updated