이번 포스팅에서는 사용자가 요청한 url을 통해 Mapping된 @Controller
안의 Method가 실행될 때 사용자가 요청시 전달한 값(Parameter 또는 Body에 담긴 값)을 가져오는 방법에대해 포스팅하겠습니다.
1. 사용자 요청에 담긴 값(Parameter, Body) 가져오기
1.1 GET요청시 파라미터 값 가져오기
1.1.1 HttpServletRequest 객체 사용
사용자는 http://localhost:8080/myview?id=jjy
로 요청을 할 것입니다. 다들 아시다시피 url뒤에 ?
를 붙히고 key=value
의 형태로 사용자가 url통해 파라미터를 서버에 넘겨줄 수 있습니다.
xxxxxxxxxx
public class MyController {
(value="/myview")
public String myview(HttpServletRequest request, Model model) {
String id = request.getParameter("id");
model.addAttribute("id", id);
return "myview";
}
}
먼저 @RequestMapping
어노테이션이 부여된 메소드의 매개변수로 HttpServeltRequest
를 추가적으로 기술합니다. @RequestMapping
이 부여된 메소드에서는 HttpServletRequest
객체를 매개변수로 전달받게 됩니다. 이는 웹 컨테이너가 자동으로 HttpServletRequest
를 생성한뒤 사용자의 요청 URL에 대응되는 요청처리 메소드에 전달해주기 때문입니다. 그 후 request객체의 getParameter("key")
메소드를 이용하면 사용자가 요청시 넘겨준 parameter값을 가져올 수 있습니다. 이를 다시 model의 addAttribute("key")
메소드를 이용하여 view에 넘겨주었습니다.
xxxxxxxxxx
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%= request.getAttribute("id") %>
</body>
</html>
view(jsp)
에서는 request
객체의 getAttribute("key")
메소드를 이용하여 controller에서 넘겨준 값을 가져올 수 있습니다.
위와 같이 url에 ?id=jjy
를 추가적으로 기술하여 요청한 결과입니다.
1.1.2 @RequestParam("key") 어노테이션 사용
@RequestParam
어노테이션은 사용자가 전달한 Parameter값을 어노테이션 뒤에 나오는 변수에 자동으로 맵핑 시켜주는 어노테이션 입니다.
xxxxxxxxxx
public class MyController {
(value="/myview")
public String myview( ("id")String id, Model model) {
model.addAttribute("id", id);
return "myview";
}
}
위와 같이 메소드의 매개변수로 String id
를 추가해주었고 그 변수에 @RequestParam("key")
어노테이션을 부여했습니다. 그 후 마찬가지로 model을 통해 view에 해당 파라미터값을 전달했습니다. view코드와 결과값은 변경사항이 없으므로 따로 기입하지 않았습니다.
1.1.3 Command 객체 사용하기
위의 HttpServletRequest
객체를 사용하는 방법과 @ReuqestParam("key")
어노테이션을 이용하는 방법 모두 곧잘 동작을 합니다. 하지만 전달되는 데이터가 너무 많은 경우에는 어떨까요? Parameter로 넘어오는 데이터는 그렇게 많지는 않을 수 있지만, Body에 실려 넘어오는 경우에는 엄청난 데이터가 넘어올 수도 있습니다. 이런 경우 사용자가 직접 메소드의 매개변수에 모든 변수를 작성하고 다시 그것을 통해 view에 전달하는 코드를 직접 작성해주어야 할 것입니다. 또한 이러한 말은 변경에 약하다
고 할 수 있습니다. 이렇게 사용자가 전달하는 데이터가 많은경우를 위해 Command
객체란 것이 있습니다. Command
객체는 사용자가 전달하는 모든 값을 자동으로 Command
객체로 Mapping 해줍니다.
사용자는 http://localhost:8080/myview?age=10&name=jjy
로 요청을 하게 됩니다. 즉, 파라미터로 age와 name을 넘겨줍니다.
xxxxxxxxxx
public class MyStudent {
private int age;
private String name;
public Student() {}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
우선 사용자가 넘겨준 데이터가 자동으로 mapping될 Command
클래스를 하나 생성합니다.
*주의할점 - Command 객체에는 항상 default Constructor(기본생성자)가 존재 해야합니다. 또한 setter() , getter()가 존재 해야합니다.
xxxxxxxxxx
public class MyController {
(value="/myview")
public String myview(MyStudent student) {
return "myview";
}
}
Controller
를 보시죠! 매우 간단해진 것을 볼 수 있습니다. 단지 Command
객체를 매개변수에 추가했을 뿐입니다. model
을 이용해 데이터를 넣어줄 필요도 없고 사용자가 넘겨줄 데이터가 Mapping될 변수들을 따로 매개변수에 추가할 필요도 없습니다. 중요한 점
은 View에서 해당 Command
객체를 사용할 때에는 Key
값으로 매개변수의 이름이 아닌 Command 객체의 Class 이름
을 CamelCase
로 변경한 것을 사용합니다.
x
<%import="com.java.ex.Student"%>
<%page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<% Student student = (Student)request.getAttribute("myStudent"); %>
age : <%= student.getAge() %> <br/>
name : <%= student.getName() %>
</body>
</html>
View(jsp)
입니다. 우선 <% %>
을 이용해 request 객체에 담겨있을 객체를 가져오고 Student 타입으로 캐스팅을 해주어야 합니다. 앞서 말씀드린 것처럼 Command
객체를 가져올 때는 Command Class
의 이름을 CamelCase
로 한것을 Key값으로 사용합니다.
2. 경로를 변수화 하기 (@PathVariable)
@PathVariable
어노테이션은 url의 경로를 변수화하여 사용할 수 있도록 해줍니다. 앞서 말씀드린 Command 객체
를 이용하지 않고 왜 다시 변수를 이용하냐고 할 수 있는데. RESTFUL API
를 구축할 때 유용하게 사용할 수 있기 때문입니다!.
public class MyController {
(value="myview2/{name}/{age}")
public String myView2( ("age") String age, ("name") String name, Model model) {
model.addAttribute("age",age);
model.addAttribute("name",name);
return "myview2";
}
}
@RequestMapping(value="")
어노테이션의 value안에 적힌 내용부터 살펴보겠습니다. myview2/{name}/{age}
조금 특이하지 않나요? @PathVariable
을 사용하기 위한 문법입니다. 이런식으로 사용하면 { }(중괄호)
안에 적힐 (사용자가 요청한 url)값을 변수 처럼 사용할 수 있습니다.
매개변수의 첫 값을 보면 @PathVariable("age") String age
가 보입니다. 이것을 해석하면 @RequestMapping
의 값중 {age}
라고 적힌 부분을 변수화 하여 String age
변수에 Mapping 하겠다는 의미 입니다. 따라서 url의 {name}
은 String name에 mapping, {age}
는 String age에 Mapping 됩니다.
<body>
age : <%= request.getAttribute("age") %> <br/>
name : <%= request.getAttribute("name") %>
</body>
View
에서는 간단히 getAttribute()를 이용하여 사용하면 됩니다.
요청은 @RequestMapping
안의 값에 따라 적절히 요청하면 됩니다.
'FrameWork > Spring' 카테고리의 다른 글
Spring - @ComponentScan 어노테이션이란? (2) | 2019.04.10 |
---|---|
Spring - @(Annotation) 사용시 알 수 없는 에러 (0) | 2019.04.04 |
Spring - Model을 이용하여 View에 데이터 넘겨주기 - 6 (4) | 2019.04.03 |
Spring - Spring MVC 동작과정 -5 (0) | 2019.04.03 |
Spring - AOP관련 Annotation - 4 (0) | 2019.03.29 |