MVC는 모델 뷰 컨트롤러의 약자이다.
모델은 데이터가 들어있는 데이터셋이다. 주문목록, 사용자정보, 주문내역이 이에 해당한다.
뷰는 보이는 화면이다. 모델의 데이터를 사용해서 렌더링한다. jsp나 pdf, xml등의 파일로 구현한다.
컨트롤러는 사용자의 액션에 응답하는 컴포넌트다. 사용자가 데이터입력을 하면 컨트롤러가 입력한 데이터를 모델에다 넣는등 이벤트를 다루는 것을 의미한다.
스프링 MVC 기본 동작 흐름
그림에서 파란색 부분은 스프링에서 제공한다.
그림의 순서를 살펴보자
1. 클라이언트가 요청한다. 클릭을하던, url을 입력하든 등등... 그런 모든 요청들이 DispatcherServlet이 받는다.
2. 요청을 분할하기 위해 HandlerMapping에게 물어본다. 어떤컨트롤러, 어떤 메소드를 사용해야 하는지.. 하지만 이놈혼자 다 알아낼 순 없다. 우리가 스프링mvc를 만들면 어떤 요청에 어떤 컨트롤러가 동작할지를 xml이나 자바파일에 어노테이션(@)으로 설정해놓는다. 이러한 정보들이 핸들러매핑이 생성되면서 관리하게 된다.
즉 1번에서 2번순서는
사용자가 요청한 후 디스패처서블릿은 핸들러매핑에게 어떤컨트롤러 써야하는지 물어보고 핸들러 매핑은 이거쓰라고 알려준다까지가 1~2번순서이다.
3. 2번을 통해서 결정한 A라는 컨트롤러를 핸들러어답터에게 니가실행하라고 요청한다.
4. 핸들러 아답터가 지정한 a라는 컨트롤러와 메소드가 실행된다.
5. 그리고 나온 결과를 모델에서 받아서 뷰 네임을 다시 디스패처 서블릿에게 전달한다.
--아직까진 뷰가 나온 상태가 아니다. 뷰에 필요한 데이터들이 담겨져 디스패처 서블릿에게 전달된 상황이다.
6. 디스패처 어답터는 뷰네임을 받았으니 뷰 리저버에게 전달하고 뷰 리저버는 그 뷰가 어떤뷰고 어떠어떠하다는 것을 알려준다.
7. 그 뷰를 출력한다.
8. 응답한다.
Spring MVC구성요소
DispatcherServlet
프론트 컨트롤러다. 프론트 컨트롤러는 요청받은 정보를 어디에서 처리해야하는지 분할해주는 역할을 한다.
예를들어 기업의 고객센터에 전화하면 반품문의 1번 주문문의 2번 사용자 계정찾기 문의는 3번 등등... 이렇게 분할해주는 역할을 한다. 여기서 약간의 차이는 프론트 컨트롤러는 책임을 진다고 생각하면 된다.
연결만 하고 끝나는게 아니라 연결해주고 거기서 받은 정보를 사용자에게 보여준다는게 고객센터와의 차이점이다.
실행흐름은
이렇게 돼있는데 컴포넌트가 워낙 많이 나오고 순서도 복잡해서
강의를 들으면서 조금 더 통합해서 그려보겠다.
기존의 그림 2에 내가 추가한 부분만 따로 설명하자면
2번,3번 처럼 숫자와 화살표가 붙어있는 부분은 그림1의 순서를 의미한다.
순서도에서 저부분이 그림1에서 어떤부분인지를 직관적으로 보기쉽게 나타냈고
ABCDEF는 뒤에 나올 순서도 자세히보기에서 이게 어디에 해당하는 부분을 해부한건지 쉽게 알아볼 수 있도록 했다.
요청 선처리 작업 (자세히A 파트)
강의에서도 언급했지만 이 부분을 너무 자세히 이해하려고 할 필요는 없다. 어느정도의 흐름만 받아들이자.
요청이 들어오면 나중에 처리하기 쉽게 미리 선처리 작업을 한다.
이 순서를 해석하자면
지역 선택 후 정보저장 플래쉬맵 설정 후 파일업로드 처리로 볼 수 있다.
locale은 지역?이라는 뜻이고 접속한 곳이 어느나라인지 분간하는 것이라고 생각하면 된다.
플래쉬맵이란 url이 너무 길어지는 것을 방지하기 위해 url길이는 그대로하면서 정보는 전달할 수 있는 방식이라고 생각하면 편하다.
파일업로드 처리는 파일이 업로드 된 경우 multipart~메소드가 실행되고 안됐으면 다음으로 넘어간다.
그리고 순서도 하나하나당 컴포넌트가 다 있다고 생각하면된다.
앞서 말한 locale 플래쉬맵을 사용한다는건 스프링 컴포넌트를 사용한다는 것과 동일하다.
locale은 LocaleResolver
플래쉬맵은 FlashMapManager
요청저장은 RequestContextHolder
파일이 있는지 조사하는건 MultipartResolver
각 컴포넌트가 정확히 무슨 용도인지는 실습해가면서 이해하자.
저 순서도를 실제 컴포넌트를 넣어서 만들어보면
화살표는 안넣었다.
요청 전달시 사용된 컴포넌트(자세히 B파트)
HandlerExecutionChain이란 뭐가 실행될지 알고있는놈이다.
내가 뭔갈 실행하려면 HandlerExecutionChain요놈한테 물어봐야 알수있다.
이건 실제 컴포넌트명을 넣어서 구현했기에 따로 순서도를 만들진 않겠다.
여기서 디폴트값이 설정돼있다고 하는데 이 값이 정확히 뭘 의미하는지는 이 단계에선 모르겠으니 넘어가자!
인터셉터는 나중에 더 배운다니 가슴으로 받아들이자 강사분의 표현으로는 필터라고 한단다.
모델 앤 뷰는 기존의 방식은 request를 사용해서 뷰를 보여줫다 이 방식은 종속되게 해서 안좋기 때문에
스프링에서는 request대신 ModelAndView를 사용한다고 한다. 대충 이정도만 이해해도 충분하다.
나머지 자세히 DEF의 경우 굳이 따로 적지 않아도 충분하다고 판단해서 여기까지만 하겠다
강의에서 컴포넌트명이 정말 많이 나오는데 미리 기죽지말자
그저 우리가 순서도 요소를 지금은 한글로 봣지만 구현할 때는 영어로 해야하니
요소요소가 한글에서 영어로 바뀌었다고 생각하자!
'IT > 부스트코스' 카테고리의 다른 글
부스트코스 웹앱개발 -6 스프링JDBC (0) | 2020.04.30 |
---|---|
부스트코스 웹앱개발 -5 스프링 (0) | 2020.04.28 |
부스트코스 웹앱개발 -3 Event delegation (0) | 2020.04.23 |
부스트코스 웹앱개발 -2 AJAX (0) | 2020.04.22 |
부스트코스 웹 앱 개발-1: 자바스크립트 배열 및 오브젝트 (0) | 2020.04.01 |