Spring | 요청 파라미터 처리

brightbell·2023년 9월 27일

Spring

목록 보기
7/12

컨트롤러에서의 요청 파라미터 처리

1.HttpServletRequest(자바 웹 개발 표준)
2.@RequestParam
3.커맨드 객체

컨트롤러로 요청을 보낸다.

  <%-- MyController03으로 요청 --%>
  <div>
    <a href="${contextPath}/blog/detail.do?blogNo=100">블로그 상세보기</a> 
  </div>

1. HttpServletRequest request를 이용한 요청 파라미터 처리

1) Java EE 표준 방식이다.
2) 파라미터뿐만 아니라 HttpSession session, String contextPath 등과 같은 정보도 꺼낼 수 있으므로 여전히 강력한 도구이다.

요청을 받아올 때 매개변수로 HttpServletRequest를 선언해 받아오고
request.getParameter로 요청에 들어있는 파라미터의 값을 저장한 후
jsp파일로 되돌려준다. 이때 이동방식은 spring의 기본방식인 forward이다

@Controller
public class MyController03 {

  @RequestMapping("/blog/detail.do")  // GET 방식의 method는 생략할 수 있다. value만 작성할 땐 value= 부분도 생략할 수 있다.
  public String blogDetail(HttpServletRequest request) {
    String blogNo = request.getParameter("blogNo");
    // ViewResolver의 prefix : /WEB-INF/views/
    // ViewResolver의 suffix : .jsp   
    request.setAttribute("blogNo", blogNo);
    return "blog/detail";  //  /WEB-INF/views/blog/detail.jsp로 forward(디폴트)한다.
  }

자바 웹개발 표준코드에서 포워딩을 할 때
request에 정보를 저장해서 넘기는 부분이 혼동이 올 수 있어서 스프링에서는 이를 개선했다.
org.springframework.ui.Model 인터페이스(java.util.Map 기반으로 만들어짐)

형식
파라미터에 Model 선언 후
model.addAttribute("blogNo", blogNo);

request를 명시하지 않아 요청할 정보와 포워딩할 정보가 명확하게 구분된다.
하지만 여전히 내부로직은 request를 이용해서 작동함

@Controller
public class MyController03 {

  @RequestMapping("/blog/detail.do")  // GET 방식의 method는 생략할 수 있다. value만 작성할 땐 value= 부분도 생략할 수 있다.
  public String blogDetail(HttpServletRequest request, Model model) {
    String blogNo = request.getParameter("blogNo");
    // ViewResolver의 prefix : /WEB-INF/views/
    // ViewResolver의 suffix : .jsp   
    model.addAttribute("blogNo", blogNo);
    return "blog/detail";  //  /WEB-INF/views/blog/detail.jsp로 forward(디폴트)한다.
  }

2. @RequestParam을 이용한 요청 파라미터 처리

1) 파라미터의 개수가 적은 경우에 유용하다.
2) 주요 메소드
(1) value : 요청 파라미터의 이름
(2) required : 요청 파라미터의 필수 여부(디폴트 true - 요청 파라미터가 없으면 오류 발생)
(3) defaultValue : 요청 파라미터가 없는 경우에 사용할 값
3) @RequestParam을 생략할 수 있다.
요청 파라미터를 변수로 정의할 때 타입변환이 필요한 경우 스프링이 처리한다.
(아래의 경우 String -> int)

  @RequestMapping("/blog/detail.do")
  public String blogDetail2(@RequestParam(value="blogNo", required = false, defaultValue = "1") int blogNo, Model model) {
    model.addAttribute("blogNo", blogNo);
    return "blog/detail";
  }

포워딩으로 전달된 정보 출력하기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

  ${blogNo}
  <br>
  ${requestScope.blogNo}

</body>
</html>

결과

3. 커맨드 객체를 이용한 요청 파라미터 처리

1) 요청 파라미터를 필드로 가지고 있는 객체를 커맨드 객체라고 한다.
2) 요청 파라미터를 필드에 저장할 때 Setter가 사용된다.
3) 요청 파라미터가 많은 경우에 유용하다.
4) 커맨드 객체는 자동으로 Model에 저장된다.
저장될 때 객체명(dto)이 아닌 클래스명(BlogDto)으로 저장된다.(클래스명을 LowerCamelCase로 바꿔서 저장한다.)

객체 생성

@NoArgsConstructor
@AllArgsConstructor
@Data
public class BlogDto {
  private int blogNo;
  private String title;
}

커맨드 객체 BlogDto dto

  @RequestMapping("/blog/detail.do")
  public String blogDetail3(BlogDto dto) {  // Model에 저장된 이름은 dto가 아니라 blogDto 이다.
    return "blog/detail";
  }

@ModelAttribute를 이용해서 Model에 저장되는 커맨드 객체의 이름을 지정할 수 있다.

  @RequestMapping("/blog/detail.do")
  public String blogDetail4(@ModelAttribute("dto") BlogDto blogDto) {  // Model에 저장되는 이름은 dto 이다.
    return "blog/detail";
  }

결과 확인 detail.jsp의 body태그

<body>
  ${blogDto.blogNo} <!-- LowerCamelCase로 저장된 클래스명을 통해 정보확인 -->
  <br>
  ${blogDto.getBlogNo()}
  <br>
  ${dto.blogNo} <!-- @ModelAttribute 이용함 -->
</body>

0개의 댓글