본문으로 바로가기

▶Model이라는 데이터 전달자

Controller의 메서드를 작성할 때는 특별하게 Model이라는 타입을 파라미터로 지정할 수 있음.Model 객체는 JSP에 컨트롤러에서 생성된 데이터를 담아서 전달하는 역할을 하는 존재임.이를 이용해서 JSP와 같은 뷰(View)로 전달해야 하는 데이터를 담아서 보낼 수 있음.메서드의 파라미터 Model 타입이 지정된 경우에는 스프링은 특별하게 Model 타입의 객체를 만들어서 메서드에 주입하게 됨.


Model은 모델2 방식에서 사용하는 request.setAttribute()와 유사한 역할을 함.Servlet을 이용해 본적이 있다면  다음과 같은 코드에 익숙 할 것이다


Servlet에서 모델2방식으로 데이터를 전달하는 방식


1
2
3
4
request.setAttribute(“servletTime”,new java.util.Date());
RequstDispatCher dispatcher= new request.getRequstDispatCher(“/WEB-INF/jsp/home.jsp”)
Dispatcher.forward(request,response);
 
cs

 

위의 코드를 스프링에서는 Model 을 이용해서 다음과 같이 처리하게 됨.


스프링 MVC에서 Model을 이용한 데이터 전달


1
2
3
4
public String home(Model model) {
        model.addAttribute("serverTime",new java.util.Date());
        return "home";
    }
cs


메서드의 파라미터를 Model타입으로 선언하게 되면 자동으로 스프링MVC에서 Model타입의 객체를 만들어 주기 때문에 개발자의 입장에서는 필요한 데이터를 담아 주는 작업 만으로 모든 작업이 완료됨.  Model을 사용해야 하는 경우는 주로 Controller에 전달된 데이터를 이용해서 추가적인 데이터를 가져와야 하는 상황임.


예를 들어 , 다음과 같은 경우들을 생각해 볼 수 있음.

-리스트 페이지 번호를 파라미터로 전달받고, 실제 데이터를 View로 전달 해야하는 경우 

-파라미터들에 대한 처리 후 결과를 전달해야하는 경우 


▶@ModelAttribute어노테이션 

웹페이지의 구조 Request에 전달된 데이터를 가지고 필요하다면 추가적인 데이터를 생성해서 화면으로 전달하는 방식으로 동작함.Model의 경우는 파라미터로 전달괸 데이터는 존재하지 않지만 화면에서 필요한 데이터를 전달하기 위해서 사용함.예를 들어 페이지 번호는 파라미터로 전달되지만, 결과 데이터를 전달하려면 Model에 담아서 전달함.


스프링 MVC의 Controller는 기본적으로 Java Beans의 규칙에 맞는 객체는 다시 화면으로 객체를 전달함.좁은 의미에서 Java Beans의 규칙은 단순히 생성자가 없거나 빈 생성자를 가져야 하며,getter/setter를  가진 클래스의 객체들을 의미함.앞의 예제에서 파라미터로 사용된 SampleDTO의 경우는 Java Bean의 규칙에 맞기 때문에 자동으로 다시 화면까지 전달됨.전달될 때에는 클래스명의 앞글자는 소문자로 처리됨.


반면에 기본 자료형의 경우는 파라미터로 선언하더라도 기본적으로 화면까지 전달되지는 않음.


SampleController에 추가 

1
2
3
4
5
6
7
    //jsp파일 만든 맵핑
    @GetMapping("/ex04")
    public String ex04(SampleDTO dto, int page) {
        System.out.println("dto: "+dto);
        System.out.println("page: "+page);
        return "/sample/ex04";
    }
cs



ex04()는 SampleDTO 타입과 int 타입의 데이터를 파라미터로 사용함.결과를 확인하기 위해서 '/WEB-INF/views'폴더 아래 sample 폴더를 생성하고 리턴 값에서 사용한 'ex04'에 해당하는 ex04.jsp를 작성함.


ex04.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ 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>
 
<h2>SAMPLEDTO ${sampleDTO}</h2>
<h2>PAGE ${page}</h2>
</body>
</html>
cs

서버를 실행하고 브라우저를 통해서  브라우저를 통해서 Shttp://localhost:8080/sample/ex04?name=aaa&age=11&page=9 와 같이 호출하면 화면에 SampleDTO만이 전달된 것을 확인할 수 있음. int 타입으로 선언된 page는 전달 되지 않음 .



@ModelAttribute는 강제로 전달받은 파라미터를 Model에 담아서 전달하도록 할 때 필요한 어노테이션임. @ModelAttribute가 걸린 파라미터는 타입에 관계없이 무조건 Model에 담아서 전달 되므로 ,파라미터로 전달된 데이터를 다시 화면에서 사용해야 할 경우에 유용하게 사용됨.


기존 코드에서 int  타입의 데이터가 화면까지 전달되지 않으므로 @ModelAttribute를 추가하면 다음과 같은 형태가 됨.


1
2
3
4
5
6
7
    @GetMapping("/ex04")
    public String ex04(SampleDTO dto,@ModelAttribute("page"int page) {
        System.out.println("dto: "+dto);
        System.out.println("page: "+page);
        
        return "/sample/ex04";
    }
cs


@ModelAttribute가 붙은 파라미터는 화면까지 전달되므로 브라우저를 통해서 호출하면 아래와 같이 ${page}가 출력되는 것을 확인할 수 있음.(기본 자료형에 @ModelAttribute를 적용할 경우 반드시 @ModelAttribute("page")와 같이 값(value)을 지정하도록 함.)



▶RedirectAttributes

Model 타입과 더불어 스프링 MVC가 자동으로 전달해 주는 타입 중에는 RedirectAttributes타입이 존재함. RedirectAttributes는 조금 특별하게도 일회성으로 데이터를 전달하는 용도로 사용됨.RedirectAttributes는 기존에 Servlet에서는 response.sendRedirect()를 사용할 때와 동일한 용도로 사용함.


Servlet에서 redirect방식

response.sendRedirect("/home?name=aaa&age=10");


스프링 MVC를 이용하는 경우에는 다음과 같이 변동 됨. 


스프링 MVC를 이용한는 redirect처리 


rttr.addFlashAttribute("name","AAA");

rttr.addFlashAttribute("age","10");


return "redirect:/";



RedirectAttributes는 Model과 같이 파라미터로 선언해서 사용하고,addFlashAttribute(이름,값)메서드를 이용해서 화면에  한번만 사용되지 않는 데이터를 전달하기 위해서 사용함.addFlashAttribute의 용도는 뒤에서 더 배워 볼꺼임.