일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 백준 11659번
- 백준 1235번
- 슈더코드
- map()
- 마리아DB 쿼리 로그
- this
- this와 this() 차이
- ajax
- SQL
- 합배열
- pseudo-code
- @NoArgsConstructor
- json
- 상속과 참조
- InterruptException
- 생성자
- Java
- 자바 람다식
- 백준
- select
- Bean LifecCycle
- 2차원배열 구간합
- interrupted()
- @AllArgsConstructor
- function test
- jquery
- 구간합구하기
- MariaDB Query Log
- 구간합
- 백준 11660번
- Today
- Total
평범한 연구소
[Spring] MVC 본문
MVC 란?
- Model, View, Controller 를 분리한 디자인 패턴
- Model
- 애플리케이션의 상태(data)를 나타낸다.
- 일반적으로 POJO 로 구성.
- Java Beans
- View
- 디스플레이 데이터 또는 프레젠테이션
- Model data를 렌더링하여 HTML output 생성.
- JSP, Thymeleaf, 그루비 등 여러 템플릿 엔진이 있다.
- Controller
- View 와 Model 사이의 인터페이스 역할.
- 비즈니스 로직, DB 접근 관련.
- Model, View에 대한 사용자 입력 및 요청을 수신하여 그에 따라 적절한 결과를 Model 에 담아 View로 전달.
- Model Object와 이 Model을 화면에 출력할 View Name 반환.
Spring MVC 기본 동작 흐름
DispatcherServlet | 클라이언트의 요청을 받아 컨트롤러에게 전달. 컨르롤러가 리턴한 결과값을 View에 전달하여 알맞은 응답을 생성하도록 한다. |
HandlerMapping | 클라이언트의 요청 URL을 어떤 Controller가 처리할지 결정한다. 클래스에 @RequestMapping("/url") 를 명시하면 해당 URL 요청이 들어왔을 때 해당 클래스 또는 메소드에 Mapping. |
HandlerAdapter | DispatcherServlet의 처리 요청을 변환해서 컨트롤러에게 전달. 그 응답 결과를 DispatcherServlet이 요구하는 형식으로 변환한다. |
Controller | @RequestMapping 클라이언트의 요청을 필요한 비즈니스 로직으로 처리한 후 결과를 ModelAndView에 담아 DispatcherServlet로 리턴. |
ModelAndView | 컨트롤러의 처리 결과 정보 및 뷰 선택에 필요한 정보를 담는다. |
ViewResolver | 컨트롤러의 처리 결과를 보여줄 뷰 결정. |
View | 컨트롤러의 처리 결과 화면을 생성한다. (JSP, 타임리프 템플릿 파일 등을 이용) |
- DB를 제외한 파란 부분은 Spring MVC 제공
- 보라색 부분은 개발자가 구현해야하며, 녹색 부분인 View는 Spring이 제공하는 부분도 있고 개발자가 구현해야하는 부분도 있다.
1) 클라이언트의 모든 요청을 Dispatcher Servlet 이라는 Servlet class가 받는다.
2) Dispatcher Servlet(Front Controller)은 요청 URL을 HandlerMapping에게 전달하고, 현재 요청에 적절한 Controller와 Method에 대한 정보를 알아낸다.
- 어떤 요청에 어떤 Controller가 동작할지를 xml 파일이나 Java파일의 어노테이션으로 설정.
- Spring 으로 만들어진 web Application이 실행될 때, Hadler Mapping 객체들이 생성되면서 이런 정보들을 관리.
3) Dispatcher Servlet은 HandlerAdapter에게 요청 처리를 위임한다.
- 비즈니스 로직 실행 작업 전달.
4) Handler Adapter는 Controller와 비즈니스 로직 프로세스를 호출한다.
5) Controller는 비즈니스 로직을 실행하고 처리 결과를 Model에 설정한다. 또한 View의 논리적인 이름을 HandlerAdapter에 반환한다.
6) Dispatcher Servlet은 View 이름에 해당하는 View를 해결하는 작업을 ViewResolver에 전달한다.
7) Dispatcher Servlet은 렌더링 프로세스를 반환된 View로 전달한다.
8) View는 모델 데이터를 렌더링하고 응답을 반환한다.
@Controller
- Controller의 역할 수행 명시
- Controller는 필요한 비즈니스 로직을 호출하여 처리 결과(Model)와 그 결과를 출력할 View 정보를 DispatcherServlet에 반환된다.
- Bean으로 등록 된다.
- Component의 구체화된 어노테이션으로 클래스에 명시한다.
- 빈 이름을 따로 지정하지 않으면 클래스 이름의 첫 문자를 소문자로 한 것이 빈 이름(id)으로 등록한다.
- 다른 패키지에 있는 빈 이름과 겹치면 안된다. @Controller(패키지이름.빈이름) 형식으로 등록하면 겹칠 가능성이 없다!
@Controller // 빈이름(id): userController
public class UserController {
@Controller("ex02.userController")
public class UserController {
@RequestMapping
- 요청에 대해 어떤 Controller, 어떤 메소드가 처리할지 매핑하기 위한 어노테이션.
- url을 class 또는 method와 mapping 시켜준다.
- 컨트롤러의 모든 메소드에서 처리할 경우, class level에 선언한다.
- 요청 url에 대한 해당 메소드에서 처리할 경우 method level에 선언한다.
- Method를 지정하지 않으면 모든 Method 허용.
- Spring 4.3 부터는 요청별로 세분화되었다.
- @GetMapping("/hello"), @PostMapping("/hello")
// class level
@Controller("ex02.userController")
@RequestMapping("/ex02/*")
public class UserController {
// method level
@GetMapping("request")
public ModelAndView form() {
return new ModelAndView("ex02/write"); // 포워딩
}
...
}
------------------------------------------------------------------
// @RequestMapping(value = "request", method = RequestMethod.GET)
@GetMapping("request")
public ModelAndView form() {
// @RequestMapping(value = "request", method = RequestMethod.POST)
@PostMapping("request")
public ModelAndView submit(String num) {
ModelAndView 객체
- 처리결과를 담은 Model 객체와 View 정보를 ModelAndView 객체에 담아 반환한다.
- ModelAndView 클래스는 Controller의 처리 결과를 보여줄 뷰와, 뷰에 전달할 값을 저장하는 용도로 사용한다.
주요 메소드 | 설명 |
setViewName(String view) | view 이름 설정 |
addObject(String name, Object value) | view에 전달할 값(모델) 설정 |
addAllObject(Map<String, ?> modelMap) | modelMap에 추가된 모든 속성을 모델로 설정 |
@Controller // 빈이름: userController
public class UserController {
@RequestMapping("/ex01/main") // GET과 POST 모두 처리.
public String main() {
return "ex01/main"; // 리턴타입이 String인 경우 리턴값은 포워딩할 뷰의 이름이 된다.
}
// GET 방식만 처리
@RequestMapping(value = "/ex01/request", method = RequestMethod.GET)
public ModelAndView submit1(String name, int age) {
// 포워딩 해야할 JSP 이름.
ModelAndView mav = new ModelAndView("ex01/main");
String s = "<p>GET 방식으로 접근</p>";
String a = "<p>이름:"+name+", 나이:"+age+"</p>";
// request.setAttribute("이름", 값); 의 역할.
// requset는 톰캣에 의존관계를 가짐.
mav.addObject("msg", s);
mav.addObject("result", a);
return mav;
}
// POST 방식만 처리
@RequestMapping(value = "/ex01/request", method = RequestMethod.POST)
public String submit2(User dto, Model model) {
String s = "<p>POST 방식으로 접근</p>";
String a = dto.getAge() >= 19 ? "성인":"미성년자";
// request.setAttribute("이름", 값); 의 역할.
model.addAttribute("msg", s);
model.addAttribute("result", a);
model.addAttribute("dto", dto);
return "ex01/main";
}
}
'Spring Framework' 카테고리의 다른 글
[Spring] 웹스토리지(로컬 스토리지, 세션 스토리지) vs 쿠키 vs 세션 (0) | 2022.12.01 |
---|---|
[Spring] 스프링에서 AJAX 사용하기 (@ResponseBody) (0) | 2022.11.17 |
[Spring] AOP (관점 지향 프로그래밍) (0) | 2022.11.12 |
[Spring] 어노테이션 (Annotation) (0) | 2022.11.10 |
[Spring] 스프링 컨테이너, Bean (0) | 2022.11.09 |