[Spring] 스프링(Spring) MVC 커맨드 객체(Command Object) 및 @RequestParam, HttpServletRequest

| 스프링 MVC 커맨드 객체(Command Object)


스프링에서 HttpServletRequest를 통해 HTTP 전송 정보를 얻는 방법은 다음과 같다. 

@RequestMapping(value="/memLogin", method=RequestMethod.POST)
public String memLogin(Model model, HttpServletRequest request) {
String memId = request.getParameter("memId");
String memPw = request.getParameter("memPw");
}


하지만 이 방법은 속성값을 끄집어내기 위한 boiler-plate 코드가 생길 수 밖에 없는 단점이 있다. 따라서 스프링에서는 @RequestParam 어노테이션을 제공하여 메서드의 인수 부분에 HTTP로 들어오는 데이터를 바인딩하여 boiler-plate 코드를 어느정도 줄일 수 있게 하였다.

@RequestMapping(value="/memLogin", method=RequestMethod.POST)
public String memLogin(Model model,
@RequestParam("memId") String memId,
@RequestParam("memPw") String memPw) {
Member member = service.memberSearch(memId, memPw);
}


그러나 @RequestParam 어노테이션을 사용하는 방법도 한계가 있다. HTTP에서 들어오는 데이터의 각 속성들이 적으면 @RequestParam으로 커버가 가능하겠지만 이것보다 많은 6개 10개 혹은 그 이상의 속성들이 들어오게되면 @RequestParam들을 하나하나 명시해서 처리해야되므로 매우 까다로워진다.


따라서 스프링에서는 커맨드 객체(Command Object)를 지원하여 HTTP에서 들어오는 각 속성값들을 자동적으로 커맨드 객체에 바인딩하여 처리할 수 있게 하였다.


// MemPhone까지 하면 6개의 속성이 전달된다. 하지만 커맨드 객체를 이용하여
// @RequestMapping이나 getParameter로 처리하지 않아도 쉽게 처리 가능하다.
public class Member {
private String memId;
private String memPw;
private String memMail;
private MemPhone memPhone;

public String getMemId() {
return memId;
}
public void setMemId(String memId) {
this.memId = memId;
}
public String getMemPw() {
return memPw;
}
public void setMemPw(String memPw) {
this.memPw = memPw;
}
public String getMemMail() {
return memMail;
}
public void setMemMail(String memMail) {
this.memMail = memMail;
}
public MemPhone getMemPhone() {
return memPhone;
}
public void setMemPhone(MemPhone memPhone) {
this.memPhone = memPhone;
}
}

public class MemPhone {
private String memPhone1;
private String memPhone2;
private String memPhone3;

public String getMemPhone1() {
return memPhone1;
}
public void setMemPhone1(String memPhone1) {
this.memPhone1 = memPhone1;
}
public String getMemPhone2() {
return memPhone2;
}
public void setMemPhone2(String memPhone2) {
this.memPhone2 = memPhone2;
}
public String getMemPhone3() {
return memPhone3;
}
public void setMemPhone3(String memPhone3) {
this.memPhone3 = memPhone3;
}
}


// 커맨드 객체인 Member만 인수로 받아 데이터를 쉽게 처리할 수 있다.
@RequestMapping(value="/memJoin", method=RequestMethod.POST)
public String memJoin(Member member) {
service.memberRegister(member);
return "memJoinOk";
}


이 글을 공유하기

댓글(3)

  • ㅇㄴㅁ
    2019.10.15 15:17

    뭘설명하는건지 1도 모르겟다;; paramMap 다적는거보다 VO생성하는거보다 걍 @requestParam HashMap 으로받으면 되지않나요?

    • 2019.10.16 17:33 신고

      댓글 달아줘서 감사합니다! 예전에 포스팅한 것이라 어설프고 올드해서 죄송합니다ㅠ 주말에 바로 리뉴얼 해야겠네요;;

      말씀하신대로 Map 인터페이스 형태로 받는 것도 좋습니다. 여기서 설명한 것은 객체 지향적인 관점으로 Post 된 데이터를 받는 것을 나타낸 것입니다.

      Map 인터페이스로 받는 것보다는 이 정보가 무엇을 나타내는 것인지 객체로 나타내면 의미가 명확해짐과 더불어 가독성도 좋아지고 코드량도 적어지는 효과가 있습니다.

      물론 이거다! 라는 정답은 없으니 어떤 방법을 쓰셔도 무방하다는 말씀드리고 싶어요~ (개취~)

  • 스프링쫌...
    2020.03.02 18:07

    memJoin 메서드에 service 객체 선언도 없으시고.....
    코드 수정 좀 하시는게.....

Designed by JB FACTORY