코딩조각

[Spring] Servlet과 Spring MVC

밍튜 2022. 8. 15. 22:13
<Servlet &Spring web MVC>

 

목차

  1. 서블릿 이전의 웹 어플리캐이션
  2. 서블릿
  3. 서블릿 컨테이너와 서블릿의 동작 과정
  4. 프론트 컨트롤러 패턴
  5. Spring Web MVC

1.초창기 웹 어플리캐이션

 

단순히 html과 같은 정적인 파일만 제공

 

동적 컨텐츠 제공을 위해 CGI가 나옴(Common Gate Interface : 동적데이터를 제공하기위한 규약)

 

클라이언트로 부터 요청이오면 CGI구현체에게 동적데이터를 제공요청

CGI구현체가 데이터 제공.

단 CGI에 문제가있었음

모든 사용자의 요청마다 Process를 사용해서 요청을 처리했는데

프로세스는 각자 공간을 차지해서 너무 무거움

같은 요청이와도 동일한 cgi구현체를 또 만듬


 

 

2.Servlet

 

이런 문제를 해결하기위해 Servlet이나옴

서블릿은 자바진영에서 동적데이터를 제공하기위해 CGI기반으로 만든 프로그램

 

먼저 매번 process를 만들어 요청하던 부분을

Thread로 변경해서 서버에서 많은 리소스를 소모하는 문제를 해결

 

또한 동일요청에 매번 구현체를 만들던 단점을 싱글톤패턴(singleton)을 이용해

하나의 구현체를 재사용하도록 함

 

이로인해 서버가 부담해야할 리로스를 줄이면서 보다 효율적으로 동적데이터를 클라이언트에 제공


 

 

3.서블릿을 사용하면서 개발자가 얻는 이점

 

기본적으로 웹 어플리캐이션 요청을 보내기위해서 HTTP규약에 따른 요청을 하고

이를 기반으로한 HTTP메시지로 통신을 하게됩니다

 

Servlet은 개발자가 일일히 데이터에서 파싱작업을 하지않더라도 API를 통해서 제공받을 수 있도록 기능을 제공

 

그리고 HTTP Method에 대한 분기처리도 각 요청별로 대신 처리해줌

개발자는 이러한 요청들을 처리해주는 메서드를 재정의하고 API를 사용한뒤

요청받을 URL만 매핑해주면 우리가 원하는 비지니스 로직을 작성하고 수행할 환경을 제공받을수있게됨


 

 

4.Servlet container

서블릿은 생성시 init(), 제거시 destroy() method를 통해 생성 및 제거가 이루어짐

서블릿 컨테이너는 서블릿의 생성, 호출, 제거의 모든 작업을 관리, 서블릿의 생명주기 관리


 

5.서블릿의 문제점

 

  • 각요청마다 하나의 서블릿이 1:1로 매핑되는 구조를 가지고 있어, 그럴경우 서블릿마다 공통되어 실행되는 로직이 매번 반복해서 생성되고 실행됨

그럴경우 추후 각 컨트롤러에서 공통으로 처리해야되는 로직이 증가할수록

중복되는 로직이 증가함

또한 모든 요청들이 서블릿에 의존적인 구조를 가져야해서 프로그램이 서블릿에 의존적인 코드를 작성해야함

 

-> 문제해결을 위해 클라이언트 요청을 받는 서버의 최앞단에 Controller를 만들어

각 요청별로 처리하는 로직을 찾아서 이를 전달해 요청을 수행하는 방법을 만듬

 => 프론트 컨트롤러 패턴

 

프론트 컨트롤러 패턴을 사용해서 매 요청마다 각각의 서블릿을 사용하는것이 아닌

하나의 서블릿을 통해 요청을 수행, 관리가 수월해짐

 

또한 각 서블릿마다 가지고있는 중복되는 공통 요청들을 프론트 컨트롤러 단 한곳에서 사용하기때문에 중복로직을 제거하는 장점을 가짐

 

프론트 컨트롤러가 하는일

  • 1. 클라이언트 - 서버 연결
  • 2. 각요청에 맞는 컨트롤러를 매핑하여 정보를 보관
  • 3. 요청이 들어오면 매핑정보를 찾아 해당 컨트롤러 호출
  • 4. 전달할 결과를 생성
  • 5. 결과를 사용자에게 반환

 

프론트 컨트롤러의 역할이 많아져 역할을 나누게됨

 

Spring Web MVC의 구조로 역할이 나눠지게됨

 

Spring web MVC 가져다주는 이점을 사용하면서 비지니스 로직에 집중할수있는 환경을 만들어줌