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을 등록
- 스프링 부트가 자동으로 해줌
- 스프링 부트 주관에 따라 여러 인터페이스 구현체를 빈으로 등록