[Spring] Model 객체

msriver·2020년 6월 23일
16

Spring

목록 보기
12/16

Spring Model 객체

Controller의 메서드는 Model이라는 타입의 객체를 파라미터로 받을 수 있다.
순수하게 JSP Servlet으로 웹 어플리케이션을 만들 때 보통 request나 session 내장객체에 정보를 담아 jsp에 넘겨주곤 했는데 Spring에서는 Model이라는 녀석을 쓴다.
request.setAttribute() 와 비슷한 역할을 하는 것.

request.setAttribute("time", new java.util.Date());
RequestDispatcher dispatcher = request.getRequestDispatcher("url");
dispatcher.forward(request, response);

위 코드는 jsp로 게시판을 만들때 많이 사용했던 형태의 코드이다.
스프링에서는 다음과 같이 처리한다.

public String home(Model model) {
	model.addAttribute("time", new java.util.Date());
    	return "home";
}

편리한 점은 개발자는 직접 model을 생성할 필요는 없다. 다만 파라미터로 선언만 해주면 스프링이 알아서 만들어준다.

스프링 MVC의 Controller는 기본적으로 Java Beans 규칙에 맞는 객체는 자동으로 화면에 전달해준다.
Java Beans의 규칙에 맞는다는 것은 단순히 생성자가 없거나 빈 생성자를 가지며, getter/setter를 가진 클래스의 객체들을 의미한다.
전달될 때는 클래스명의 앞글자를 소문자로 처리하여 전달한다.

그러나 기본자료형(int, double등등)은 파라미터로 선언되었더라도 화면에 자동으로 전달되지 않는다.

예를 들어 Controller에 다음과 같은 메서드가 있다.
SampleDTO는 String name, int age를 인스턴스 변수로 가진다.

@GetMapping("/ex04")
public String ex04(SampleDTO dto, int page) {
	return "ex04"
}

ex04.jsp에 다음과 같이 전달받은 데이터를 출력하는 코드를 작성해본다.

<h2>Sample DTO : ${sampleDTO}</h2>
<h2>page : ${page}</h2>

브라우저의 주소창을 통해 쿼리스트링을 name=aaa&age=11&page=99 와 같이 전달해보면 출력되는 결과화면엔 page는 뜨질 않는 것을 확인.

그럼 기본자료형은 어떻게 view에 전달을 해줄까?

1) 파라미터에 Model타입의 객체를 선언. 이후 addAttribute()를 통해 전달
2) @ModelAttribute 어노테이션 사용

1번은 굳이 설명하지 않음
2번은 다음과 같이 사용한다.

@GetMapping("/ex04")
public String ex04(SampleDTO dto, @ModelAttribute("mypage") int page) {
	return "ex04"
}

기본자료형인 파라미터 앞에 붙여주면 된다. 속성값으로는 화면에서 출력할때 사용할 이름을 지정해준다.

<h2>page : ${mypage}</h2>

RedirectAttributes

RedirectAttributes 타입의 객체는 일회성으로 데이터를 전달 할 수 있다.
response.sendRedirect()와 동일한 용도로 사용이 가능한 객체이다.

addFlashAttribute() 메서드는 (이름, 값)을 파라미터로 이용하여 화면에 딱 한번만 사용하고 증발(?)해버리는 데이터를 전달한다. 새로고침을 하면 날라감
addAttribute() 리다이렉트할 주소 뒤에 쿼리스트링으로 데이터를 전달해준다.

Controller 메서드의 리턴타입

  • String : jsp를 이용하는 경우 jsp파일의 이름을 나타냄
  • void : 호출하는 URL과 동일한 이름의 jsp를 나타냄
  • VO, DTO타입 : 주로 json타입의 데이터를 만들어서 반환하는 용도
  • ResponseEntity : reponse할때 HTTP헤더 정보와 내용을 가공
  • Model, ModelAndView : Model로 데이터를 반환하거나 화면까지 지정
  • HttpHeaders : 응답에 내용없이 HTTP헤더 메세지만 전달하는 용도로 사용

자주 사용되는 void, String은 servlet-context.xml의 ViewResolver 설정과 맞물려 작동하게 된다.

<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<beans:property name="prefix" value="/WEB-INF/views/" />
	<beans:property name="suffix" value=".jsp" />
</beans:bean>

String은 상황에 따라 다른 화면을 보여줄 필요가 있을 경우 유용하다. (if~else처리)
String 리턴타입에서 return문엔 특별한 키워드를 붙일 수 있다.

  • redirect: 리다이렉트
  • forward: 포워딩(생략시 얘가 기본)
profile
NOBODY

2개의 댓글

comment-user-thumbnail
2021년 3월 27일

안녕하세요. Model model 이 부분이 뭔지 이해가 안가서 구글링했다가 들어와보게 됐습니다. 설명을 정말 잘 해주셔서 한번에 이해가 됐습니다. 정말 감사합니다.

답글 달기
comment-user-thumbnail
2023년 11월 8일

감사합니다

답글 달기