[Ace-T의 Spring강좌] Step 04. Spring @MVC 분석-01

2014. 2. 5. 01:32OpenSource/Spring 강좌

반응형

[Ace-T의 Spring강좌]

   Step 04. Spring @MVC 만들기>>


<< 목표 환경 >>

1) Eclipse(done)

2) PostgreSQL

3) Apache Tomcat or JBoss

4) JUnit(done)

5) SpringFramework(done)

6) JDK 6.0(done)

 


2013/11/03 - [OpenSource/Spring 강좌] - [Ace-T의 Spring강좌] Step 01. Spring 환경 구축 하기(Eclipse+Jdk)


2013/11/05 - [OpenSource/Spring 강좌] - [Ace-T의 Spring강좌] Step 02. Spring 환경 구축 하기(Maven+Spring Project)


2013/12/04 - [OpenSource/Spring 강좌] - [Ace-T의 Spring강좌] Step 03. Spring 환경 구축 하기(was)


 Step 03. Spring 환경 구축 하기(was)에서 환경을 구축해보았습니다.

이제는 mvc에 대해서 알아보도록 하겠습니다^^

우선 spring에서 자동으로 만들어준 소스를 가지고 상태여야 한다.(step 3 을 참고!!)

그 소스에 대해서 조금 간단히 살펴 보겠습니다~

이 글에서는 일명 @MVC를 토대로 합니다.(즉, 어노테이션 기반 MVC이죵!) 

그리고 오늘 학습을 해야 할것은 HomeController.java의 내용에 있는 어노테이션들 입니다.

@RequestMapping, @Controller

 

HomeController.java      

package kr.pe.acet;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {
 
 private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
 
 /**
  * Simply selects the home view to render by returning its name.
  */
 @RequestMapping(value = "/", method = RequestMethod.GET)
 public String home(Locale locale, Model model) {
  logger.info("Welcome home! The client locale is {}.", locale);
  
  Date date = new Date();
  DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
  
  String formattedDate = dateFormat.format(date);
  
  model.addAttribute("serverTime", formattedDate );
  
  return "home";
 }
 
}

 

하지만 우선~~~!! Controller의 메소드 파라미터를 보도록 하겠지만...

아래의 Controller의 메소드 파라미터 블라블라를 보기전에 아래의 MVC의 주요 구성요소와 MVC패턴에 

대해서먼저 학습하면 좋을 것 같습니다.

2012/11/09 - [OpenSource/Spring MVC] - Spring MVC의 주요 구성요소


이제 아래를 학습하여 보자!

 @Controller 의 메소드 파라미터로 올 수 있는 것들!(참고 : 토비님 책3.1v 볼률2, 486p~)

 파라미터(Parameter)

 간단 설명(simple contents)

 HttpServletRequest,

 HttpServletResponse

 서블릿 관련~

 HttpSession

 서블릿 관련~

 WebRequest,

NativeWebRequest

 HttpServletRequest의 요청정보를 대부분 그대로 갖고 있는, 서블릿 API에

 종속적이지 않은 오브젝트 타입이다.(서블릿과 포틀릿 환경 양쪽에 모두 적용

 가능한 범용적인 핸들러 인터셉터를 만들 때 활용하기 위해 만들어졌다.

Locale

 java.util.Locale 타입으로 DispatcherServlet의 지역정보 리졸버(Locale

 Resolver)가 결정한 Locale 오브젝트를 받을 수 있다.

 Locale은 예를들어 ko_KR, jp_JP(?) 암튼 한국어, 일본어, 영어 등등 이라고

 보면  된다.

InputStream, Reader

 HttpServletRequest의 getInputStream()을 통해서 받을 수 있는 콘텐트 스트림

 또는 Reader 타입 오브젝트를 제공 받을 수 있다.

OutputStream, Writer

 HttpServletRequest의 getIOutputStream()을 통해서 받을 수 있는 콘텐트 스트림

 또는 Writer 타입 오브젝트를 제공 받을 수 있다.

@PathVariable

 @RequestMapping의 URL에 {}로 들어가는 패스 변수(path variable)를 받는다.

 http://acet.pe.kr/post/?id=10 이라고 하는걸 http://acet.pe.kr/post/10 으로

 만들 수 있다.

 ex) @RequestMapping("/post/{id}")

      public String view(@PathVariable

@RequestParam

 public String view(@RequestParam("id") int id){....}

@CookieValue

 HTTP요청과 함께 전달된 쿠키 값을 메소드 파라미터에 넣어주도록

 @CookieValue를 사용 할 수 있다.

@RequestHeader

 요청 헤더정보를 메소드 파라미터에 넣어주는 어노테이션이다. 

 헤더정보에 있는 Server정보, Content-Type등의 정보를 이용하여 어디에서 접근

 하는지 알아내서 view를 다르게 해준다던지 하는 것들을 구현 할 수 가 있다. 

Map, Model, ModelMap

 다른 어노테이션이 붙어있지 않다면

 @ModelAttribute

 요청 파라미터를 메소드 파라미터에서 1:1로 받으면 @RequestParam이고,

 도메인 오브젝트나 DTO, VO의 프로퍼티에 요청 파라미터를 바인딩해서 한번에 받으면 @ModelAttribute라고 볼 수 있다.

 ex) @RequestMapping("/acet/search")

         public String search(@ModelAttribute UserSearch  userSearch){

            List<User> list = userService.search(userSearch);

            model.addAttribute("userList", list);

              ..................

        }

Errors, BindingResult 

 변환작업 시 오류가 있을 때 @ModelAttribute를 사용 했을 때는 @RequestParam과는 달리 HTTP 400 이 발생하지 않고 작업은 계속 진행 되어지며, 단지 타입 변환 중에 발생한 예외가 BindException 타입의 오브젝트에 담겨서 컨트롤러로 전달 된다. 즉, 예외처리에 대한 기회를 주어야 하므로

 org.springframework.validation.Errors or org.springframework.validation.

BindingResult 타입의 파라미터를 같이 사용 한다.

 ex) @RequestMapping(value="add", method=RequestMethod.POST)

      public String add(@ModelAttribute User user, BindingResult bindingResult)      { ................... }

 BindingResult 대신 Errors를 사용해도 되며, 사용시 주의 사항으로는 반드시

 @ModelAttribute 뒤에 나와야 한다.@ModelAttribute 검증작업에서 나온 오류만을

 전달하기 때문이다. 

 SessionStatus

 컨트롤러가 제공하는 기능 중에 모델 오브젝트를 세션에 저장했다가 다음 페이지

 에서 다시 활용하게 해주는 기능이 있다. 

 org.springframework.web.bind.support.SessionStatus 오브젝트이며,

 필요없어지면 확실하게 제거해줘야 한다.

 @RequestBody

 Http 요청의 본문(body) 부분이 그대로 전달 된다.

 일반적인 GET/POST의 요청 파라미터라면 사용 할 일이 없다. 

 XML이나 JSON 기반의 메시지를 사용하는 경우에는 이 방법이 매우 유용하다.

 또한 메시지컨버터가 필요하다! ㅎㅎ 

 @Value

 SpEL을 이용해 클래스의 상수를 읽어오거나 특정 메소드를 호출한 결과 값, 조건식 등을 넣을 수 있다.

 ex) @RequestMapping(...)

 public String hello(@Value("#{systemProperties['os.name']}") String osName){...} 필드 주입이라는 것도 있다.

 @Valid

 @Valid는 JSR-303의 빈 검증기를 이용해서 모델 오브젝트를 검증하도록 지시하는지시자다. 

서버 Valid는 토비 책 뒤편에 보면 나오며, @Validate도 있다!~

 

많은 것들이 있네요..하하;

하지만 우리의 소스에서는 아래와 같이 Locale과 Map, Model, ModelMap 중 Model이 쓰였습니다. ㅋㅋ

  public String home(Locale locale, Model model) {


Controller 소스는 매우 간단합니다.  시간을 구해서 해당 View에다가 줘서 찍어주는게 끝이네요^^;

   model.addAttribute("serverTime", formattedDate );  

  return "home";


※ Model Interface (http://docs.spring.io/spring/docs/3.2.x/javadoc-api/ 참조 하시면 됩니다.)

org.springframework.ui

  Interface Model

Model addAttribute(String name, Object value)

value 객체를 name 이름으로 추가 

Model addAttribute(Object value)

value를 추가. value의 패키지 이름을 제외한 단순 클래스 이름을 모델 이름으로 사용(첫 글자는 소문자). value가 배열이거나 콜렉션인 경우 첫 번째 원소의 클래스 이름 뒤에 "List"를 붙인 걸 모델 이름으로 사용(첫 글자는 소문자)

Model addAllAttributes(Collection<?> values)

addAttribute(Object value) 메소드를 이용해서 콜렌션에 포함된 객체들을 차례대로 추가

Model addAllAttributes(Map<String, ?>, attributes)

Map에 포함된 <키, 값>에 대해 키를 모델 이름으로 사용해서 값을 모델로 추가

Model mergeAttributes(Map<String, ?>, attributes>

Map에 포함된 <키, 값>을 현재 모델에 추가. 단 키와 동일한 이름을 갖는 모델 객체가 존재하지 않는 경우에만 추가

boolean containsAttributes(String name)

지정한 이름의 모델 객체를 포함하고 있는 경우 true 리턴


     위의 model에서 시간을 serverTime에다가 넣어주면 그 model은 home.jsp에 전달이 되어진다.

     즉, View단, home.jsp(src/main/webapp/WEB-INF/views/home.jsp)를 보면 아래와 같습니다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%@ page session="false" %>

<html>

<head>

<title>Home</title>

</head>

<body>

<h1>

Hello world!  

</h1>


<P>  The time on the server is ${serverTime}. </P>

</body>

</html>



     << 결과 >>     


아래의 주소(http://localhost:8080/)대로 치면 아래처럼 결과가 나오지 않는다. 그 이유는 Step 03 강좌에서도 설명 하였듯이 Context root 가 다른걸로 잡혀있기 때문이다.

그러므로 tomcat의 context root를 / 로 수정을 해주면 된다.

자세한 설명은  

2013/12/04 - [OpenSource/Spring 강좌] - [Ace-T의 Spring강좌] Step 03. Spring 환경 구축 하기(was)


또는 아래의 동영상을 참고 하길 바랍니다^^;; - (단, STS 기반 입니다~!)

(동영상이 구리긴하네요...720 고화질로 보셔야 합니다~~)



쫘잔~~아래의 결과가 나오시나요?? ㅎㅎㅎ

[Locale이 잘 안맞는지...깨져서 나온다 ㅋㅋ; 일단 PASS~~~]


 Model addAttribute(String name, Object value)로 인해서 시간이 name에 binding 되어지고, ${serverTime}으로 찍혀지게 된다.  스트럿츠나 jsp로 코드를 짜던 시절에서는 request로 view단에 넘겨주고는 하였다.

위의 내용을 정확히 알기 위해서는 Spring MVC 패턴, WEB.xml(was꺼 아니죠~) 을 알아야 한다.

다시 한번~링크!!

2012/11/09 - [OpenSource/Spring MVC] - Spring MVC의 주요 구성요소 

2012/11/09 - [OpenSource/Spring MVC] - 웹??? web.xml은 알고 하자!!


Web 브라우저에서 URL 들어오면, WEB.xml에 설정 해 놓은 DispatcherServlet에 전달 되어지고, 

url-mapping에 의해 mapping되어진 Controller를 찾고 해당하는 method부터 시작이 되어진다! 두둥~


옛날 jsp 시절에는 view단에서  <%= request.getParameter("name") %>를 썼었다. ㅋㅋ;




 음...조금 더 디테일하게 써보려고 했는데....새벽 1시간 넘었네요..ㅠ.ㅠ..

 독감이 걸린 상태라..쿨럭 쿨럭~ 이번 강좌는 여기까지 써야겠네요..하하;

 조금이나마 도움이 되셨으면 좋겠네요^-^

 건강이 제일 큰 재산 입니다. 건강하세요~~~~


5번째 강좌에서는 조금 더 자세하게 Spring MVC에 대해서 학습 하도록 하겠습니다^-^

언젠가는...Mybatis도 연동하는 날이 오겄져 뭐~ㅋㅋㅋㅋ


     - to be continue... by Ace-T -

반응형