요청 파라미터 처리

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

요청 파라미터란

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

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

(좌) java 검색 결과 (우) python 검색 결과

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

  • (좌) - 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()에서 오류가 발생한다.

name이 없는 경우
score가 없는 경우

만약 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();
}

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

name, score 둘 다 없는 경우
name만 있고 score가 없는 경우
name, score 모두 있는 경우

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

Last updated