반응형

출처:http://saurus2.tistory.com/entry/Java-Spring-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%8F%99%EC%9E%91-%ED%95%98%EC%A7%80-Hello-World-%EC%9D%98-%EC%9B%90%EB%A6%AC


자바 스프링의 구현 원리를 공부하기 전에 

MVC 패턴에 대해서 먼저 공부해보자. 모델-뷰-컨트롤러(Model-View-Controller, MVC)는 소프트웨어 공학에서 사용되는 아키텍처 패턴이다. 


* 아키텍처 패턴 


아키택처 패턴전에 아키텍처를 알아보자, 

아키텍처의 영문 어원은 Architecture = archi(fisrt, cheif, govern) + tect(build)이다. 건물을 구출할 때 전체적인 구조를 관리하는 의미이다. 

 

 소프트웨어 아키텍처는 무엇인가? 


'소프트웨어 시스템을 구성하는 서브시스템과 컴포넌트, 그리고 그것들의 관계를 나타내는 용어이다.'

- Pattern-Oriented Software Architecture, Volume 1: A System of Patterns


'아키텍처는 컴포넌트로 구체화된 시스템의 기본적인 조직이며 환경에 대한 관계이고 디자인과 진화를 이끄는 원리이다.'

- IEEE1471



 소프트웨어 아키택처를 지칭하는 말들을 정리하면 시스템 즉 프로그램을 구성하는 구성요소(서브시스템, 컴포넌트)와 그들(구성요소) 간의 관계를 나타낸다. 건축을 할때 처럼 기초 토목 공사에서 건물의 외장까지 이르런 설계가 매우 중요한 것처럼, 프로그램을 제작할때 , 시스템을 구성할때 소프트웨어 아키택처가 필요하다. 프로그램의 점점 규모가 커져 복잡해지면 아키텍처의 존재는 불가결하다. 


아키텍처 패턴


 디자인 패턴과 마찬가지로 특정 문제를 해결하기 위해 반복되어 사용되는 솔루션을 문서화한 것이다. 아키텍처 패턴은 소프트웨어 시스템의 구조를 체계적으로 구성하기 위한 기본적인 스키마를 제시한다. 미리 정의된 패턴간의 책임을 명시하여 규칙과 가이드라인을 제시한다. 


아키택처 패턴의 장점 :

1. 검증

2. 시뮬레이션

3. 쉬운 이해


*MVC 패턴이란? 


대표적인 아키택처 패턴의 하나로 시스템 전체를 Model과 View, Controller 세 개의 컴포넌트(더 큰 프로그램이나 구조물에서 식별 가능한 "일부분") 로 나뉘어 있다. 


* Model : 핵심 데이터와 기능을 캡슐화 [ 상태의 변화가 있을때 컨트롤러와 뷰에 이를 통보함, 통보를 통해 뷰는 최신의 결과를 출력, 컨트롤러는 모델의 변화에 따른 적용 가능한 명령을 추가,제거,수정할 수 있다. ]

* View : 사용자에게 정보를 Display, 각뷰마다 컴포넌트 하나씩 연결된다. 사용자는 오직 컨트롤러를 통해서만 시스템과 상호작용한다.  [ 모델로 부터 결과물을 생성한다. ]

* Controller : 데이터와 비즈니스 로직 사이의 상호동작을 관리 [ 모델에 명령을 보내 모델의 상태를 변경할 수 있다. ]





* 실선은 직접적인 관계를 , 점선은 간접적인 관계를 나타낸다. 


MVC 의 개념을 웹에 적용한 예


1. 사용자가 웹사이트에 접속 [controller 사용]

2. Controller 는 사용자가 요청한 웹페이지를 서비스 하기 위해서 모델을 호출해야한다. 

3. 모델은 데이터베이스나 파일과 같은 데이터 소스를 제어한 후 그 결과를 리턴한다. 

4. Controller 는 Model 이 리턴한 결과를 View 에 반영한다. 

5. 데이터가 반영된 View 는 사용자에게 보여진다.



Hello World 동작 원리

1. 클라이언트 요청 

2. web.xml 에서 디스패처 서블릿(Dispatcher Servlet) 클라이언트 요청을 핸들링

3. servlet-context.xml 에서 해당 클래스의 웹요청을 처리하는 컨트롤러를 사용 [HanderMapping으로 Controller 검색]

4. 해당 Controller 가 요청 처리 후, Home (View) 로 리턴 [뷰의 이름은 /WEB-INF/views/home.jsp 로 바뀐다.

5. View 에 출력





* 디스패처 서블릿(Dispatcher Servlet)


 디스패처 서블릿은 클라이언트의 요청을 앞단에서 컨트롤 하기 위해 존재한다. 

컨트롤러에 요청을 객체로 넘겨주기 전에 클라이언트의 요청을 받아 Controller 를 검색하고 , Controller 의 처리 결과를 전달 받아 View를 출력해주는 역할을 한다. 요청을 처리할 Contorller 를 만들어 처리한 결과를 출력해 줄 View 가 필요한다. 


'/Hello/src/main/webapp/WEB-INF/web.xml'


서블릿의 이름은 appServlet 이고, 서블릿 클래스가 'org.springframework.web.servlet.DispatcherServlet' 으로 지정 되어있다.


초기화 파라메터(init-param; initial parameter 

<init-param> 으로 contextConfigLocation 을 설정해 준다. init-param 은 초기화 파라메터를 설정하는 부분이다.

컨텍스트의 위치는 WEB-INF/spring/appServlet/servlet-context.xml 로 되어있다. 아래의 servlet-context.xml 파일을 보자.



/Hello/src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml


 맨위의 annotation-driven 은 어노테이션 기반을 사용하겠다고 설정하는 것이다. 컨트롤러 작성을 클래스에 @Controller 어노테이션을 붙여 해당 클래스를 웹 요청 처리를 하는 컨트롤러로 사용할 수 있다. (스프링 2.5부터)


 resources 태그는 HTTP GET 으로 들어온 /resources/~ 형태의 요청(보통 정적 파일)을 웹어플리케이션루트/resouces 디렉토리로 지정을 하겠다는 것이다. 


 웹 페이지에서 최종형태는 HTML 같은 형태의 뷰인데, 기본적으로 템플릿에는 jsp 페이지로 되어 있다. 컨트롤러는 ViewResovler 를 통해 View 객체를 리턴한다. 위의 파일의 'InternalResourceViewResolver' 가 리졸버로 지정되어 있다. 


 아래에서 설명할 View 리턴은 , prefix 가 /WEB-INF/views/ 이고 , suffix 가 .jsp 로 생성된다. 결국 /WEB-INF/views/home.jsp 로 바뀐다.


/hello/ 요청


localhost 의 8080포트로 GET /hello/HTTP/1.1 요청을 하면 서블릿은 /hello 를 보고 hello 쪽으로 넘기고 hello 프로젝트 관점에서는 / 라는 리소스의 요청이 있다. 이 요청은 HomeController 클래스가 담당하도록 템플릿이 만들어준다. 



/Hello/src/main/java/com/hellowolrd/hello/HomeController.java


@Controller 라는 어노테이션이 붙어 있으면 서버가 시작할때 RequestMappingHandlerMapping 에 의해서 자동으로 등록이 된다. HomeController 에는 home 이라는 메소드에 @RequestMapping 이라는 어노테이션이 붙어있다. 요청처리를 매핑하기 위한 어노테이션인데, HTTP GET 으로 '/' 에 대한 처리를 담당 한다. 


 브라우저에서 요청한 http://localhost:8080/hello/ 는 Homecontroller.home 이라는 메소드로 돌아온다. 

home 메소드는 java.text.DataFormat 클래스에서 현재 날짜와 시간을 해당 로케일에 맞게 가져온 후에 문자열로 만들어 serverTime 이라는 속성에 넣어 home 이라는 뷰에 넘긴다

 


 Home 이라는 뷰이름은 /WEB-INF/views/home.jsp 로 바뀐다. 


/Hello/src/main/webapp/WEB-INF/views/home.jsp


 jsp 는 html 을 만들기 위한 템플릿이며 결국은 아래와 같은 HTML 이 동적으로 만들어 진다. ${serverTIme} 이라는 부분이 리턴한 값으로 대체가 된다. 컨트롤러에서 model.addAttribute("serverTime", formattedDate); 에서 모델의 애트리뷰트 이름이 serverTime 이다. 



[출처]

https://ko.wikipedia.org/wiki/%EB%AA%A8%EB%8D%B8-%EB%B7%B0-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC -출처 위키백과

https://opentutorials.org/course/697/3828 - 출처 생활코딩

http://www.zdnet.co.kr/news/news_view.asp?artice_id=20090623150606&type=det&re= - 출처 지디넷 코리아 

http://egloos.zum.com/pelican7/v/2586302 - 출처 가시고기의 바깥 세상 둘러보기



반응형

+ Recent posts