Spring

[Spring] request.getParameter() 대체 / Spring의 Command 객체 /Controller에서 사용자 입력 정보를 getParmeter() 메서드가 아닌 Command 객체를 이용해서 구현

bkuk 2023. 3. 6. 22:18

 

request.getParameter()

대부분의 Controller는 사용자의 입력 정보를 추출하여 VO(Value Object)나 DTO(Data Transfer Object) 객체에 저장한다. 그리고 비즈니스 컴포넌트의 메서드를 호출할때 이를 인자로 전달한다.

 

아래 코드를 보자.

사용자 입력 정보는 HttpServletRequest의 getParameter() 메서드를 사용하여 추출한다. 

별다른 문제는 없으나, 사용자가 입력하는 정보가 많거나 변경되는 상황이 발생할 뿐더러 메서드가 굉장히 길어진다..

이는 Command 객체를 이용하면 해결할 수 있다.

@Controller
public class InsertBoardController {
	@RequestMapping(value="/insertBoard.do")
    public void insertBoard(HttpServletRequest request) {
    
    // 1. 사용자 입력 정보 추출
    String title = request.getParameter( "title" );
    String writer = request.getParameter( "writer" );
    String content = request.getParameter( "content" );
    
    // 2. DB 연동 처리
    BoardTO to = new BoardTO();
    to.getTitle( title );
    ...
    ..
    
    }

 

Command 객체

Command객체는 Controller 메서드 매개변수로 받은 TO 객체라고 보면된다.

그렇다면 어떻게 사용하면 될까?

아래와 같이 메서드의 매개변수로 사용자가 입력한 값을 맵핑할 BoardTO 클래스를 선언하면 스프링 컨테이너가 insertBoard 메서드를 실행할 때 Command 객체를 생성하여 넘겨준다. 추가로 사용자가 입력한 값들을 Command 객체에 세팅해서 넘겨준다.

 

즉, 사용자 입력 정보 추출 및 TO 객체 생성, 값 설정 모두 컨테이너가 자동으로 처리해준다.

@Controller
public class InsertBoardController {
	@RequestMapping(value="/insertBoard.do")
    public void insertBoard(BoardTO to) {
    
    BoardDAO boardDao = new BoardDAO();
    boardDAO.insertBoard(to)
    
    }

 

여기서 중요한것은 Form 태그 안의 파라미터 이름과 Command 객체의 Setter 메서드 이름이 반드시 일치해야 한다.

예를 들면,

 

<input type = "text" name="title" />

 

public void setTitle(String title) {
	this.title = title;
}

 

 

이름이 다르다면 @ModelAttribute 사용

만약 이름이 다르다면 @ModelAttribute를 통해 이를 해결할 수 있다.