MVC 구조
스프링 MVC는 스프링의 서브 프로젝트입니다.
스프링 프레임워크에는 여러 서브 프로젝트가 존재하는데 MVC는 이중 일부입니다.
MVC는 servlet-context.xml에서 관리하며 코어와 마이바티스 등 DB는 root-context.xml에서 관리합니다.
root-context.xml에서는 이미 존재하는 클래스를 통해 bean을 생성할 때 필요합니다.(dataSoruce)
프로젝트 구동은
- web.xml에서 Context Listener가 제일 먼저 구동이 됨
- root-context.xml이 설정되면 빈이 스프링 영역에서(Context)에서 생성되고 관리됩니다.
- 이후에 DispatcherServlet이 동작합니다.
- 이때 servlet-context.xml이 사용됩니다. 이때 만들어진 빈은 앞서 만든 빈들과 연동이 됩니다.
위 그림처럼 스프링 MVC를 이용하면 내부적으로 처리가 되기 때문에 개발자 입장에서는 HttpServletRequest 등 API를 직접적으로 사용하지 않아도 됩니다. 흔히 어노테이션들로 작성이 됩니다.
Spring MVC는 모델 2 방식으로 처리가 됩니다.
흔히 모델 2는 '로직과 화면을 분리' 라고 불립니다.
위 그림이 MVC 구조입니다.
Controller를 호출하게 되는데 이유는 View를 교체하더라도 사용자가 호출하는 URL 자체에 변화를 없게하기 위함입니다.
- 컨트롤러는 데이터 처리를 위해 Model(데이터)를 처리하고 Response할 때 필요한 데이터를 View로 전달합니다.
- Servelt은 RequestDispatcher API를 이용해서 구현을 직접해주어야 합니다.
- 스프링은 이를 암묵적으로 수행..
좀 더 구조를 자세히 살펴봅시다.
- 사용자의 요청은 DispatcherServlet을 통해 처리
- Web.xml에서 모든 Request를 DispatcherServlet이 받도록 작성됨.
- HandlerMapping은 Request의 처리를 담당하는 컨트롤러를 찾음(@RequestMapping)
- 컨트롤러를 찾으면 HandlerAdapter를 이용해서 컨트롤러 동작 시킴
- Controller는 실제로 작성자가 요청을 처리하는 로직을 작성 이때 View로 전달 Model를 객체에 담아 전송
- 이를 ViewResolver가 담당
- 어떤 뷰로 가야 적절할지 ViewResolver가 해결
- View는 실제로 응답을 보내야하는 데이터를 jsp등을 이용해 생성하는 역할
아래는 https://walbatrossw.github.io/spring-mvc/2017/11/25/spring-mvc-structure.html 에서 참조하여 그림을 따옴.
- 사용자의 요청을 Front Controller에 전달
- 전달된 요청은 적절한 Controller를 찾아 호출
- Controller는 해당 Service 객체를 찾아 호출
- Service객체는 DAO객체를 이용하여 원하는 Data를 요청
- DAO객체는 MyBatis를 이용하는 Mapper를 통해 작업을 수행(CRUD)
- Service를 통해 처리한 데이터를 Controller에게 전달
- Controller는 다시 스프링 MVC쪽으로 데이터를 전달
어노테이션
@Controller | Controller 객체임을 명시 |
@Repository | DAO 객채임을 명시 |
@Service | Service 객체임을 명시 |
@RequestMapping | 특정 URI에 매칭되는 클래스나, 메서드임을 명시 |
@RequestParam | 요청에서 특정한 파라미터 값을 찾아낼 때 사용 |
@RequestHeader | 요청에서 특정 HTTP 헤더 정보를 추출할 때 사용 |
@PathVariable | 현재의 URI에서 원하는 정보를 추출할 때 사용 |
@CookieValue | 현재 사용자의 쿠키가 존재하는 경우 쿠키의 이름을 이용해서 쿠키 값을 추출 |
@ModelAttribute | 자동으로 해당 객체를 뷰까지 전달하도록 만드는 애너테이션 |
@SessionAttribute | 세션상에서 모델의 정보를 유지하고 싶은 경우 사용 |
@InitBinder | 파라미터를 수집해서 객체로 만들 경우 |
@ResponseBody | 리턴타입이 HTTP의 응답메시지로 전송 |
@RequestBody | 요청 문자열이 그대로 파라미터로 전달 |
'웹 > Spring' 카테고리의 다른 글
Spring 이론(재) - AOP (0) | 2019.07.21 |
---|---|
Spring 이론(재) - controller (0) | 2019.07.20 |
Spring 이론(재) - 특징과 의존성 주입 (0) | 2019.07.17 |
Spring 이론(재) - 간단히 spring project 생성 (0) | 2019.07.17 |
CKEditor 버전 문제 해결 (0) | 2019.06.25 |