개발자 끄적끄적
Spring MVC 본문
<서블릿(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 |