본문 바로가기

spring

Command 객체

  • Command 객체는 Controller 메소도 매개변수로 받은 VO(Value Object) 객체라고 보면 된다.

InsertBoardController 클래스의 insertBoard() 메소드를 Command 객체를 이용하여 구현한다.

 

@Controller
public class InsertBoardController {
    
    @RequestMapping(value="/insertBoard.do")
    public void insertBoard(BoardVO vo) {
    }
}

 

insertBoard() 메소드의 매개변수로 사용자가 입력한 값을 매핑할 BoardVO 클래스를 선언하면, 스프링 컨테이너가 insertBoard() 메소드를 실행할 때 Command 객체를 생성하여 넘겨준다. 그리고 이때 사용자가 입력한 값들을 Command 객체에 세팅까지 해서 넘겨준다. 

결과적으로 사용자 입력 정보 추출과 VO 객체 생성, 그리고 값 설정을 모두 컨테이너가 자동으로 처리하는 것이다.

 

스프링 컨테이너가 사용자 입력값을 Command 객체에 자동으로 설정하는 과정을 이해하기 위해서 서블릿 컨테이너의 동작 방식을 살펴본느 것이 도움된다.

서블릿 객체의 service() 메소드가 호출되는 과정

1. 서블릿 컨테이너는 클라이언트의 HTTP 요청이 서버에 전달되는 순간

2. HttpServletRequest 객체를 생성하고 HTTP 프로토콜에 설정된 모든 정보를 추출하여 HttpServletRequest 객체에 저장한다.

3. 그리고 이 HttpServletRequeset 객체를 service() 메소드를 호출할 때, 인자로 전달해준다.

 

 

 

서블릿 객체는 서블릿 컨테이너가 생성한다. 그리고 service(), doGet(), doPost() 메소드도 서블릿 컨테이너가 호출한다. 이때, service(), doGet(), doPost() 메소드가 정상적으로 호출되려면 HttpServletRequest와 HttpServletResponse 객체가 필요한데, 이 객체들도 서블릿 컨테이너가 생성해서 넘겨준다. 결국, service() 메소드는 매개변수로 받은 HttpServletRequest객체를 통해 다양한 요청 처리를 구현할 수 있다.

 

이제 관점을 스프링 컨테이너로 옮겨보자. 클라이언트가 글 등록 정보를 적절하게 입력하고, 서버에 "insertBoard.do" 요청을 전달하면 스플이 컨테이너는 @Controller가 붙은 모든 컨트롤러 객체를 생성하고, InsertBoardController가 가지고 있는 insertBoard() 메소드를 실행한다. 이때, 매개변수에 해당하는 BoardVO 객체를 스프링 컨테이너가 생성하여 전달한다. 

 

Controller 객체의 메소드가 호출되는 과정

클라이언트가 글 등록을 요청하면 스플이 컨테이너는 InsertBoardController 객체의 insertBoard() 메소드를 호출한다. 이때, 

 

1 매개변수에 해당하는 BoardVO 객체를 생성하고,

2. 사용자가 입력한 파라미터(title, writer, content) 값들을 추출하여 BoardVO 객체에 저장한다. 이때, BoardVO 클래스의 Setter 메소드들이 호출된다.

3. insertBoard() 메소드를 호출할 때, 사용자 입력값들이 설정된 BoardVO 객체가 인자로 전달된다.

 

여기서 중요한 것은 Form 태그 안의 파라미터 이름과 Command 객체의 Setter 메소드 이름이 반드시 일치해야 한다. 즉, 각 파라미터 이름에 해당하는 setTitle(), setWriter(), setContent() 메소드가 있어야 Setter 인젝션에 의해 자동으로 사용자 입력 값이 저장된다.

 

 

setter 인젝션 참조

- cuddlyciel.tistory.com/58

- skibis.tistory.com/226