개발자 끄적끄적

Spring MVC 본문

웹프레임워크

Spring MVC

햏치 2024. 4. 23. 13:15

<서블릿(Servlet)>
- 클라이언트의 요청을 처리하도록 특약 규약이 맞춰 Java 코드로 작성하는 클래스 파일
- 아파치 톰캣(Apache Tomcat)은 이러한 서블릿들이 웹 애플리케이션으로 실행할 수 있도록 해주는 서블릿 컨테이너(Servlet Container) 중 하나이다


<MVC>
- MVC 패턴은 애플리케이션을 개발할 때 사용하는 디자인 패턴
  1. Model : 작업의 처리 결과 데이터
    - 클라이언트의 요청을 구체적으로 처리하는 영역을 서비스 계층(Service layer)
    - 요청사항을 처리하기 위해 Java 코드로 구현한 것을 비즈니스 로직(Business Logic)
  
  2. View : Model을 이용하여 화면에 보이는 리소스(Resource)역할을 한다
    - HTML 페이지 출력
    - PDF, Excel 등의 문서 형태로 출력
    - XML, JSON 등 특정 형식의 포멧으로 변환


  3. Controller : 클라이언트 측의 요청을 직접적으로 받는 엔드포인트(Endpoint)로서 Moel과 View의 중간에서 상호작용을 한다
    - 클라이너 측의 요청을 전달받아 비즈니스 로직을 거친 후, Model 데이터가 만들어지면, 이 Model 데이터를 View에 전달



<DispatcherServlet>
- HttpServlet을 상속받아 사용하고, 서블릿으로 동작
- DispatcherServlet -> FrameworkServlet -> HttpServletBean -> HttpServlet
  - Dispatcher Servlet을 사용하면 서블릿으로 등록하면서 모든 경로에(urlPatterns="/")에 대해 매핑한다

- 요청흐름
  - 서블릿이 호출되면 HttpServlet이 제공하는 service()가 호출
  - 스프링 MVP는 FrameworkServlet.service()를 시작으로 여러 메서드가 호출된다




<용어>
- Controller : The output can be attached to model objects which will be sent to the view 
  - Class level mapping
  - Handler level mapping

- View Resolver : finds the physical view files from the logical names
- View : physical view files which can be JSP, HTML, XML, Velocity template, etc



<동작 순서>
- 핸들러 조회 : 핸들러 매핑을 통해 URL에 매핑된 핸들러(컨트롤러)를 조회
- 핸들러 어댑터 조회 : 핸들러를 실행할 수 있는 핸들러 어뎁터를 조회
- 핸들러 어댑터 실행 : 핸들러 어댑터 실행
- 핸들러 실행 : 핸들러 어댑터가 실제 핸들러 실행
- ModelAndView 반환 : 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환하여 반환한다
- viewResolver 호출 : viewResolver를 찾고 실행
- View 반환 : viewResolver는 뷰의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를 반환
- 뷰 렌더링(View Rendering) : 뷰를 통해 뷰를 렌더링




<주요 인터페이스>
- 핸들러 매핑 : org.springframework.web.servlet.HandlerMapping
- 핸들러 어댑터: org.springframework.web.servlet.HandlerAdapter
- 뷰 리졸버: org.springframework.web.servlet.ViewResolver
- 뷰: org.springframework.web.servlet.View





<Require Configuration>
- Maven Configuration
  - POM.xml

- Web deployment descriptor
  - Web.xml

- Spring MVC Configuration
  - root-context.xml : The root-context.xml file is loaded by the Spring’s ContextLoaderListener
  - servlet-context.xml, dao-context.xml, service-context.xml




<Web deployment descriptor(web.xml)>
- ContextLoadListener
  - instantiate a Spring Container which contains 'shared beans'
  - Beans created by DispatcherServlet can reference beans of created by ContextLoaderListener

- ContextLoadListner(parent) : Spring Cotainer(Dao, DataSource, Service)
  - DispatcherServelt(child) : Spring Container(Controller(bean), Special Beans)




<Spring MVC Configuration>
- <annotation-driven />
  - tells the framework to use annotations-based approach to scan files in the specified packages

- <resources mapping=…  />
  - maps static resources directly with HTTP GET requests. For example images, javascript, CSS,.. 
    resources do not have to go through controllers

- Bean InternalResourceViewResolver
  - Tells the framework how to find 'physical JSP files' according to logical view names returned by the controllers
  - ex) Logical view name : home
    /WEB-INF/views/home.jsp




<Model Implementations>
- Any implementation of java.util.map
- Any implementation of Model interface provided by Spring
- A ModelMap object provided by Spring





<Model as an input argument>
- public String getGreeting(Map<String, Object> model ) { … }
  - ex)
@RequestMapping(“/greeting”)

public String getGreeting(Map<String, Object> model ) { 

String greeting = service.getRandomGreeting();
model.put(“greeting”, greeting) //name, value

return “home”
}

- public String getGreeting (Model model ) { … }
  - ex)
// deciding names… boring(and difficult !)

model.put(“greeting”, greeting);


- public String getGreeting (ModelMap model ) { … }
  - ex)
@RequestMapping(“/fullname”)

public String getFullname(ModelMap model ) { 

// chained calls are handy!
model.addAttribute(“name”, “Jon”)
         .addAttribute(“surname”, “Snow”)

return “home”
}




<Controller>
1. Add attributes to the model
  - ex)
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
   Date date = new Date();
   DateFormat dateFormat = 
DateFormat.getDateTimeInstance(DateFormat.LONG, 
DateFormat.LONG, locale);

   String formattedDate = dateFormat.format(date);

   model.addAttribute("serverTime", formattedDate ); //String attributeName, Object attributValue

   return "home"; //Logical view name
}

2. Retrieve request parameters as regular parameters
  - ex)
@RequestMapping(value = "/login", method = RequestMethod.GET)

public String doLogin(@RequestParam String username,
                             @RequestParam String password) {
  …
return success;
}
//http://loalhost:8080/spring/login?username=scott&pswword=tiger



<JSTL>
- 자바서버 페이지 표준 태그 라이브러리(JavaServer Pages Standard Tag Library)
- 'JSTL'+'EL'의 조합이며 HTML코드 내에 java 스크립틀릿 <%= Member %>를 ${Member}로
  <%=if &>문을 <c:if>, <=%for%>문을 <c:forEach>로 대체해서 사용
- prefix “c” can be used for core language
- prefix “fn” for using JSTL functions
- ex)
<?xml version="1.0" encoding="UTF-8" ?>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>

<c:forEach var="i" begin="0" end="5">
Item <c:out value="${i}"/><p>
</c:forEach>

<c:if test="${fn:length(friends) > 0}" >
<%@include file="welcome.jsp" %>
</c:if>

'웹프레임워크' 카테고리의 다른 글

Spring WebForm  (0) 2024.04.23
DI(Dependency Injection)  (0) 2024.04.23
Dependecy Injection, Spring Annotation  (0) 2024.03.13