Spring Boot/스프링 MVC

스프링 MVC 동작 원리

Holy Moly 2022. 8. 1. 18:00

스프링 MVC 소개

 

Model

  • 평범한 자바 객체 POJO
  • 도메인 객체 또는 DTO로 화면에 전달하거나 화면으로부터 전달받은 받은 데이터를 담은 객체

 

View

  • HTML, JSP, 타임리프
  • 데이터를 보여주는역할, 다양한 형태가 가능하다 HTML, JSON, XML,...

 

Controller

  • 스프링 @MVC
  • 사용자 입력을 받아 모델 객체의 데이터를 변경하거나, 모델 객체를 뷰에 전달하는 역할
    • 입력값 검증
    • 입력 데이터를 모델 객체로 변경
    • 변경된 모델 객체를 뷰에 전달

 

 

MVC 패턴의 장점

  • 동시다발적인 개발 가능 - 백엔드, 프론트엔드 개발자가 독립적으로 개발 진행가능
  • 높은 결합도 - 논리적으로관련있는 기능을 하나의 컨트롤러로 묶거나, 특정 모델과 관련있는 뷰를 그룹화 가능
  • 낮은 의존도 - 모델, 뷰, 컨트롤러는 각각 독립적이다
  • 개발 용이성 - 책임이 구분되어 있어 코드 수정하는 것이 편하다.
  • 한 모델에 대한 여러 형태의 뷰를 가질 수 있다.

 

MVC 패턴의 단점

  • 코드 네비게이션이 복잡하다
  • 코드 일관성 유지에 노력이 필요하다
  • High Learning Curve

 


서블릿 애플리케이션

 

서블릿 (Servlet)

  • 자바 엔터프라이즈 에디션은 웹 어플리케이션 개발용 스팩과 API제공
  • 요청 당 쓰레드 사용(만들거나, Pool에서 가져다가 사용)
  • 그 중 가장 중요한 클래스 중 하나가 HttpServlet

 

서블릿의 장점

  • 이전 사용하던 기술인 요청 당 프로세스를 만드는 CGI보다 빠름
  • 플랫폼 독립적
  • 보안
  • 이식성

 

서블릿 엔진 또는 서블릿 컨테이너(톰캣, 제티, 언더토, ...)

  • 세션관리
  • 네트워크 서비스
  • MIME 기반 메시지 인코딩, 디코딩
  • 서블릿 생명주기 관리
  • ...

 

서블릿 생명 주기

  • 서블릿 컨테이너가 서블릿 인스턴스의 init() 메소드 호출하여 초기화
    • 최초 요청시 한번 초기화 하고 그 다음 요청부터는 생략
    • 초기 접속시 여러 URL에 접속하여 서블릿 생성하여 이후 성능향상 시키기도 함
  • 서블릿 초기화 이후 클라이언트 요청 처리가능
  • 각 요청은 별도의 쓰레드로 처리, 이때 서블릿 인스턴스의 service()메소드 호출한다.
    • 이 안에서 HTTP 요청을 받고 클라이언트로 보낼 HTTP 응답을 만든다.
    • service()는 보통 HTTP Method에 따라 doGet(), do Post()등으로 처리 위임.
    • 따라서 보통 doGet() 또는 doPost()를 구현한다.
  • 서블릿 컨테이너 판단에 따라 해당 서블릿을 메모리에서 내려야 할 시점에 destroy() 호출

 

서블릿 리스너

  • 웹 어플리케이션에서 발생하는 주요 이벤트를 감지하고 각 이벤트에 특별한 작업이 필요한 경우에 사용가능
    • 서블릿 컨텍스트 수즌의 이벤트
      • 컨텍스트 라이프사이클 이벤트
      • 컨텍스트 애트리뷰트 변경 이벤트
    • 세션 수준의 이벤트
      • 세션 라이프사이클 이벤트
      • 세션 애트리뷰트 변경 이벤트

 

서블릿 필터

  • 들어온 요청을 서블릿으로 보내고, 또 서블릿이 작성한 응답을 클라이언트로 보내기 전에 특별한 처리가 필요한 경우에 사용가능
  • 체인형태 구조 Servlet Container <-> Filter A <-> Filter B <-> Servlet

 

DispatcherServlet

  • 스프링 MVC의 핵심
  • 스프링이 제공하는 IoC 컨테이너를 활용한 서블릿
  • Front Controller의 역할을 함

 


스프링 MVC 동작원리 정리

 

결국엔 Servlet을 이용한다. DispatcherServlet

 

DispatcherServlet

  • 특정 타입에 해당하는 빈을 찾는다
  • 없다면 기본 전략사용

 

스프링부트를 사용하지 않는 스프링 MVC

  • 서블릿 컨테이너(ex, 톰캣)에 등록한 웹 어블리케이션(WAR)에 DispatcherServlet을 등록
    • web.xml에 서블릿 등록
    • 또는 WebApplicationInitializer에 자바코드로 서블릿 등록
    • 세부 구성 요소는 빈 설정하기 나름

 

스프링 부트를 사용하는 스프링 MVC

  • 자바 애플리케이션에 내장 톰캣을 만들고 그 안에 DispatcherServlet을 등록
    • 스프링 부트가 자동으로 해줌
  • 스프링 부트 주관에 따라 여러 인터페이스 구현체를 빈으로 등록