티스토리 뷰
Chpater06. 요청 처리 메서드의 파라미터 유형 : 다양한 조건으로 검색한 도서 목록 출력하기
6.1 경로 변수와 @PathVariable
웹 요청 URL에 포함된 파라미터 값을 전달받는(=컨트롤러(전처리)) 경로 변수와 이를 처리하는 요청 처리 메서드와 매개변수에 선언하는 방식은 @PathVariable 애너테이션이 있다.
6.1.1 경로 변수의 개요
경로 변수( @PathVariable)는 웹 요청 URL에 포함된 파라미터 값을 전달받는데 사용하는 변수이다.
매핑 경로를 설정하는 @RequestMapping(단순화한 것들도 포함)에 중괄호를 사용하여 웹 요청 URL에 포함된 요청 조건 값을 전달받는다.
중괄호 안에 명시된 것이 경로 변수이며, 하나뿐만 아니라 여러개의 경로 변수를 포함할 수 있다.
* url 파라미터를 전달하는 방식은 두가지가 있다.
1. /cars?color=red
2. /cars/red
위의 두 가지 방법 모두 사용할 수 있다.
* @PathVariable 매개변수의 데이터 타입은 int, long, Date 등 어떤 타입이든 가능하다. 작성 후 스프링이 적절한 타입으로 자동 변환해 주기 때문이다.
6.1.2 @PathVariable을 이용한 경로 변수 처리
@PathVariable 은 @RequestMapping에 설정된 경로 변수의 값을 요청 처리 메서드의 매개변수로 전달받는다.
//경로 변수 이름을 그대로 사용할때
@RequestMapping("경로변수")
public String requestMethod(@PathVariable 경로변수, ...) {
...
}
//경로 변수 이름을 재정의해서 사용할때
@GetMapping("경로변수")
public String requestMethod(@PathVariable (경로변수) 매개변수, ...) {
...
}
사용자의 웹 요청 URL에 포함된 경로 변수의 값은 요청 처리 메서드의 매개변수 데이터타입에 맞게 자동으로 변환된다.
또한, 요청 메서드에 @PathVariable 이 선언된 매개변수는 여러 개 설정할 수 있다.
* @PathVariable에서의 경로변수와 @RequestMapping에서의 경로변수의 이름은 같아야 한다.
@PathVariable를 사용하여 경로 변수에 접근하는 예시
Example01Controller.java
package com.springmvc.chap06;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/home")
public class Example01Controller {
@GetMapping("/exam01/{bookId}")
public String requestMethod(@PathVariable String bookId, Model model) {
System.out.println("도서 ID : " +bookId);
model.addAttribute("data","도서 ID : " +bookId);
return "webpage06";
}
}
경로 변수 이름 bookId로 전달받고 요청 처리 메서드에서도 동일한 경로 변수 이름으로 전달받는다.
webpage06.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>chap06</title>
</head>
<body>
<p>${data }
</body>
</html>
아래와 같이 url을 입력한다.
그럼 Example01Controller.java이 실행되어 경로변수 값이 저장되고 webpage06.jsp로 이동하여 다음과 같이 출력된다.
System.out.println을 사용하여 콘솔창에도 같이 출력되는 것을 볼 수 있다.
@PathVariable을 이용한 다중 경로 변수 접근
Example02Controller.java
package com.springmvc.chap06;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/home")
public class Example02Controller {
@GetMapping("/exam02/{category}/publisher/{publisher}")
public String requestMethod(@PathVariable String category, @PathVariable String publisher, Model model) {
System.out.println("도서 분야 : " +category);
System.out.println("출판사 : " +publisher);
model.addAttribute("data","도서 분야 : " +category+ "<br>" + "출판사 : " +publisher );
return "webpage06";
}
}
아래와 같이 url을 입력한다.
6.2 매트릭스 변수와 @MatrixVariable
@MatrixVariable는 웹에서 들어오는 웹 요청 URL에 포함된 다중 파라미터 값을 전달받는 매트릭스 변수와 이를 처리하는 요청 처리 메서드의 매개변수에 선언한다.
6.2.1 매트릭스 변수의 개요
매트릭스 변수는 경로 변수와 마찬가지로 웹 요청 uRL에 포함된 파라미터 값을 전달받는데 사용된다.
세미콜론(;)으로 데이터를 구분하여 다중 데이터를 전달받는 것이 차이이다.
@RequestMapping의 경로 변수에 '매트릭스 변수 = 값' 형태로 사용하며 여기서 매트릭스 변수가 여러 개일 경우 color=red, green, blue 처럼 콤마(,)로 구분하거나 color=red;color=green;color=blue처럼 변수 이름을 반복하여 사용한다.
만약 웹 요청 url이 http://.../cars/car;color=red;year=2019라면 매트릭스 변수 color의 값은 red, year 값은 2019이다.
6.2.2 @MatrixVariable을 이용한 매트릭스 변수처리
@MatrixVariable 은 @RequestMapping에 설정된 경로 변수에 포함된 매트릭스 변수의 값을 요청처리 메서드ㅢㅇ 매개변수로 전달받는다.
✔ @MatrixVariable을 사용하려면 스프링 MVC 설정 파일인 servlet-context.xml에 아래와 같은 코드를 추가하여 작성해야한다.
<annotation-driven enable-matrix-variables="true"/>
@MatrixVariable의 속성
속성 | 타입 | 설명 |
defaultValue | String | 기본값으로 대체하여 사용한다. |
name | String | 매트릭스 변수의 이름이다. |
pathVar | String | 하나 이상의 경로 구분(/)에 동일한 이름을 명확하게 구분하는데 사용한다. 매트릭스 변수가 있는 URL 경로 변수의 이름이다. |
required | boolean | 매트릭스 변수가 요구되는지 여부를 설정한다. |
value | String | 매트릭스 변수 'name=value'에서 name을 가리킨다. |
@MatrixVariable을 이용한 매트릭스 변수 접근하는 예시
웹 요청 URL에 포함된 파라미터 값을 경로 변수 이름 bookId로 전달받아 요청 처리 메서드 requestMethod()에서 매트릭스 변수 category로 접근한다.
* ;는 Matrix를 구분하는 기호이다.
http://../home/exam03/ISBN1234;category=IT전문서 가 요청 url일 경우
http://../home/exam03/ISBN1234;category=IT전문서
;뒤에 있는 것이 파라미터 값이다.
* ISBN1234를 매핑으로 잡아야한다. (매핑할때 변수를 /앞에 있는걸로 사용)
package com.springmvc.chap06;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.MatrixVariable;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/home")
public class Example03Controller {
@GetMapping("/exam03/{bookId}")
public String requestMethod(@PathVariable String bookId, @MatrixVariable String category, Model model) {
System.out.println("도서 ID : " +bookId);
System.out.println("도서 분야 : " +category);
model.addAttribute("data","도서 ID : " +bookId+ "<br>" + "도서 분야 : " +category);
return "webpage06";
}
}
아래와 같은 경로변수를 가지고 페이지를 이동하여 파라미터를 출력하는 것을 볼 수 있다.
@MatrixVariable에 value와 pathVar 속성 사용을 사용하는 예시
매트릭스 변수는 웹 요청 URL의 어느 곳에나 위치할 수 있으므로 어떤 매트릭스 변수를 어던 요소에 매핑할지 경정하려면 value와 pathVar 속성을 사용해야 한다.
http://.../home/exam04/ISBN1234;publisher=길벗/category/IT전문서;publisher=이지톡 이면 요청 처리 메서드 requestMethod()에서 첫번째 변수인 bookId에 publisher를 매핑하고 두번째 변수인 cateogry에 매트릭스 변수 publisher을 매핑한다.
접근된 매트릭스 변수는 각 q1(= 길벗 ), q2(= 이지톡 ) 로 재정의하여 사용하도록 코드를 작성했다.
http://.../home/exam04/ISBN1234;publisher=길벗/category/IT전문서;publisher=이지톡
위의 표기와 같이 /를 기준으로 나눈다.
package com.springmvc.chap06;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.MatrixVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/home")
public class Example04Controller {
@GetMapping("/exam04/{bookId}/category/{category}")
public String requestMethod(@MatrixVariable(value="publisher", pathVar="bookId")String q1, @MatrixVariable(value="publisher", pathVar="category")String q2, Model model) {
System.out.println("출판사1 : " +q1);
System.out.println("출판사2 : " +q2);
model.addAttribute("data","출판사1 : "+q1+ "<br>" + "출판사2 : " +q2);
return "webpage06";
}
}
6.3 요청 파라미터와 @RequestParam
웹 요청 URL에 포함된 쿼리문을 처리하는 요청 처리 메서드의 파라미터에 사용하는 것은 @RequestParam 애너테이션이다.
6.3.1 요청 파라미터의 개요
요청 파라미터는 일반적인 웹 서버 애플리케이션의 GET 방식의 쿼리문 '변수명=값' 형태로 데이터를 전송한다. 웹 요청 url에 다중 쿼리문을 가지면 color=red&year=2019처럼 &로 구분하여 표현한다.
@RequestParam에서는 파라미터의 시작이 이전;와 다르게 ?로 표기한다.
? 뒤부터 파라미터가 시작된다는 뜻이다. 그러므로 http://.../cars?color=red 일 경우 color고 값은 red를 전달받는다.
6.3.2 @RequestParam을 이용한 요청 파라미터 처리
@RequestParam은 일반적으로 메서드의 매개변수에 설정하는데 기본값은 웹 요청 url로 전송하는 요청 파라미터 이름과 똑같이 설정한다.
이 요청 파라미터 값은 메서드 매개변수의 데이터 타입에 따라 적절하게 변환된다.
@RequestParam은 @RequestMapping의 요청 매핑 경로에 포함된 요청 파라미터 값을 요청 처리 메서드의 매개변수로 전달받는다.
//요청 파라미터를 그대로 사용할 때
@RequestMapping("요청 경로")
public String 메서드 이름(@RequestParam 요청 파라미터, ...) {
...
}
//요청 파라미터를 재정의하여 사용할 때
@RequestMapping("요청 경로")
public String 메서드 이름(@RequestParam(요청 파라미터) 매개변수, ...){
...
}
@RequestParam의 속성
옵션 요소 | 타입 | 설명 |
defaultValue | String | 요청 매개변수가 없거나 빈 값이면 기본값으로 대체하여 사용한다. |
name | String | 저달하는 요청 매개변수의 이름이다. |
required | boolean | 요청 매개변수가 요구되는지 여부를 설정한다. |
value | String | name()에 대한 별칭이다. |
이때 웹 요청 URL이 http://.../home/exam07?/id=ISBN1234 이면 요청 파라미터는 id=ISBN1234을 requestMethod() 메서드의 매개변수 id의 값은 ISBN1234를 전달받는다.
* @GetMapping("경로변수")의 변수 이름과 @RequestParam 요청 파라미터의 이름이 다르면 작동되지 않는다.
이름 다르면 이전 보았던 예시와 같이 (" ")해서 지정해야 된다.
이전 예시 p.155
@GetMapping("/{category}")
public String requestBooksByCategory(@PathWariable("category") String bookCategory, Model model){
...
}
'코딩 > spring' 카테고리의 다른 글
[15주 5일차] 스프링 폼 태그 (0) | 2024.01.19 |
---|---|
[15주 5일차] 스프링 폼 태그 : 도서 등록 페이지 만들기 (0) | 2024.01.19 |
[15주 4일차] 요청 처리 메서드의 파라미터 유형 : 다양한 조건으로 검색한 도서 목록 출력하기 (0) | 2024.01.18 |
[15주 4일차] 컨트롤러 구현 (2) (0) | 2024.01.18 |
[15주 3일차] 컨트롤러 구현 (0) | 2024.01.17 |
- Total
- Today
- Yesterday