코드로 배우는 스프링 웹 프로젝트 2일차
컨트롤러 메서드를 작성할 때는 특별하게 Model이란 타입을 파라미터로 지정할 수 있다. Model 객체는 뷰에 컨트롤러에서 생성된 데이터를 담아서 전달하는 역할을 한다. 모델은 모델2방식에서 사용하는 request.setAttribute()와 유사한 역할을 한다.
Controller에 전달된 데이터를 이용해 추가적인 데이터를 가져와야 할 때 주로 Model을 사용한다.
예를 들어
스프링 MVC의 컨트롤러는 기본적으로 Java Beans 규칙에 맞는 객체는 다시 화면으로 객체를 전달합니다. 좁은 의미에서 Java Beans의 규칙은 단순히 생성자가 없거나 빈 생성자를 가져야 하며, getter/setter를 가진 클래스의 객체들을 의미합니다.
앞의 예제에서 파라미터로 사용된 SampleDTO의 경우는 Java Bean의 규칙에 맞기 때문에 자동으로 다시 화면까지 전달됩니다. 전달될 때에는 클래스명의 앞글자는 소문자로 처리됩니다.
반면에 기본 자료형의 경우는 파라미터로 선언하더라도 기본적으로 화면까지 전달되지는 않습니다.
이게 무슨 뜻인지는 모르겠으나... 일단 SampleController에 추가해보자.
@GetMapping("/ex04")
public String ex04(SampleDTO dto, int page) {
log.info("dto: " + dto);
log.info("page: " + page);
return "/sample/ex04";
}
ex04()는 SampleDTOP 타입과 int타입의 데이터를 파라미터로 사용한다.
결과를 확인하기 위해 /WEB-INF/views 폴더 아래 sample폴더를 생성하고 ex04.jsp를 작성하자.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>SAMPLEDTO ${sampleDTO}</h2>
<h2>PAGE ${page }</h2>
</body>
</html>
</html>
다음을 호출하면 화면에 SampleDTO만 전달되고, int타입으로 선언된 page는 전달되지 않는다.
localhost:8080/sample/ex04?name=aaa&age=11&page=9
@ModelAttribute는 강제로 전달받은 파라미터를 모델에 담아서 전달하도록 할 때 사용한다. 타입에 관게없이 무조건 모델에 담아 전달된다.
@GetMapping("/ex04")
public String ex04(SampleDTO dto, @ModelAttribute("page") int page) {
log.info("dto: " + dto);
log.info("page: " + page);
return "/sample/ex04";
}
이렇게 수정하고 호출하면 ${page} 값이 출력된다.

일회성으로 데이터를 전달하는 용도로 사용된다. 기존 서블릿의 response.sendRedirect()와 동일한 용도로 사용된다.
addFlashAttribute(이름, 값) 메서드로 한 번만 사용된다.