ㅁ 정리
@Controller @Service @Repository
view -> request -> DispatcherServlet -> Controller -> Service -> Dao (쿼리 실행)
<- response <- ViewResolver <- 데이터, 뷰 <- 결과 <- 결과
ㅁ Spring MVC 주요 구성요소
(1) DispatcherServlet (클래스)
- web.xml 파일이 실행될 때 <servlet>과 <servlet-mapping> 태그에 의해 클라이언트로부터 들어오는 모든 요청이 DispatcherServlet에서 처리된다.
- DispatcherServlet은 요청을 받은 후 HandlerMapping을 사용해 적절한 컨트롤러와 메소드를 찾아 호출하고,
처리된 결과를 ViewResolver에 전달한다.
- ViewResolver는 결과에 맞는 JSP 파일 경로를 결정하여, 최종적으로 HTML을 생성해 클라이언트에게 응답을 보냅니다.
- DispatcherServlet은 클라이언트(브라우저)로부터 오는 모든 요청을 받아 적절한 컨트롤러로 요청을 전달하고,
그 결과에 맞는 뷰를 생성하여 응답을 반환하는 역할을 담당한다.
- 클라이언트가 서버에 요청을 보내면, 이 요청은 가장 먼저 DispatcherServlet이 받습니다.
DispatcherServlet은 스프링 MVC에서 중앙 허브와 같은 역할을 하며, 모든 요청을 받아서 처리 흐름을 조율합니다.
(2) ModelAndView (클래스)
- 컨트롤러 메소드에서 ModelAndView를 매개변수로 선언하면
스프링이 이 메소드를 호출할 때 자동으로 ModelAndView 객체를 생성하여 전달한다.
- ModelAndView 객체를 통해 데이터와 뷰 정보를 담아 DispatcherServlet에 반환한다.
컨트롤러 메소드 내부에서 addObject()로 데이터를 추가하고, setViewName()으로 뷰 정보를 설정합니다.
- 반환된 ModelAndView 객체는 DispatcherServlet에 의해 처리되어,
ViewResolver가 최종적으로 JSP 파일을 찾아 클라이언트에게 화면을 렌더링합니다.
- ModelAndView : 컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보들을 담을 수 있는 객체
(3) Controller
- 클라이언트의 요청을 처리한 뒤, 결과를 DispatcherServlet에게 리턴한다.
(4) HandlerMapping, ViewResolver (인터페이스)
- 스프링 프레임워크는 이 인터페이스들을 구현하는 구현 클래스들을 제공한다.
별도로 만들지 않아도 스프링에 의해 자동으로 구현 클래스들이 동작하여 요청을 처리한다.
- HandlerMapping : 클라이언트의 요청 url을 어떤 컨트롤러의 어떤 메소드가 처리할지 결정함.
- ViewResolver : 컨트롤러의 처리 결과를 생성할 View를 결정함.
ㅁ Spring MVC 동작원리
(1) 클라이언트 요청 (request)
- 사용자가 웹 브라우저에서 http://localhost:8888/mvc/member/list.do 같은 URL을 입력하거나 버튼을 클릭하여 요청을 보낸다.
- 이 요청은 서버로 전달된다.
(2) 스프링에서 제공하는 DispatcherServlet이 해당 요청을 먼저 받는다.
- DispatcherServlet은 스프링의 중앙 관리 서블릿이다.
- 서버는 모든 요청을 DispatcherServlet으로 먼저 보낸다.
- DispatcherServlet은 요청을 받아서 다음 단계를 처리한다.
(3-1) DispatcherServlet이 요청처리할 Controller를 찾아주는 HandlerMapping을 호출
- DispatcherServlet은 HandlerMapping이라는 것을 이용해 요청을 처리할 컨트롤러를 찾는다.
- 예를 들어 "/member/list.do"라는 요청이 들어왔을 때, 이를 처리할 컨트롤러를 찾습니다.
(3-2) HandlerMapping이 요청처리할 Controller를 찾아서 메소드를 호출
- HandlerMapping은 해당 요청을 처리할 컨트롤러와 그 안의 메소드를 찾아서 DispatcherServlet에게 알려준다.
- 예를 들어 MemberController의 listMembers() 메소드가 /member/list.do 요청을 처리하도록 설정되어 있다면 HandlerMapping이 listMembers() 메소드를 호출한다.
- HandlerMapping은 요청 URL을 적절한 컨트롤러와 메소드로 연결해 주는 역할을 하는 매핑 시스템이다.
스프링 내부에서 자동으로 동작하는 메커니즘이다.
@RequestMapping 같은 어노테이션을 기반으로 요청이 어떤 컨트롤러와 메소드로 매핑될지를 자동으로 결정합니다.
(4-1) Controller는 비즈니스 로직 처리를 담당하는 Service 호출
- Controller는 요청을 처리하기 위해 비즈니스 로직을 담당하는 Service를 호출한다.
- 예를 들어 회원 목록을 조회하는 요청이라면 MemberService가 데이터베이스에서 회원 목록을 조회해서 반환한다.
※ 요청시 전달되는 파라미터 처리법
- Spring 사용 전 : HttpServletRequest 객체로 getParameter 메소드로 뽑아서 세팅
- Sprng 사용 후 : @RequestParam 또는 커맨드 객체 방식으로 처리
(4-2) 요청처리 완료 후 Controller에서는 응답을 처리할 Model과 View를 세팅해서 반환
- Controller는 처리 결과(예: 회원 목록 데이터)를 Model 객체에 담고, 어떤 JSP 파일(View)을 보여줄지를 결정하여 반환한다.
- 데이터를 JSP에 전달하는 방식은 두 가지가 있다.
※ 응답 결과 처리법
- Spring 사용 전 : 응답페이지(포워딩jsp)에서 필요한 데이터를 request에 담고(setAttribute) 포워딩한다.
- Spring 사용 후 : 응답페이지에서 필요한 데이터를 Model 객체에 담고 응답 뷰를 반환하거나,
응답페이지에서 필요한 데이터와 뷰를 ModelAndView 객체에 담고 해당 객체를 반환.
- Model : 내부적으로 request를 사용하는 객체로 보안이 향상(정보 탈취 방지)되었다.
- Model과 ModelAndView 객체는 스프링이 제공하는 객체다. 스프링 환경에서만 사용할 수 있다.
(4-3) Controller에서는 Model, View에 대한 정보를 다시 DispatcherServlet으로 반환한다.
- Controller가 처리한 결과를 DispatcherServlet에게 다시 돌려준다.
- DispatcherServlet은 여기서 받은 데이터를 바탕으로 어떤 JSP 파일을 보여줄지 결정한다.
(5-1) DispatcherServlet이 해당 View 정보를 ViewResolver에 전달한다.
- DispatcherServlet은 ViewResolver를 통해 실제로 보여줄 JSP 파일을 찾습니다.
- 뷰 이름(예: memberList)을 보고 JSP 파일의 실제 경로를 생성합니다.
(5-2) ViewResolver는 전달받은 뷰 정보를 가지고 뷰 명 앞에 prefix, 뒤에 suffix 값을 붙여서 응답 뷰에 대한 전체 정보를 완성한다.
- ViewResolver는 뷰 이름에 접두사(prefix)와 접미사(suffix)를 붙여 JSP 파일의 전체 경로를 만듭니다.
- 예를 들어 뷰 이름이 memberList라면, ViewResolver는 이를 /WEB-INF/views/memberList.jsp로 변환합니다.
- ViewResolver는 뷰 이름을 실제 JSP 경로로 변환하고, 해당 JSP 파일을 찾아서 렌더링합니다.
- InternalResourceViewResolver는 return된 문자열을 사용해 실제 JSP 파일의 경로를 찾아 클라이언트에게 응답하도록 합니다. 이 과정에서 접두사(prefix)와 접미사(suffix)를 추가하여 전체 경로를 완성합니다.
- 컨트롤러에서 단순히 문자열(뷰 이름)을 return하면, 그 이름을 바탕으로 스프링의 ViewResolver가 자동으로 JSP 파일의 경로를 만들어 주기 때문에 컨트롤러에서 return만 해도 JSP가 보인다.
- 컨트롤러에서 단순히 return으로 뷰 이름만 반환해도 JSP가 출력되는 이유는, 스프링 MVC가 뷰 처리와 관련된 작업을 자동으로 수행하기 때문이다.
(6) 해당 응답 뷰가 로드돼서 클라이언트에게 보여진다.
- 마지막으로 JSP 파일이 실행되어 HTML 페이지로 변환되고 그 결과가 클라이언트에게 응답으로 전송됩니다.
ㅁ Spring MVC 동작 흐름 요약
(1) 사용자가 요청을 보냄
(2) DispatcherServlet이 요청을 받음
(3) DispatcherServlet이 HandlerMapping을 통해 컨트롤러와 메소드를 찾음
(4) Controller가 Service를 호출해 비즈니스 로직을 처리하고, 처리 결과를 Model과 View에 담아 DispatcherServlet에 반환
(5) DispatcherServlet이 ViewResolver로 JSP 경로를 결정
(6) JSP가 HTML로 렌더링되어 브라우저에 표시
※ 렌더링
- 서버나 클라이언트에서 데이터를 받아 화면에 출력할 수 있는 형태(HTML)로 변환하는 과정.
- 서버 사이드 렌더링 : 서버에서 JSP 등으로 HTML을 생성하여 클라이언트에게 반환하는 방식.
- 클라이언트 사이드 렌더링 : 브라우저에서 JavaScript 등으로 HTML을 동적으로 생성하여 사용자에게 표시하는 방식 .
'Spring' 카테고리의 다른 글
[Spring] MVC2 (2) ajax - 1, 2번째 버튼 (2) | 2024.10.18 |
---|---|
[Spring] MVC2 (1) 로깅, ajax (0) | 2024.10.18 |
[Spring] MVC (7) 실습 - 공지사항 수정하기 (0) | 2024.10.17 |
[Spring] MVC (6) 응답페이지 이동시 응답데이터 담기 (1) | 2024.10.17 |
[Spring] MVC (5) Lombok 사용 (1) | 2024.10.17 |