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 파라미터의 데이터를 가져옵니다.
- mainIndex 메서드에서 HttpServletRequest request와 HttpServletResponse response를 삭제합니다.
- @RequestParam Annotation으로 searchType, searchCondition, searchKeyword를 추가합니다.
- 전달된 파라미터는 모두 필수이고 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 객체를 사용하여 파라미터의 데이터를 가져옵니다.
- mainIndex 메서드에서 @RequestParam Annotation를 삭제합니다.
- mainIndex 메서드에 BoardSearch 객체를 추가합니다.
- BoardSearch 객체의 멤버 변수에는 기본값이 공백이 설정되어 있어 null 체크를 하지 않아도 됩니다.
- 전달된 데이터가 없을 경우 기본값으로 처리되게 설정합니다. (searchType의 기본값은 subject(제목)으로 searchCondition의 기본값은 equal(일치)으로 설정합니다.)
- 검색 키워드 앞/뒤에 탭이나 스페이스와 같은 화이트 문자가 있을 수 있기 때문에 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"를 입력합니다.
'Spring > Maven Project' 카테고리의 다른 글
Spring에 spring-form JSP Tag Library 사용 - <form:form> <form:hidden> <form:select> <form:option> <form:input> (0) | 2022.11.28 |
---|---|
Spring에 Data Binding(바인딩) - @ModelAttribute, Form 데이터 유지 (0) | 2022.11.26 |
Spring에 Data 전달 - GET, POST, HttpServletRequest getParameter (0) | 2022.11.06 |
Spring에 Service - Interface, Implement 추가 (0) | 2022.10.31 |
Spring에 Mapper XML - Search 공통 처리, DAO - 카운트 기능 추가 (0) | 2022.10.23 |