<commit_before>---
layout: post
title: '[SpringMVC] Spring MVC Framework란'
subtitle: 'Spring MVC를 이해한다.'
date: 2018-12-20
author: <NAME>
cover: '/images/spring-framework/spring-framework-main.png'
tags: springMVC mvc architecture structure web
comments: true
sitemap :
  changefreq : daily
  priority : 1.0
---

## Goal
> - Spring MVC Architecture를 이해한다.
> - 기본 Project Structure을 이해한다.
> - Spring MVC에서 Model, View, Controller의 사용법을 이해한다.
  - Model
  - View
  - Controller
> - Spring MVC를 위한 필수적인 기본 설정 방법과 개념을 이해한다.
  - Maven Configuration (pom.xml)
  - Web Deployment Descriptor (web.xml)
  - Spring MVC Configuration

## Spring MVC Architecture란
![](/images/web/springmvc-architecture.png)
Model, View, Controller를 분리한 디자인 패턴 (개발자가 직접 구현해야 하는 것)
* Model
    * 애플리케이션의 상태(data)를 나타낸다.
    * 일반적으로 POJO로 구성된다.
    * **Java Beans**
* View
    * 디스플레이 데이터 또는 프리젠테이션 
    * Model data의 렌더링을 담당하며, HTML ouput을 생성한다.
    * **JSP**
    * JSP 이외에도 Thymeleaf, Groovy, Freemarker 등 여러 [Template Engine](https://gmlwjd9405.github.io/2018/12/21/template-engine.html)이 있다.
* Controller
    * View와 Model 사이의 인터페이스 역할
    * Model/View에 대한 사용자 입력 및 요청을 수신하여 그에 따라 적절한 결과를 Model에 담아 View에 전달한다.
    * 즉, Model Object와 이 Model을 화면에 출력할 View Name을 반환한다.
    * Controller ---> Service ---> Dao ---> DB
    * **Servlet**

Spring Framework가 제공하는 Class
* DispatcherServlet
    * Spring Framework가 제공하는 Servlet 클래스
    * 사용자의 요청을 받는다.
    * Dispatcher가 받은 요청은 HandlerMapping으로 넘어간다. 
* HandlerMapping
    * 사용자의 요청을 처리할 Controller를 찾는다. (Controller URL Mapping)
    * 요청 url에 해당하는 Controller 정보를 저장하는 table을 가진다.
    * 즉, 클래스에 @RequestMapping("/url") annotaion을 명시하면 해당 URL에 대한 요청이 들어왔을 때 table에 저장된 정보에 따라 해당 클래스 또는 메서드에 Mapping한다.
* ViewResolver
    * Controller가 반환한 View Name(the logical names)에 prefix, suffix를 적용하여 View Object(the physical view files)를 반환한다.
    * 예를 들어 view name: home, prefix: /WEB-INF/views/, suffix: .jsp는 "/WEB-INF/views/home.jsp"라는 위치의 View(JSP)에 Controller에게 받은 Model을 전달한다.
    * 이 후에 해당 View에서 이 Model data를 이용하여 적절한 페이지를 만들어 사용자에게 보여준다.

---

## 기본 Project Structure
Web Application Structure(웹 서비스 기본 설정 구조)
![](/images/web/web-project-structure.png)

* src
    * 개발자가 작성한 Servlet 코드가 저장된다.
    * Controller, Model, Service, Dao
* Libraries
    * Servlet이나 JSP에서 추가로 사용하는 라이브러리 또는 드라이버
    * jar로 압축한 파일이어야 한다.
* WebContent (**전체 ROOT**) - webapp
    * Deploy할 때 WebContent 디렉터리 전체가 .war로 묶어서 보내진다.
    * resources
        * 정적인 데이터 (ex. image file, css, js, fonts)
    * WEB-INF
        * classes: 작성한 Java Servlet 파일이 나중에 .class로 이곳에 모두 저장된다. 
        * lib: 추가한 모든 라이브러리 또는 드라이버가 이곳에 모두 저장된다.
        * props: property file을 저장한다.
        * spring: <span style="background-color: #e1e1e1">**spring configuration files**</span>을 저장한다. (spring과 관련된 설정을 모아둔 것)
            * dispatcher-servlet.xml
            * applicationContext.xml
            * dao-context.xml, service-context.xml 등 
        * views: Controller와 매핑되는 .jsp 파일들을 저장한다.
        * web.xml: web application의 설정을 위한 <span style="background-color: #e1e1e1">**web deployment descriptor**</span>
            * DispatcherServlet, ContextLoadListener 설정
* pom.xml
    * <span style="background-color: #e1e1e1">**maven configuration file**</span>
    * 어떤 lib를 쓸지 명시한다.

---

## Spring MVC에서 Model, View, Controller
### Model
* Controller에서 View로 객체를 전달하는데 사용된다.
* 명명된 객체들의 집합이라고 할 수 있다.
    * Key-Value 형식의 하나의 쌍(하나의 열)을 명명된 객체라고 부른다.
    * 또한 이 명명된 객체는 model attribute라고 부른다.
    * 여러 개의 attribute가 모여 Table 형식을 이룬다.
* view에서 attribute의 key 값을 통해 value 값을 사용할 수 있다.

| Key(name) | Value |
| key1 | value |
| key2 | value2 | 

Model Inplementations
* Model을 표현하기 위해 여러 자료구조를 사용할 수 있다.
* Controller 메서드에 input argument로 값을 넣어주면 Spring Frmework가 자동으로 Model을 만들어주고 해당 Model의 주솟값만 넘겨준다.<commit_msg>Update Web Application Structure<commit_after>---
layout: post
title: '[SpringMVC] Spring MVC Framework란'
subtitle: 'Spring MVC를 이해한다.'
date: 2018-12-20
author: <NAME>
cover: '/images/spring-framework/spring-framework-main.png'
tags: springMVC mvc architecture structure web
comments: true
sitemap :
  changefreq : daily
  priority : 1.0
---

## Goal
> - Spring MVC Architecture를 이해한다.
> - 기본 Project Structure을 이해한다.
> - Spring MVC에서 Model, View, Controller의 사용법을 이해한다.
  - Model
  - View
  - Controller
> - Spring MVC를 위한 필수적인 기본 설정 방법과 개념을 이해한다.
  - Maven Configuration (pom.xml)
  - Web Deployment Descriptor (web.xml)
  - Spring MVC Configuration

## Spring MVC Architecture란
![](/images/web/springmvc-architecture.png)
Model, View, Controller를 분리한 디자인 패턴 (개발자가 직접 구현해야 하는 것)
* Model
    * 애플리케이션의 상태(data)를 나타낸다.
    * 일반적으로 POJO로 구성된다.
    * **Java Beans**
* View
    * 디스플레이 데이터 또는 프리젠테이션 
    * Model data의 렌더링을 담당하며, HTML ouput을 생성한다.
    * **JSP**
    * JSP 이외에도 Thymeleaf, Groovy, Freemarker 등 여러 [Template Engine](https://gmlwjd9405.github.io/2018/12/21/template-engine.html)이 있다.
* Controller
    * View와 Model 사이의 인터페이스 역할
    * Model/View에 대한 사용자 입력 및 요청을 수신하여 그에 따라 적절한 결과를 Model에 담아 View에 전달한다.
    * 즉, Model Object와 이 Model을 화면에 출력할 View Name을 반환한다.
    * Controller ---> Service ---> Dao ---> DB
    * **Servlet**

Spring Framework가 제공하는 Class
* DispatcherServlet
    * Spring Framework가 제공하는 Servlet 클래스
    * 사용자의 요청을 받는다.
    * Dispatcher가 받은 요청은 HandlerMapping으로 넘어간다. 
* HandlerMapping
    * 사용자의 요청을 처리할 Controller를 찾는다. (Controller URL Mapping)
    * 요청 url에 해당하는 Controller 정보를 저장하는 table을 가진다.
    * 즉, 클래스에 @RequestMapping("/url") annotaion을 명시하면 해당 URL에 대한 요청이 들어왔을 때 table에 저장된 정보에 따라 해당 클래스 또는 메서드에 Mapping한다.
* ViewResolver
    * Controller가 반환한 View Name(the logical names)에 prefix, suffix를 적용하여 View Object(the physical view files)를 반환한다.
    * 예를 들어 view name: home, prefix: /WEB-INF/views/, suffix: .jsp는 "/WEB-INF/views/home.jsp"라는 위치의 View(JSP)에 Controller에게 받은 Model을 전달한다.
    * 이 후에 해당 View에서 이 Model data를 이용하여 적절한 페이지를 만들어 사용자에게 보여준다.

---

## 기본 Project Structure
Web Application Structure(웹 서비스 기본 설정 구조)
![](/images/web/web-project-structure.png)

* src
    * 개발자가 작성한 Servlet 코드가 저장된다.
    * Controller, Model, Service, Dao
    * src/main/java
        * 개발되는 Java 코드의 경로
    * src/main/resources
        * 서버가 실행될 때 필요한 파일들의 경로
    * src/test/java
        * 테스트 전용 경로 (각 테스트 코드 작성 경로)
    * src/test/resource
        * 테스트 시에만 사용되는 파일들의 경로
* Libraries
    * Servlet이나 JSP에서 추가로 사용하는 라이브러리 또는 드라이버
    * jar로 압축한 파일이어야 한다.
* WebContent (**전체 ROOT**) - webapp
    * Deploy할 때 WebContent 디렉터리 전체가 .war로 묶어서 보내진다.
    * resources
        * 정적인 데이터 (ex. image file, css, js, fonts)
    * WEB-INF
        * classes: 작성한 Java Servlet 파일이 나중에 .class로 이곳에 모두 저장된다. 
        * lib: 추가한 모든 라이브러리 또는 드라이버가 이곳에 모두 저장된다.
        * props: property file을 저장한다.
        * spring: <span style="background-color: #e1e1e1">**spring configuration files**</span>을 저장한다. (Spring과 관련된 설정 파일을 모아둔 것)
            * dispatcher-servlet.xml
            * applicationContext.xml
            * dao-context.xml, service-context.xml 등 
        * views: Controller와 매핑되는 .jsp 파일들을 저장한다. (JSP 파일의 경로)
        * web.xml: web application의 설정을 위한 <span style="background-color: #e1e1e1">**web deployment descriptor**</span>
            * DispatcherServlet, ContextLoadListener 설정
* pom.xml
    * <span style="background-color: #e1e1e1">**maven configuration file**</span>
    * 어떤 lib를 쓸지 명시한다.

---

## Spring MVC에서 Model, View, Controller
### Model
* Controller에서 View로 객체를 전달하는데 사용된다.
* 명명된 객체들의 집합이라고 할 수 있다.
    * Key-Value 형식의 하나의 쌍(하나의 열)을 명명된 객체라고 부른다.
    * 또한 이 명명된 객체는 model attribute라고 부른다.
    * 여러 개의 attribute가 모여 Table 형식을 이룬다.
* view에서 attribute의 key 값을 통해 value 값을 사용할 수 있다.

| Key(name) | Value |
| key1 | value |
| key2 | value2 | 

Model Inplementations
* Model을 표현하기 위해 여러 자료구조를 사용할 수 있다.
* Controller 메서드에 input argument로 값을 넣어주면 Spring Frmework가 자동으로 Model을 만들어주고 해당 Model의 주솟값만 넘겨준다.
{'fraction_non_alphanumeric': 0.10014122480421107, 'fraction_numerical': 0.008730260623956862, 'mean_word_length': 2.885286783042394, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 31, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 16}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3300337', 'n_tokens_mistral': 3958, 'n_tokens_neox': 4664, 'n_words': 945}