진짜 개발자
본문 바로가기

FrameWork/Spring

Spring - 사용자가 전달한 값 사용하기 - 7 (Command 객체, @RequestParam, @PathVariable) - 7

728x90
사용자가 전달한 값 가져오기

이번 포스팅에서는 사용자가 요청한 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통해 파라미터를 서버에 넘겨줄 수 있습니다.

 

먼저 @RequestMapping어노테이션이 부여된 메소드의 매개변수로 HttpServeltRequest를 추가적으로 기술합니다. @RequestMapping 이 부여된 메소드에서는 HttpServletRequest객체를 매개변수로 전달받게 됩니다. 이는 웹 컨테이너가 자동으로 HttpServletRequest를 생성한뒤 사용자의 요청 URL에 대응되는 요청처리 메소드에 전달해주기 때문입니다. 그 후 request객체의 getParameter("key")메소드를 이용하면 사용자가 요청시 넘겨준 parameter값을 가져올 수 있습니다. 이를 다시 model의 addAttribute("key")메소드를 이용하여 view에 넘겨주었습니다.

 

view(jsp)에서는 request객체의 getAttribute("key") 메소드를 이용하여 controller에서 넘겨준 값을 가져올 수 있습니다.

 

위와 같이 url에 ?id=jjy를 추가적으로 기술하여 요청한 결과입니다.

 

 

1.1.2 @RequestParam("key") 어노테이션 사용

@RequestParam어노테이션은 사용자가 전달한 Parameter값을 어노테이션 뒤에 나오는 변수에 자동으로 맵핑 시켜주는 어노테이션 입니다.

 

위와 같이 메소드의 매개변수로 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을 넘겨줍니다.

 

우선 사용자가 넘겨준 데이터가 자동으로 mapping될 Command 클래스를 하나 생성합니다.

*주의할점 - Command 객체에는 항상 default Constructor(기본생성자)가 존재 해야합니다. 또한 setter() , getter()가 존재 해야합니다.

 

Controller를 보시죠! 매우 간단해진 것을 볼 수 있습니다. 단지 Command 객체를 매개변수에 추가했을 뿐입니다. model을 이용해 데이터를 넣어줄 필요도 없고 사용자가 넘겨줄 데이터가 Mapping될 변수들을 따로 매개변수에 추가할 필요도 없습니다. 중요한 점은 View에서 해당 Command객체를 사용할 때에는 Key값으로 매개변수의 이름이 아닌 Command 객체의 Class 이름CamelCase로 변경한 것을 사용합니다.

 

View(jsp)입니다. 우선 <% %>을 이용해 request 객체에 담겨있을 객체를 가져오고 Student 타입으로 캐스팅을 해주어야 합니다. 앞서 말씀드린 것처럼 Command객체를 가져올 때는 Command Class의 이름을 CamelCase로 한것을 Key값으로 사용합니다.

 

 

2. 경로를 변수화 하기 (@PathVariable)

@PathVariable 어노테이션은 url의 경로를 변수화하여 사용할 수 있도록 해줍니다. 앞서 말씀드린 Command 객체를 이용하지 않고 왜 다시 변수를 이용하냐고 할 수 있는데. RESTFUL API를 구축할 때 유용하게 사용할 수 있기 때문입니다!. 

 

@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 됩니다.

 

View에서는 간단히 getAttribute()를 이용하여 사용하면 됩니다.

 

요청은 @RequestMapping안의 값에 따라 적절히 요청하면 됩니다.