티스토리 뷰

안녕하세요. MIN-IT입니다.


이번시간은 Spring MVC과 DispatcherServlet 대해 공부해보겠습니다..


퍼가실 때 댓글을 남겨주시면 감사하겠습니다.


http://min-it.tistory.com



스프링 MVC는 모델 2방식 구조입니다.

웹 개발시 대부분 사용하는 모델2 방식은 MVC 구조를 응용한 방식으로

생각하시면 편하겠습니다.


모델2방식은 무엇일까? 한마디로 표현하자면

화면을 담당하는 View적인부분과

데이터를 처리하는 비즈니스로직부분을 분리한 것으로

디자이너와 개발자의 작업분리가 되어있어 작업하기 편리하며

재사용이 가능한 구조라고 이해하시면되겠습니다.


(예를들어 JSP에서 화면설계도 하면서 비즈니스로직들이 중간중간 섞여있다면..

즉, 내가 쓴 코드와 남이 쓴 코드도 함께 들어있으니 개발하는데 디자이너도 짜증나고 개발자인 자신도 짜증이나니 작업하는 공간을 분리시켜 놓은거에용)


모델 2방식인 MVC는 무엇을 뜻 할까요??

Model(모델) : 데이터를 처리하는 부분

View(뷰) : 화면을 담당하는 부분

Controller(컨트롤러) :  요청을 처리하는 부분으로 뷰와 모델사이의 통신 역할


따라서 모델2의 패턴은

어떤 요청이 들어오면 컨트롤러가 요청을 받고 요청에 해당하는 모델을 호출하게 됩니다. 호출된 모델은 데이터들을 처리한 후 컨트롤러에게 요청에 대한 결과(응답)를 보내고 컨트롤러는 뷰에게 전송하는 원리입니다.

(요청-컨트롤러-모델-컨트롤러-뷰)


다시 설명하자면!(원리는 이해하는게 중요합니다!)

A라는애가 컨트롤러에게 요청을 보냅니다.

컨트롤러 : 모델아 요청처리해줘~ 라고 합니다.

모델 : 요청처리했다~여기 요청에 대한 응답한거 가져가

컨트롤러  : ㄳㄳ 응답한거 View야 가져가라

뷰 : 컨트롤러야 고마워

응답한 결과값을 화면에 뿌려주는 원리입니다.


이런구조로 만들게 되면 위에서 설명했듯이

개발자와 디자이너(웹 퍼블리셔)의 작업공간을 분리시킬수 있고

컨트롤러는 URL을 통해 뷰를 제어하기때문에 뷰(화면)을 변경이나 수정할때

유용하게 사용된다.(유지보수가 좋다!)



모델 2방식의 MVC구조를 이해하셨다면 이제 저희가 실습 할 MVC에 대해서

이야기 해드리겠습니다.


MVC를 좀더 구조적으로 설명하고 실습을 진행하겠습니다.




(Spring MVC DispatcherServlet)


1. 클라이언트(사용자)의 모든 요청은 DispatcherServlet이 받는다.


2. DispatcherServlet은 hanlderMapping을 통해서 요청에 해당하는 Controller를

실행 시킨다.


3. Controller는 적절한 서비스 객체를 호출 시킨다.


4. Service는 DB처리를 위해  DAO를 이용하여 데이터를 요청 한다.


5.DAO는 mybatis를 이용하는 Mapper를 통해 작업 처리를 한다.


6. 결과(처리한 데이터)가 mapper->DAO->Service->Controller로 전달된다.


7. Contorller는 전달된 결과(처리된 데이터)를 View Resolver를 통해

전달 받을 View가 있는지 검색한다.


8. 전달 받은 View가 있다면 View에게 전달된 결과(처리된 데이터)를 전달한다.


9. View는 전달받은 결과(처리된 데이터)를 다시 DispatcherServlet에게 전달한다.


10. DispatcherServlet은 전달받은 결과(처리된 데이터)를 클라이언트에게 전달한다.


*Front Controller의 역할은 서버로 들어오는 모든 요청을 받아서 처리합니다.

(공통 처리 작업을 먼저 수행 한 후 적절한 세부컨트롤러에게 작업을 위임해주고 예외 발생시 일관된 방식으로 에러를 처리해주는 일을 합니다.

이런 일들을 하기 때문에 각 컨트롤러들 사이의 중복된 코드 문제나

협업시 개발자들의 개발 방식이 다른 경우 등을 해결을 할 수 있습니다.)



*스프링에서 제공하는 FrontController인 DispatcherServlet의 역할은 무엇일까요??

DispatcherServlet의 등장으로 엄청나게 web.xml의 역할이 축소 된 것입니다.

DispatcherServlet가 있기전에는 사용자의 URL을 일일이 요청을 처리하기 위해

web.xml에 등록(서블릿과 매핑시켜주는 작업)을 반드시 해야했었습니다.


그렇다고 web.xml이 안쓰이는 것은 아닙니다.

web.xml에서 자주 쓰이는 서블릿 매핑을 DispatcherServlet이 한다고 생각하시면 되고

나머지 web.xml의 기능들은 그대로 web.xml을 이용하신다고 생각하시면됩니다.

(web.xml의 기능은 DispatcherServlet등록, 객체의 URL범위 , 필터 등이 있습니다.)




*스프링 MVC Controller의 특징


1. 파라미터 수집

-사용자의 요청에 필요한 데이터를 추출하고

VO(DB의 레코드와 상응되는 클래스) 나 DTO(컨트롤러,뷰,비즈니스등의 계층간 데이터 교환을 위한 자바빈즈)로 변환하는 파라미터의 수집 작업을 합니다.


2.애노테이션을 통한 간편 설정

-스프링 MVC 설정은 MVC나 애노테이션을 사용가능하고, 주로

애노테이션을 이용하여 클래스나 메소드의 선언에 필요한 애노테이션을 추가하는

작업을 통해 요청이나 응답에 필요한 모든 처리를 완료할 수 있습니다.


3.테스트의 편리

-WAS의 실행없이도 테스트할 수 있는 편리한 방법을 제공








*프로젝트 생서시 DispatcherServlet인

servlet-context.xml에 대해 알아보겠습니다.





<annotation-driven>

-클래스 선언에 애노테이션을 이용해서 컨트롤러를 작성 가능하게 합니다.


<resources>

-웹 이미지/CSS/javaScript 파일과 같이 고정된 자원들의 위치

(스프링 MVC패턴 자체가 디스패처 서블릿이 모든 요청을 컨트롤러에게 넘겨주는 방식인데 css등의 요청들도 컨트롤러에게 넘겨주면 컨트롤러가 해야할 일도 아니지만 컨트롤러는 해당하는 요청이 없기 때문에 에러가 날 것입니다. 만약 정상작동 하더라도 JSP안의 CSS나 자바스크립트등을 디스패처 서블릿이 가로채가서 원하는 화면이 안나올 것입니다. 이를 해결하기위해 resources가 있는것이죠)


<component-scan>

-패키지 내부의 클래스(클래스 패스에 위치해있는 클래스)들을 조사하는 것으로

만약 <annotation-driven>과 같이 사용하게 된다면

특정한 애노테이션이 붙은 클래스를 자동으로 빈으로 등록하는 기능을 제공합니다.

스프링 MVC를 하다면 자동으로 빈을 등록해주는 기능이

얼마나 편리한지 아시게 될것입니다.^^






*실습을 하기전 주로 사용하는 애노테이션을 알고가세요

(한번 정리해 두면 유용합니다.)


@애노테이션명 - 사용할수있는곳


@Controller - 클래스

-컨트롤러 객체임을 명시


@RequestMapping -클래스, 메소드

-특정 URL에 매칭되는 클래스나 메소드임을 명시


@RequestParam -파라미터

-요청에서 특정한 파라미터 값을 찾아낼 때 사용


@RequestHeader -파라미터

-요청에서 특정 HTTP 헤더 정보를 추출할 때 사용


@PathVariable -파라미터

-현재 URL에서원하는 정보를 추출할 때 사용


@CookieValue -파라미터

-현재 사용자의쿠키가 존재하는 경우 쿠키의 이름을 이용해서 쿠키값 추출


@ModelAttribute -메소드, 파라미터

-자동으로 해당 객체를 뷰까지 전달하도록 만든 것


@SessionAttribute -클래스

-세션상에서 모델의 정보를 유지하고 싶은 경우


@InitBinder -메소드

-파라미터를 수집해서 객체로 만들 경우 커스터마이징


@ResponseBody -메소드,리턴타입

-리턴 타입이 HTTP의 응답 메시지로 전송


@RequsetBody -파라미터

-요청 문자열이 그대로 파라미터로 전달


@Repository -클래스

-DAO 객체


@Service - 클래스

-서비스 객체





다음 시간에는 본격적으로 MVC 실습을 해보도록 하겠습니다.



* 포스팅을 마치겠습니다.

궁금하거나 잘못된 부분이있다면 알려주시면 감사하겠습니다.*

을 마치겠습니다.

궁금하거나 잘못된 부분이있다면 알려주시면 감사하겠습니다.*



출처: http://min-it.tistory.com/6 [MIN-IT]


댓글