간단 지식/web

02. JSP, Spring , Servlet, Servlet container 정리

납작한돌맹이 2021. 3. 28. 21:00
반응형

JSP: HTML문서에 내부적으로 자바문법을 사용할 수 있게 하는 Java Server Page 언어이다.

 

Spring Framework: 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크로서 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공하고 있다. JSP보다 Spring의 영역이 더 넓다. JSP는 웹 페이지 영역에서, Spring은 웹 서비스의 전반적인 영역에서 프로그램의 근본이 되는 환경을 구축한다.

 

Servlet:  자바로 웹을 만들기 위해 필요한 기술로, client가 request를 하면 그에 대한 결과를 response해주는 역할을 하는 자바 프로그램이다. 예를 들어, 사용자가 로그인을 하기 위해 id와 pw를 입력하고 로그인 버튼을 누른다고 가정해보자. 그러면 server는 client의 id와 pw를 확인하고 다음 페이지를 띄워주어야 하는데, 이러한 역할을 수행하는 것이 바로 servlet이다. 정적인 웹 서버에서 동적인 페이지를 제공할 수 있게 도와주는 어플리케이션이라고 보면 된다. (MVC 패턴 중 Controller에 해당)

 

Servlet container: server에 servlet을 만들었다고 해서 스스로 작동하는 것은 아니다. servlet을 관리해주는 것이 필요한데, 그러한 역할을 하는 것이 바로 서블릿 컨테이너이다. 예를 들어, servlet이 어떠한 역할을 수행하라고 알려주는 지침서라면, 서블릿 컨테이너는 그 지침서를 보고 행동하는 수행자라고 볼 수 있다. 서블릿 컨테이너는 client의 Request을 받고 Response할 수 있도록 웹 서버와 소켓으로 통신한다. 대표적인 예로 톰캣이 있다. 톰캣은 실제로 웹 서버와 통신하여 JSP(자바 서버 페이지)와 Servlet이 작동하는 환경을 제공해준다.

 


dispatcher-servlet: Servlet Container에서 HTTP프로토콜을 통해 들어오는 모든 요청을 presentation layer의 제일 앞에 둬서 중앙집중식으로 처리해주는 Front Controller이다. 그래서 공통처리 작업을 Dispatcher 서블릿이 처리한 후, 적절한 세부 컨트롤러로 작업을 위임해준다. 

 

Front Controller: client의 request는 톰캣 같은 서블릿 컨테이너가 받는데, 이때 제일 앞에서 서버로 들어오는 모든 request를 처리하는 역할을 한다. 이런 컨트롤러를 Spring에서는 dispatcher-servlet이라고 부른다. 주로 MVC 구조에서 자주 등장하는 패턴이다.

 

Spring MVC: dispatcher-Servlet이 등장함에 따라 web.xml의 역할을 상당히 축소시켜 주었다. 기존에는 모든 서블릿에 대해 URL 매핑을 활용하기 위해서 web.xml에 모두 등록해주어야 했지만, dispatcher-servlet이 해당 어플리케이션으로 들어오는 모든 request를 핸들링해주면서 작업을 상당히 편리하게 할 수 있게 되었습니다.

출처: https://mangkyu.tistory.com/18

물론 Dispatcher-Servlet이 요청을 Controller로 넘겨주는 방식은 효율적이지만, 모든 요청을 처리하다보니 이미지나 HTML 파일을 불러오는 요청마저 전부 Controller로 넘겨버리는 문제가 발생한다. 게다가 JSP 파일 안의 JavaScript나 StyleCSS 파일들에 대한 요청들까지 모두 dispatcher-servlet이 핸들링해버려 자원을 불러오지 못하는 상황이 발생하기도 했다고 한다. 

이에 대한 해결책은 아래와 같이 두가지가 있다.

1.  client의 request를 2가지로 분리하여 구분

    a). /apps 의 URL로 접근하면 Dispatcher Servlet이 담당한다.

    b). /resources 의 URL로 접근하면 Dispatcher Servlet이 컨트롤할 수 없으므로 담당하지 않는다.

이러한 방식은 괜찮지만 상당히 코드가 지저분해지며, 모든 요청에 대해서 저런 URL을 붙여주기 때문에 직관적인 설계가 될 수 없다.

2. 모든 요청을 컨트롤러에 등록하는 것인데, 상당히 무식한 방법이다. 

 

따라서 Spring은 이러한 문제들을 해결함과 동시에 편리한 방법을 제공해주는데, 그것은 바로 <mvc:resources />를 이용한 방법이다. 만약 Dispatcher-Servlet에서 해당 요청에 대한 컨트롤러를 찾을 수 없는 경우에, 2차적으로 설정된 경로에서 요청을 탐색하여 자원을 찾아준다. 이렇게 영역을 분리하면 효율적인 자원 관리를 지원할 뿐 아니라 추후에 확장을 용이하게 해준다는 장점이 있다.

 

 

(이 글이 도움이 됐다면 광고 한번씩만 클릭 해주시면 감사드립니다, 더 좋은 정보글 작성하도록 노력하겠습니다 :) )

반응형