Spring/Maven Project

Spring에 Data Binding(바인딩) - @RequestParam, Auto Binding

carrotweb 2022. 11. 20. 19:24
728x90
반응형

Spring(스프링)의 Controller에서 웹 브라우저(Web Browser)로 부터 전달되는 데이터를 Binding(바인딩)하여 사용하는 방법에 대해 알아보겠습니다.

 

Spring(스프링)의 Controller에서는 전달되는 데이터를 Method(메서드)의 파라미터로 바인딩(Binding)해주거나 Method(메서드)에 있는 Bean(빈)으로 Binding(바인딩)을 해줍니다.

 

 

@RequestParam Annotation

 

Spring(스프링)의 Controller에서는 GET 방식으로 웹 브라우저(Web Browser)로 부터 전달되는 데이터를 Method(메서드)에 있는 파라미터에 Binding(바인딩)을 해줍니다.

 

즉, Controller에서는 HttpServletRequest 객체를 사용하여 Method(메서드)에 있는 파라미터와 동일한 파라미터의 이름으로 된 데이터를 가져와서 타입에 맞게 변환하여 넣어 줍니다.

@RequestParam VariableType Parameter

 

옵션으로 name, value, required, defaultValue을 설정할 수 있습니다.

@RequestParam(name="Parameter Name", value="Parameter Name", required=true, defaultValue="") VariableType Parameter
  • name : 바인드 할 웹 요청 파라미터 이름 (String)
  • value : name()의 별칭 (String)
  • required : 웹 요청 파라미터 필수 여부 - true이면 필수, 기본값은 true (boolean)
  • defaultValue : 웹 요청 파라미터가 없거나 값이 비어 있을 경우에 적용되는 기본 값 (String)

 

웹 요청 파라미터 이름과 Method(메서드)에 있는 파라미터 이름이 다를 경우 문자열로 입력하면 됩니다.

@RequestParam("type") String searchType

또는 name이나 value를 사용하면 됩니다.

@RequestParam(name="type") String searchType

or

@RequestParam(value="type") String searchType

name과 value를 동시에 사용할 수 있지만 값이 다르면 오류(500)가 발생합니다. 그래서 name이나 value 중 하나만을 사용하시길 바랍니다.

@RequestParam(name="searchType", value="searchType") String searchType (O)

or

@RequestParam(name="searchType", value="type") String searchType (X)
- org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.core.annotation.AnnotationConfigurationException: Different @AliasFor mirror values for annotation [org.springframework.web.bind.annotation.RequestParam]; attribute 'name' and its alias 'value' are declared with values of [searchType] and [type].

 

웹 요청 파라미터가 필수가 아니라면 false로 설정합니다. 기본적으로 true이기 때문입니다.

@RequestParam(required=false) String searchType

웹 요청 파라미터가 들어오지 않는다면 파라미터 값은 null로 처리됩니다. null 처리를 하지 않는다면 defaultValue로 기본값을 설정하는 것이 좋습니다.

@RequestParam(required=false, defaultValue="") String searchType

 

만약, 필수 조건인 웹 요청 파라미터가 들어오지 않으면 'Bad Request(잘못된 요청)'으로 오류(400)가 발생합니다.

그래서, defaultValue와 같이 사용하면  웹 요청 파라미터가 들어오지 않아도 기본값이 적용되어 오류가 발생하지 않습니다.

@RequestParam(defaultValue="subject") String searchType

 

참고로, @RequestParam Annotation를 POST 방식에서는 권장하지 않지만 사용하고 싶으시면 defaultValue로 기본값을 설정하면 됩니다. 그래야 웹 페이지 요청 시 오류가 발생하지 않습니다.

 

 

Maven Spring Project의 Controller의 Method에서 @RequestParam Annotation으로 데이터 받기

 

1. Java Resource > src/main/java > com.home.study.test1.main.controller에서 MainController 클래스를 오픈합니다. (MainController.java)

 

2. mainIndex 메서드에서 request 객체 대신 @RequestParam Annotation를 사용하여 전달된 searchType, searchCondition, searchKeyword 파라미터의 데이터를 가져옵니다.

  1. mainIndex 메서드에서 HttpServletRequest request와 HttpServletResponse response를 삭제합니다.
  2. @RequestParam Annotation으로 searchType, searchCondition, searchKeyword를 추가합니다.
  3. 전달된 파라미터는 모두 필수이고 NULL이거나 없을 경우 기본값으로 설정되도록 합니다.
package com.home.study.test1.main.controller;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;
import com.home.study.test1.board.service.IBoardService;

@Controller
public class MainController {

	@Autowired
	IBoardService boardService;

	@RequestMapping("/index")
	public String mainIndex(@RequestParam(defaultValue="subject") String searchType,
			@RequestParam(defaultValue="equal") String searchCondition,
			@RequestParam(defaultValue="") String searchKeyword,
			ModelMap model) {

		BoardSearch boardSearch = new BoardSearch();
		boardSearch.setSearchType(searchType);
		boardSearch.setSearchCondition(searchCondition);
		boardSearch.setSearchKeyword(searchKeyword);
		
		List<Board> boardList = boardService.selectBoardList(boardSearch);
		model.addAttribute("boardList", boardList);
		return "main/main";
	}

 	@RequestMapping("/default")
 	public String defaultIndex(HttpServletRequest request, HttpServletResponse response, ModelMap model) {
		List<String> memberIDList = new ArrayList<String>();
		memberIDList.add("testid1");
		memberIDList.add("testid2");
		memberIDList.add("testid3");
		memberIDList.add("testid4");
		memberIDList.add("testid5");
		model.addAttribute("memberList", memberIDList);
		return "main/main";
	}

}

또는 name과 required를 추가하여 명확하게 설정할 수 있습니다.

public String mainIndex(@RequestParam(name="searchType", required=true, defaultValue="subject") String searchType,
		@RequestParam(name="searchCondition", required=true, defaultValue="equal") String searchCondition,
		@RequestParam(name="searchKeyword", required=true, defaultValue="") String searchKeyword,
		ModelMap model) {
}

 

 

Maven Spring Project를 실행하여 웹 브라우저로 확인하기

 

1. "Servers"탭에서 "Tomcat9"를 선택하고 "start"버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.

 

2. 웹 브라우저에서 "http://localhost:9000/index.do?searchType=subject&searchCondition=like&searchKeyword=테스트+제목+1"을 입력합니다. 또는 이전에 <form> 태그의 method을 "post" 대신 "get"으로 변경하였다면 FORM 양식을 입력한 후 검색 버튼을 누릅니다.

 

@RequestParam Annotation에 name으로 웹 요청 파라미터 이름을 설정할 수 있습니다.

public String mainIndex(@RequestParam(name="type", defaultValue="subject") String searchType,
		@RequestParam(name="condition", defaultValue="equal") String searchCondition,
		@RequestParam(name="keyword", defaultValue="") String searchKeyword,
		ModelMap model) {
}

 

 

웹 요청 파라미터의 name이 "searchType"이고 value가 "type"으로 서로 다른 값으로 동시에 사용하면 오류(500)가 발생합니다. 그래서 name이나 value 중 하나만을 사용하길 바랍니다.

public String mainIndex(@RequestParam(name="searchType", value="type", defaultValue="subject") String searchType,
		@RequestParam(name="condition", defaultValue="equal") String searchCondition,
		@RequestParam(name="keyword", defaultValue="") String searchKeyword,
		ModelMap model) {
}

 

웹 요청 파라미터 이름인 condition이 필수일 때 값이 들어오지 않으면 'Bad Request(잘못된 요청)'으로 오류(400)가 발생합니다.

public String mainIndex(@RequestParam(name="type", defaultValue="subject") String searchType,
		@RequestParam(name="condition") String searchCondition,
		@RequestParam(name="keyword", defaultValue="") String searchKeyword,
		ModelMap model) {
}

 

 

Auto Binding

 

Spring(스프링)의 Controller에서는 웹 브라우저(Web Browser)로 부터 전달되는 데이터를 분석하여 자동으로 Method(메서드)에 있는 Bean(빈)으로 Binding(바인딩)을 해줍니다.

 

즉, Controller에서 Method(메서드)에 있는 Bean(빈)을 생성하고 HttpServletRequest 객체를 사용하여 데이터를 가져와서 Bean(빈)의 Member Variable(멤버 변수)와 동일한 파라미터의 이름으로 된 데이터를 타입에 맞게 변환하고 setter 메서드를 사용하여 넣어 줍니다.

 

 

Maven Spring Project의 Controller의 Method에서 Bean(빈)으로 데이터 받기

 

1. Java Resource > src/main/java > com.home.study.test1.main.controller에서 MainController 클래스를 오픈합니다. (MainController.java)

 

2. mainIndex 메서드에서 @RequestParam Annotation 대신 BoardSearch 객체를 사용하여 파라미터의 데이터를 가져옵니다.

  1. mainIndex 메서드에서 @RequestParam Annotation를 삭제합니다.
  2. mainIndex 메서드에 BoardSearch 객체를 추가합니다. 
  3. BoardSearch 객체의 멤버 변수에는 기본값이 공백이 설정되어 있어 null 체크를 하지 않아도 됩니다.
  4. 전달된 데이터가 없을 경우 기본값으로 처리되게 설정합니다. (searchType의 기본값은 subject(제목)으로 searchCondition의 기본값은 equal(일치)으로 설정합니다.)
  5. 검색 키워드 앞/뒤에 탭이나 스페이스와 같은 화이트 문자가 있을 수 있기 때문에 trim() 메서드를 사용하여 화이트 문자를 지웁니다. 만약, 앞/뒤에 공백이 올 수 있다면 trim() 메서드를 삭제하시기 바랍니다.
package com.home.study.test1.main.controller;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;
import com.home.study.test1.board.service.IBoardService;

@Controller
public class MainController {

	@Autowired
	IBoardService boardService;

	@RequestMapping("/index")
	public String mainIndex(BoardSearch boardSearch, ModelMap model) {
		String searchType = boardSearch.getSearchType();
		if (searchType.isEmpty()) {
			searchType = "subject";
		}
		
		String searchCondition = boardSearch.getSearchCondition();
		if (searchCondition.isEmpty()) {
			searchCondition = "equal";
		}
		
		String searchKeyword = boardSearch.getSearchKeyword();
		searchKeyword = searchKeyword.trim();
		
		List<Board> boardList = boardService.selectBoardList(boardSearch);
		model.addAttribute("boardList", boardList);
		return "main/main";
	}

 	@RequestMapping("/default")
 	public String defaultIndex(HttpServletRequest request, HttpServletResponse response, ModelMap model) {
		List<String> memberIDList = new ArrayList<String>();
		memberIDList.add("testid1");
		memberIDList.add("testid2");
		memberIDList.add("testid3");
		memberIDList.add("testid4");
		memberIDList.add("testid5");
		model.addAttribute("memberList", memberIDList);
		return "main/main";
	}

}

 

 

Maven Spring Project를 실행하여 웹 브라우저로 확인하기

 

1. "Servers"탭에서 "Tomcat9"를 선택하고 "start"버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.

 

2. 웹 브라우저에서 "http://localhost:9000/index.do"를 입력하고 검색 타입은 "제목", 검색 조건은 "포함", 검색 키워드는 "테스트 제목 1"을 입력한 후 검색 버튼을 누릅니다. (만약, 이전에 <form> 태그의 method을 "post" 대신 "get"으로 변경하였다면 다시 method을 "post" 변경하시기 바랍니다.)

또는 "http://localhost:9000/index.do?searchType=subject&searchCondition=like&searchKeyword=테스트+제목+1"를 입력합니다.

 

 

728x90
반응형