📂 스프링 MVC
- 스프링 트랜잭션 처리, DI 및 AOP 적용을 손쉽게 사용할 수 잇다.
- 각자 역할이 분명한 컴포넌트로 분리하여 담당
- Controller, Validation Checker, Command객체, Form객체, Model객체
- DispatcherServlet, HandlerMapping, ViewResolver
-요청 파라미터로부터 모델 객체 값을 자동으로 채워주는 기능
-Controller를 사용하여 클라이언트 요청 처리
📂 MVC란?
Model View Controller 구조로 사용자 인터페이스와 비지니스 로직을 분리하여 개발 하는것
MVC는 Model1과 Model2로 나누어져 있으며 일반적인 MVC는 Model2를 지칭한다.
🟡 Model : 데이터 처리 담당하는 부분
Model 부분은 service 영역과 DAO 영역으로 나뉘고, 중요한것은 Service 부분은 불필요한 HTTP 통신을 하지 않아야 하며,
request나 response와 같은 객체를 매개변수로 받아선 안된다.
Model 부분의 service는 view에 종속적인 코드가 없어야 하고, View 부분이 변경되더라도 service 부분을 그대로 재사용 할 수 있어야 한다.
Model에서는 View와 Controller 어떠한 정보도 가지고 있어서는 안된다.
🟡 View
View는 사용자 Interface를 담당하며 사용자에게 보여지는 부분입니다.
View는 Controller를 통해 모델에 데이터에 대한 시각화를 담당하며, View는 자신이 요청을 보낼 Controller의 정보만 알고 있어야 하는것이 핵심이다.
Model이 가지고 있는 정보를 저장해서는 안되며 Model, Controller에 구성 요소를 알아서는 안된다.
🟡 Controller
Controller에서는 View에 받은 요청을 가공하여 Model(service 영역)에 이를 전달한다.
또한, Model로 부터 받은 결과를 View로 넘겨주는 역할을 한다.
Controller에서는 모든 요청 에러와 모델에러를 처리하며 View와 Controller에 정보를 알고 있어야 한다.
Model과 View의 정보에 대해 알고 있어야 한다.
- Model, View, Controller를 나누는 이유는 소스를 분리함으로서 각 소스의 목적이 명확해지고, 유지보수가 용이하다
📂 MCV 구성 요소
🟡 DispatcherServlet(스프링 기본 제공)
- 클라이언트의 웹브라우저에서 요청 전송하게 되면, 요청을 받아 들이는 서블릿, 즉 최초 요청을 전달받음
🟡HandlerMapping(스프링 기본 제공)
-웹 요청 url과 컨트롤러를 맵핑한 정보 관리 기능을 담당한다.
- 정의된 맵핑 파일을 분석하여 해당 컨트롤러가 처리할 것을 알려준다.
- 요청된 URL을 분석하여 어떤 컨트롤러가 해당 URL에 대한 처리를 담당할지 의뢰
🟡Controller(개발자가 직접 구현)
-담당할 컨트롤러에서 비즈니스 로직에 대한 부분의 처리를 의뢰
-이때 처리하는 컴포넌트는 Controller 객체가 아니라 스프링에서 제공하는 Controller계열 클래스 중 하나
-적당한 Controller 클래스를 고른 다음 해당 클래스를 상속 받아서 비즈니스 로직을 처리한다.
🟡ModelAndView
-Model(전달할 어떤 내용/값) / View(전달될 곳)을 정의하는 객체
-Controller 클래스에서 비즈니스 로직 처리 후에 ModelAndView객체 (Model +View)를 리턴한다.
🟡ViewResilver(스프링 기본 제공)
-Model과 View 가 결정이 되었다면 화면에 어떤 식으로 표시(jsp, Velocity) 할지에 대하여 의뢰
🟡View
-결정되어진 표시할 방법으로 요청 의뢰한 클라이언트의 브라우저로 응답이 전송
🟠 MCV 개발 순서
일반적인 MVC 개발 순서는 다음과 같다.
- DispatcherServlet 서블릿을 web.xml 파일에 설정한다.
- HandlerMapping을 사용하여 요청을 처리해줄 컨트롤러 객체를 구한다.
- Controller를 작성한다(클라이언트 요청 처리)
- Controller는 ModelAndView 객체를 리턴한다.
- ViewResolver를 설정한다.
- 응답 결과를 보여줄 View 객체를 구한다.
📂 HomeController를 통해 요청을 받아서 실행시켜보기
src/main/java 위치한 com.spring.ex 패키지의 HomeController 사용
WEB-INF/views/member/
member폴더 안에 jsp파일을 생성한다.
memberList.jsp ,memberResult.jsp ,memberView.jsp
HomeController.java
package com.spring.ex;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
/**
* Handles requests for the application home page.
*/
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
/**
* Simply selects the home view to render by returning its name.
*/
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
String formattedDate = dateFormat.format(date);
model.addAttribute("serverTime", formattedDate );
return "home";
}
@RequestMapping(value="/member/view")
public String view() {
return "member/memberView";
}
@RequestMapping("/member/result") //요청
public String result(Model model , HttpServletRequest request) {
//model.addAttribute("id","kim");
request.setAttribute("id","kim");
return "member/memberResult"; //member폴더의 memberResult
}
@RequestMapping("/member/list")
public ModelAndView list(Model model) {
ModelAndView mav = new ModelAndView();
mav.addObject("name","태연");
mav.addObject("age",30);
mav.setViewName("member/memberList");
return mav;
}
}
@Controller
어노테이션을 통해 현재 클래스에서 요청처리하는 Controller클래스라는것을 알 수 있다.
@Controller 없으면, 어떤 요청이 들어왔을때 요청을 실행 할 수가 없다.
@RequestMapping(value = "/", method = RequestMethod.GET)
/ 라고 요청이 들어왔을때, 자동으로 home메서드가 실행이 된다. get방식으로 / 요청을 했을때 실행
요청경로 설정
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);
- 메서드가 실행될때 model이라는 객체가 자동으로 생성된다.
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
//날짜 길게 나타내는 형식
String formattedDate = dateFormat.format(date); // 날짜 길게 나타내는 형식으로 바꿔서 formattedDate에 넣는다.
model.addAttribute("serverTime", formattedDate );
== request.setAttribute("serverTime", formattedDate)과 크게 다르지 않다.
- model객체가 자동으로 들어온다. MVC패턴의 M(model)
- Model : view에 전달한 객체정보를 담는다.
- serverTime에 긴 날짜가 들어가있다.
return "home";
-호출한곳으로 리턴 , 뷰페이지 이름
-문자열 "home" 리턴 = /WEB-INF/views/ home .jsp => Servlet-context.xml에서 설정한것, 경로가 된다.
- WEB-INF/views/home.jsp에서 serverTime 객체를 실행시킨다.
- Model : view에 전달한 객체 정보를 담는다.
- home.jsp를 바로 실행할 수 없는 이유 : WEB-INF 아래 jsp에서는 바로 실행 할 수 없다.
- webapp 밑에 있는 jsp파일은 바로 실행 가능하다.
}
✔ Model 객체 사용
@RequestMapping("/member/result") -요청경로 설정
public String result(Model model , HttpServletRequest request) { → Model객체를 파라미터로 받는다.
model.addAttribute("id","kim"); → model.addAttribute으로 넘길 데이터의 이름과 값을 설정
request.setAttribute("id","kim");
return "member/memberResult"; →member폴더의 memberResult 으로 속성으로 설정한 값을 보여준다.
}
✔ ModelAndView 객체 사용 - 데이터와 뷰 동시에 설정
@RequestMapping("/member/list")
public ModelAndView list(Model model) { →반환값으로 ModelAndView객체를 반환한다.
ModelAndView mav = new ModelAndView(); → 객체 생성
mav.addObject("name","태연"); →addObject() :데이터를 보낼때 사용하는 메서드
mav.addObject("age",30);
mav.setViewName("member/memberList"); → setViewName() :뷰의 이름을 설정할때 사용
return mav; → ModelAndView객체를 반환한다.
}
memberView.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
WEB-INF/views/member/memberView.jsp<br>
바로 실행 할 수 없음. controller통해서 실행해야한다.
memberResult.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
WEB-INF/views/member/memberResult.jsp <br><br>
id1: ${id }<br>
id2: ${requestScope.id }<br>
id3: <%=request.getAttribute("id")%><br>
id4: ${param.id}<br> <!-- 출력안됨 -->
id5: <%=request.getParameter("id")%><br> <!-- 출력 null -->
model로 설정한것 가져오기 = request.setAttribute("serverTime", formattedDate)과 크게 다르지 않다.
model 속성으로 설정한것은 속성으로 가져와야만 한다. =request로 속성 설정을 하여도 된다.
memberList.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
WEB-INF/views/member/memberList<br><br>
<!-- 속성으로 설정했으므로 속성설정한것만 출력이 된다. -->
name1: ${name}<br>
name2: ${requestScope.name}<br>
name3: <%=request.getAttribute("name") %><br>
name4: ${prama.name}<br><!-- parameter로 가져오는것은 출력이 안됨. -->
name5: <%=request.getParameter("name") %><br><!-- parameter로 가져오는것은 출력이 안됨. -->
<br><br>
age1: ${age}<br>
age2: ${requestScope.age }<br>
age3: <%=request.getAttribute("age") %><br>
age4: ${param.age }<br>
age5: <%=request.getParameter("age") %><br>
'BACK END > Spring' 카테고리의 다른 글
2일(08.18) MCV TestController (0) | 2022.08.18 |
---|---|
2일(08.18) ExampleController (0) | 2022.08.18 |
2일(08.18) 인코딩/ 프로젝트 실행 작동순서 (0) | 2022.08.18 |
1일(08.17) AOP (0) | 2022.08.17 |
1일(08.17) AOP (0) | 2022.08.17 |