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

2021. 1. 14. 02:54 Spring Framework/Spring 입문 - 개념 및 핵심

| 스프링 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";
  }


출처: https://engkimbs.tistory.com/693?category=767795 [새로비]