본문 바로가기

신입 개발자 면접 기초

Spring MVC 구조의 처리 과정을 설명해보시오. (MVC process)

반응형

MVC 패턴의 처리 과정을 설명해주실수 있나요?

[Spring MVC 일반적인 구조]

[Spring MVC 구조]

<출처 : http://javasampleapproach.com/spring-framework/spring-mvc-rest-difference-between-controller-and-restcontroller>


아주 적합한 그림은 없는 것같아서 직접 그리려고 했으나, 간단한 내용이라 판단하여 나중에 그림을 올리도록 하려고 한다. (그나마 내 느낌에 맞는 그림을 퍼옴)

Spring에서 MVC 구조로 많이 구성하는데 그 처리 과정을 순서대로 설명하는 면접질문이 있다.


Spring MVC 처리 순서

1. 클라이언트(Client)가 서버에 어떤 요청(Request)을 한다면 스프링에서 제공하는 DispatcherServlet 이라는 클래스(일종의 front controller)가 요청을 가로챈다.

(web.xml에 살펴보면 모든 url ( / )에 서블릿 매핑을하여 모든 요청을 DispatcherServlet이 가로채게 해둠(변경 가능))

2. 요청을 가로챈 DispatcherServlet은 HandlerMapping(URL 분석등..)에게 어떤 컨트롤러에게 요청을 위임하면 좋을지 물어본다.

(HandlerMapping은 servlet-context.xml에서 @Controller로 등록한 것들을 스캔해서 찾아놨기 때문에 어느 컨트롤러에게 요청을 위임해야할지 알고 있다.)

3. 요청에 매핑된 컨트롤러가 있다면 @RequestMapping을 통하여 요청을 처리할 메서드에 도달한다.

4. 컨트롤러에서는 해당 요청을 처리할 Service를 주입(DI)받아 비즈니스로직을 Service에게 위임한다.

5. Service에서는 요청에 필요한 작업 대부분(코딩)을 담당하며 데이터베이스에 접근이 필요하면 DAO를 주입받아 DB처리는 DAO에게 위임한다.

6. DAO는 mybatis(또는 hibernate등) 설정을 이용해서 SQL 쿼리를 날려 DB에 저장되어있는 정보를 받아 서비스에게 다시 돌려준다.

(이 때, 보통 Request와 함께 날아온 DTO 객체(@RequestParam, @RequestBody, ...)로 부터 DB 조회에 필요한 데이터를 받아와 쿼리를 만들어 보내고, 결과로 받은 Entity 객체를 가지고 Response에 필요한 DTO객체로 변환한다.)

7. 모든 비즈니스 로직을 끝낸 서비스가 결과물을 컨트롤러에게 넘긴다.

8. 결과물을 받은 컨트롤러는 필요에 따라 Model객체에 결과물 넣거나, 어떤 view(jsp)파일을 보여줄 것인지등의 정보를 담아 DispatcherServlet에게 보낸다.

9. DispatcherServlet은 ViewResolver에게 받은 뷰의 대한 정보를 넘긴다.

10. ViewResolver는 해당 JSP를 찾아서(응답할 View를 찾음) DispatcherServlet에게 알려준다.

(servlet-context.xml에서 suffix, prefix를 통해 /WEB-INF/views/index.jsp 이렇게 만들어주는 것도 ViewResolver)

11. DispatcherServlet은 응답할 View에게 Render를 지시하고 View는 응답 로직을 처리한다.

12. 결과적으로 DispatcherServlet이 클라이언트에게 렌더링된 View를 응답한다.


틀린부분있으면 지적바랍니다.

반응형
  • Favicon of https://jjunii486.tistory.com BlogIcon 쥬니준 2019.05.02 15:10 신고

    이해가 아주 쏙쏙 되는 글이였습니다!! 감사합니다!!

  • 프린이 2019.05.07 21:00

    스프링의 구동방식에 대해 이해가 안가던부분까지 다 이해할 수 있던 아주 좋은글인것 같아요!! 진심으로 감사드립니다~!!

  • Favicon of https://cbw1030.tistory.com BlogIcon cbw1030 2019.07.28 21:13 신고

    글 잘봤습니다!
    궁금한게 하나있는데요. 서비스 임플이랑 맵퍼 부분은 언급안해도 되나요? 저 정도만 언급해도 충분히 전달이 되는지요?

    • Favicon of https://jeong-pro.tistory.com BlogIcon JEONG_AMATEUR 2019.07.29 14:51 신고

      ServiceImpl, Mapper 등의 부분은 MVC 모델에서 코딩하면서 익숙하다고 생각돼서 간략하게 설명했습니다.
      이 글에서는 저희가 작성하는 코드외에 스프링에서 처리해주는 부분을 같이 보는게 핵심입니다.
      말씀감사합니다^^

  • 프뉴 2019.09.16 10:03

    너무나 유용한 글이라 출처 남기고 퍼갑니다!!

  • 넘어유 2019.10.29 03:15

    이만큼 이해가 쉽게 설명해주는 블로그는 처음이네요 감사드려요

  • Favicon of https://dncjf64.tistory.com BlogIcon 소프 2020.01.21 23:48 신고

    천재시군요 감사합니다

  • 하하하하하 2020.02.07 20:17

    좋은글 잘 보고갑니다

  • 날쌘더리 2020.04.16 09:54

    너무 잘 정리하셔서 이해가 쏙 되네요 감사합니다 ^^
    출처 남기고 퍼가겠습니다 !

  • happycircuit 2020.05.14 15:10

    이해당해버렸습니다.... 감사합니다.
    출처 남기고 퍼가겠습니다!!

  • 연쇄할인범 2020.06.22 17:27

    출처남기고 퍼가도 될까요? 정리가 너무 깔끔하세요 ㅠㅠ

  • 장한빛 2020.08.02 05:07

    안녕하세요! 내용 너무 좋습니다. 추상적인 부분이 덕분에 더 구체화된 것 같아요. 현재 제가 읽고있는 Spring 5 프로그래밍 입문 책(최범균 저)과 관련해서 작성하신 Spring 처리 방식에 관한 내용에 좀 더 내용을 추가해봤습니다. HandlerAdapter에 대한 내용이 추가되어 있습니다.

    1. 클라이언트(Client)가 서버에 어떤 요청(Request)을 한다면 스프링에서 제공하는 DispatcherServlet 이라는 클래스(일종의 front controller)가 요청을 가로챈다. (web.xml에 살펴보면 모든 url ( / )에 서블릿 매핑을하여 모든 요청을 DispatcherServlet이 가로채게 해둠(변경 가능))
    2. 요청을 가로챈 DispatcherServlet은 HandlerMapping(URL 분석등..)에게 어떤 컨트롤러에게 요청을 위임하면 좋을지 물어본다. (HandlerMapping은 servlet-context.xml [혹은 설정 파일]에서 @Controller로 등록한 것들을 스캔해서 찾아놨기 때문에 어느 컨트롤러에게 요청을 위임해야할지 알고 있다.) 요청을 처리할 컨트롤러 빈 객체를 DispatcherServlet에 다시 전달한다.
    3. 콘트롤러 빈 객체는 여러 종류가 존재한다(@Controller를 사용하는 컨트롤러, Controller 인터페이스 구현체, HttpRequestHandler 인터페이스 구현체 등). 이 모든 방법은 동일하게 처리 할 수 있도록 DispatcherServlet은 HandlerAdapter 빈에게 요청 처리를 위임한다.
    4. 컨트롤러에서는 해당 요청을 처리 할 메소드를 찾아서 돌리고, 때에 따라 그 안의 Service를 주입(DI)받아 비즈니스로직을 Service에게 위임한다.
    5. Service 사용이 필요한 경우, service에서는 요청에 필요한 작업 대부분(코딩)을 담당하며 데이터베이스에 접근이 필요하면 DAO를 주입받아 DB처리는 DAO에게 위임한다.
    6. DAO는 mybatis(또는 hibernate등) 설정을 이용해서 SQL 쿼리를 날려 DB에 저장되어있는 정보를 받아 서비스에게 다시 돌려준다. (이 때, 보통 Request와 함께 날아온 DTO 객체(@RequestParam, @RequestBody, ...)로 부터 DB 조회에 필요한 데이터를 받아와 쿼리를 만들어 보내고, 결과로 받은 Entity 객체를 가지고 Response에 필요한 DTO객체로 변환한다.)
    7. 모든 비즈니스 로직을 끝낸 서비스가 결과물을 컨트롤러에게 넘긴다.
    8. HandlerAdapter는 컨트롤러의 처리 결과를 ModelAndView라는 객체로 변환해서 DispatcherServlet에 넘긴다.
    9. DispatcherServlet은 ViewResolver에게 받은 뷰의 대한 정보를 넘긴다.
    10. ViewResolver는 해당 JSP를 찾아서(응답할 View 객체를 찾거나 생성) DispatcherServlet에게 알려준다. 응답을 생성하기 위해 JSP를 사용하는 ViewResolver는 매번 새로운 View객체를 생성해서 DispatcherServlet에 반환한다.
    11. DispatcherServlet은 ViewResolver로부터 받은 응답을 위한 View객체에게 Render를 지시하고 View객체는 응답 로직을 처리한다.
    12. JSP를 사용하는 경우 View객체는 JSP를 실행하므로서 웹 브라우저에 전송할 응답 결과를 생성하고 이로써 모든 과정이 끝난다. 결과적으로 DispatcherServlet이 클라이언트에게 렌더링된 View를 응답한다.


    • Favicon of https://jeong-pro.tistory.com BlogIcon JEONG_AMATEUR 2020.08.02 11:22 신고

      지식의 선순환! 감사합니다!
      장한빛님 덕분에 조금 더 살펴봐야겠다는 생각이 들었습니다.
      다른 분들과 차별화되게 코드를 디버깅해서 부분, 부분 나눠서 설명하면 더 좋지 않을까합니다.
      새로운 포스트에서 말씀해주신 내용 첨부하면 좋을 것 같다는 생각이 듭니다. 다시한 번 감사하다는 말씀 드립니다!!

  • Favicon of https://serina-the-best.tistory.com BlogIcon Serina_Heo 2020.09.07 14:02 신고

    감사합니다! 출저남기고 퍼가겠습니다 ^^

  • 620 2021.01.18 16:28

    덕분에 어중간하게 이해하고 있던 부분을 완벽하게 이해했습니다 감사합니다!!

  • 안녕나애기성현 2021.05.04 21:23

    취업용 포폴 작업 도중 검색해서 찾은 글인데 너무 유용합니다. 즐겨찾기하고 매일 보겠습니다

  • Favicon of https://eb-aujourdhui.tistory.com BlogIcon JSILY 2021.11.08 15:02 신고

    감사합니다 출처남기고 퍼가두 될까요?