Form Data
HttpServletRequest, @RequestParam를 사용하기
HttpServletRequest 서블릿은 클라이언트로부터 전송된 데이터를 담고 있고, 컨트롤러에서는 파라미터로 객체를 설정하여 사용할 수 있다.
0) Controller.java
@Controller @RequestMapping("/board") public class BoardController { @RequestMapping("/test") public String test(HttpServletRequest httpServletRequest, Model model) { String id = httpServletRequest.getParameter("id"); model.addAttribute("id", id); return "board/view"; } @RequestMapping("/test2") public String test2(@RequestParam("id")String id, Model model) { model.addAttribute("id", id); return "board/view"; } }
@RequestParam() 어노테이션이 사용된 메서드는, 해당 파라미터가 존재하지 않으면 400 error가 발생함
localhost:8080/board/test (정상 작동)
localhost:8080/board/test2 (400 Error)
localhost:8080/board/test2?id=spring (정상 작동)
Data(Command) Object를 사용하기
위 방법은 데이터의 양이 많아질 수록 코드가 길어지고 가독성도 떨어지게 된다. 처리하고자 하는 데이터를 객체화하여 사용하는 방법은 코드가 간결해지고 효율적이다.
1) Member.java
public class Member { private String id; private String password; //getters and setters public String getId() {id;} public void setId(String id) { this.id = id;} public String getPassword() {return password;} public void setPassword(String password) {password = password;} }2) Controller.java
@Controller @RequestMapping("/member") public class MemberController { @RequestMapping("/profile") public String test(Member member) { return "member/profile"; } }
3) Profile.jsp
<body> <p>Profile</p> <p>ID : ${member.id} </p> <p>E-mail : ${member.password} </p> </body>
위 코드에서 test 메서드는 model객체조차 사용하지 않고 뷰 페이지에 데이터를 전달한다.
@PathVariable을 사용하기
@PathVariable을 사용하면 URI의 일부를 변수로 사용할 수 있다. REST API를 구현하는 방법 중 한 가지이다.
0) Controller.java
@Controller @RequestMapping("/member") public class MemberController { @RequestMapping("/profile/{id}") public String getProfile(@PathVariable String id, Member member) { System.out.println("pathvariable: " + id); return "member/profile"; } }
localhost:8080/member/profile/10 // 매핑 설정에 따라 숫자 부분이 변수로 지정됨
메서드를 보면, Member 객체를 파라미터로 받고 있다. 헌데, Member객체는 id 를 필드로 이미 갖고 있기 때문에 위 메서드에서는 PathVariable로 지정된 id값을 Member객체에 set하게 된다.
자동으로 데이터를 처리하기에 매우 편리할 수 있으나, 특정 상황에서는 의도치 않은 동작을 할 수 있으므로 변수명 설계 시 주의가 요망된다.