Spring

[Spring] Servlet 과 Spring

날아 2023. 2. 6. 00:02

1. Servlet (서블릿) 출현 배경 

일반적으로 웹서버는 정적 페이지만을 제공한다. (Web Server는 정적 데이터만 전달할 수 있었다.)

따라서 동적인 페이지를 제공하기 위해서 웹서버는 다른 곳에 도움을 요청하여 동적인 페이지를 작성해야만 한다. 

따라서 나온 것이 CGI이다. 

CGI
  • 동적 데이터를 처리하는 인터페이스 (Web Server와 프로그램 사이의 규약)
  • CGI는 어떠한 프로그래밍 언어로도 구현이 가능하며, 별도로 만들어 놓은 프로그램에 HTML의 GET/POST 방법으로 클라이언트의 데이터를 환경변수로 전달하고, 프로그램의 표준 출력 결과를 클라이언트에게 전송하는 것이다.
  • 한계 
    1. request가 들어올 때 마다 Process를 생성하기 때문에 많은 사용자를 처리하기엔 무리였다.  
    2.  같은 request가 들어와도 각 쓰레드마다 CGI 구현체가 각각 생겼다.
  • 개선 
    1. Process를 Thread로 변경 
    2. 여러 Instance에서 Singleton으로 변경 
  • 이러한 개선점을 지니고 있는 것이 서블릿이다. 

 

 웹 서버 vs 웹 애플리케이션 서버 
  • Web Server : 정적 데이터 처리
    • ex)Apache
  • Web Application Server : 동적 데이터 처리
    • ex)Tomcat 

2. Servlet (서블릿)

  • 자바를 사용하여 웹을 만들기 위해 필요한 기술 
  • 클라이언트의 요청에 대한 결과를 다시 전송하는 역할을 맡은 자바 프로그램 

 

서블릿 특징
  • 클라이언트 요청에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트
  • html을 사용하여 요청에 응답
  • 자바 쓰레드를 이용하여 동작
  • MVC 패턴에서 Controller로 이용

 

서블릿 동작 방식

  1. 사용자(클라이언트)가 URL을 입력하면 HTTP Request가 Servlet Container로 전송
  2. 요청을 전송받은 Servlet Container는 HttpServletRequest, HttpServletResponse 객체를 생성
  3. web.xml을 기반으로 사용자가 요청한 URL이 어느 서블릿에 대한 요청인지 찾는다
  4. 해당 서블릿에서 service메소드를 호출한 후 클라이언트의 GET, POST여부에 따라 doGet() 또는 doPost()를 호출
  5. doGet() or doPost() 메소드는 동적 페이지를 생성한 후 HttpServletResponse객체에 응답을 보낸다
  6. 응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸

3. Servlet 컨테이너

  • 서블릿은 스스로 작동하는 것이 아닌, 서블릿을 관리하는 서블릿컨테이너에 의해 수행된다. 
  • 컨테이너는 클라이언트의 요청을 받아주고 응답할 수 있도록, 웹서버와 소켓으로 통신한다. 

 

Servlet 컨테이너 역할 
  • 웹서버와의 통신 지원 
  • 서블릿 생명주기 관리 
  • 멀티스레드 지원 및 관리
    • 서블릿 컨테이너는 요청이 올 때마다 자바 스레드를 하나 생성한다. 
    • HTTP 서비스 메소드를 실행한 뒤, 스레드는 자동으로 소멸된다.
  • 선언적인 보안 관리
    • 서블릿 컨테이너를 사용하면 개발자는 보안에 관련된 내용을 서블릿 또는 자바 클래스에 구현해 놓지 않아도 된다.
    • 일반적으로 보안관리는 XML 배포 서술자에 다가 기록하므로, 보안에 대해 수정할 일이 생겨도 자바 소스 코드를 수정하여 다시 컴파일 하지 않아도 보안관리가 가능하다.

 

Servlet 생명주기

 

  1. 클라이언트의 요청이 들어오면 컨테이너는 해당 서블릿이 메모리에 있는지 확인하고, 없을 경우 init()메소드를 호출하여 적재
    • init()메소드는 처음 한번만 실행되기 때문에, 서블릿의 쓰레드에서 공통적으로 사용해야하는 것이 있다면 오버라이딩하여 구현한다. 실행 중 서블릿이 변경될 경우, 기존 서블릿을 파괴하고 init()을 통해 새로운 내용을 다시 메모리에 적재한다.
  2. init()이 호출된 후 클라이언트의 요청에 따라서 service()메소드를 통해 요청에 대한 응답이 doGet()가 doPost()로 분기된다. 이때 서블릿 컨테이너가 요청이 오면 가장 먼저 처리하는 과정으로 생성된 HttpServletRequest, HttpServletResponse에 의해 request와 response객체가 제공된다.
  3. 컨테이너가 서블릿에 종료 요청을 하면 destroy()메소드가 호출되는데 마찬가지로 한번만 실행되며, 종료시에 처리해야하는 작업들은 destroy()메소드를 오버라이딩하여 구현하면 된다.

4. Dispatcher Servlet

  •  Spring Web MVC에서 사용하는 서블릿 기술 

 

  1. 클라이언트 요청을 디스패처 서블릿이 받음
  2. 핸들러 조회 : 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회한다.
  3. 핸들러 어댑터 조회 : 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다.
  4. 핸들러 어댑터 실행 : 핸들러 어댑터를 실행한다.
  5. 핸들러 실행 : 핸들러 어댑터가 실제 핸들러를 실행한다.
  6. ModelAndView 반환 : 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환한다.
  7. viewResolver 호출 : 뷰 리졸버를 찾고 실행한다.
  8. View 반환 : 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를 반환한다. 
  9. 뷰 렌더링 : 뷰를 통해서 뷰를 렌더링한다.

 

 

 

출저

https://www.youtube.com/watch?v=2pBsXI01J6M