웹 애플리케이션의 동작(톰캣)
웹 브라우저 <-> 웹 서버
JSP 실행 원리
JSP -> Servlet (.java) -> 컴파일 -> 바이트코드 (.class) -> Servlet 객체 생성됨 -> Servlet Container
//좀더 자세히
1. Webserver나 Servlet 엔진에서 클라이언트의 요청을 받게 됩니다.
2. JSP Handler 즉, JSP Container Process라고 불리우는 루틴을 거치게 되면서 Servlet 객체존재여부와 파일변경여부를 확인하게 됩니다.
3. 변경되었다면 새로 source파일을 생성하고 그리고 compile과정을 거쳐 실행하게 되고 그리고 이미 로딩되어 있는데 변경처리되지 않았다면 기존에 존재하는 것을 이용하게 됩니다.
4. 로딩을 하지않았다면 처음부터 로딩을 시작하여 source파일을 만들고 compile과정을 거쳐 새로 실행합니다.
5. 다른 서블릿들도 Servlet Container에 적재하는 과정을 반복하게 됩니다.
jsp변환 서블릿 프로그램은 jspInit(), _jspService(), jspDestroy()세가지 메서드에 의해서 초기화, 서비스, 파괴의 과정을 거친다고 위에서 언급했습니다.
아래의 그림과 같이 jspInit 메서드를 단 한번 호출한 후 _jspService 메서드를 서비스 요청이 있을 때마다 호출하게 됩니다.
Servlet Container 내부 동작
http://www.libqa.com/wiki/171
"컨테이너"
컨테이너는 서블릿과 웹 서버가 서로 통신할 수 있는 손쉬운 방법을 제공한다. 다시 말하면, 서버와 대화하기 위하여 개발자가 직접 ServerSocket을 만들고 특정포트에 리스닝하고, 연결 요청이 들어오면 스트림을 생성하는 등 이런 복잡한 일련을 할 필요가 없단 얘기이다. 컨테이너는 어떻게 웹 서버와 통신해야 하는지 잘 알고 있으며 이런 통신 기능을 api로 제공한다.따라서 웹 서버와 서블릿이 서로 통신하기 위한 통로인 통신 API에 대해서 고민할 필요가 없다. 개발자가 고민해야 할 부분은 서블릿에 구현해야 할 비즈니스 로직이다.

* 컨테이너가 요청다루기 *
1. 사용자가 서블릿에 대한 요청을 클릭
2. 컨테이너는 들어온 요청이 서블릿이라는 것을 간파하곤 HttpservletRequest, HttpServletResponse 객채생성
3. 사용자가 날린 url을 분석하여 어떤 서블릿에 대한 요청인지 알아내고 해당 서블릿의 스레드를 생성하여 request,response 전달
4. 컨테이너는 서블릿의 service() 메소드를 호출 -> service()에서는 doGet()을 호출할지 doPost를 호출할지 결정(일단 doGet으 로 간주)
5. doGet()메소드는 동적인 페이지를생성한 다음, 이를 response객체에 실어 보낸다. 보내고 난 후에도 response에 대한 레퍼런스를 가지고 있다.
6. 스레드 작업이 끝나면 컨테이너는 response객체 를 HttpResponse로 전환하여 클라이언트로 내려보낸다. 이제 마지막으로 Request와 Response 객체를 소멸.
https://ko.wikipedia.org/wiki/%EC%9B%B9_%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88
웹 컨테이너
https://trello.com/c/R1YAtY0I/27-%EC%9B%B9%EC%84%9C%EB%B2%84-vs-was-vs-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88
웹서버 vs WAS vs 컨테이너
http://h2lloworld.tistory.com/entry/%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%84%9C%EB%B2%84-%EC%84%9C%EB%B8%94%EB%A6%BF%C2%A0%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-JSP%C2%A0%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%C2%A0%EC%9B%B9%EC%84%9C%EB%B2%84
보통 서블릿 서버, 서블릿 컨테이너, JSP 컨테이너, 웹서버 라는 등등의 말을 많이 사용합니다. 그렇지만 실제로 각각에 대한 정확한 의미를 알고 있는 경우는 드문데 각각의 의미를 살펴보면 다음과 같습니다.
서블릿서버 : 현재는 거의 사용되지 않는 말입니다. 공식적으로 사용되는 단어라기 보다는 우리나라에서 관습적으로 사용이 되고 있는 의미로 서블릿을 돌릴 수 있는 서버라는 의미입니다. 실제로 서블릿 컨테이너라는 말을 사용하는 것이 좋습니다. (초기에는 서블릿을 돌리기 위해서 아파치 등에 모듈로 연동을 해서 사용을 했기 때문에 이런 말이 생겨난 듯 합니다.)
서블릿 컨테이너 : 서블릿을 동작 시킬수 있는 환경을 제공하는 서버 프로그램입니다. 즉 HTTP 요청을 받아서 해당 서블릿을 동작을 시키고 그 결과를 사용자의 브라우저로 전달을 해줄 수 있는 기능을 제공합니다. 보통 컨테이너라고 하는 이유는 서블릿 프레임워크 안에서 동작을 하고 서블릿이 동작할 수 있는 환경을 제공해주며, 기타 필요한 작업등을 제공해주기 때문에 그렇게 얘기를 합니다. 즉 HTTP 파라미터 파싱 및 결과 전달 컨트롤, Forwarding, Redirecting 등의 기능을 컨테이너에서 제공을 해줍니다. 이때 서블릿 개발자는 자신이 만든 서블릿을 이 컨테이너에 등록을 하게 되고, 실제 동작을 컨테이너가 알아서 하게 되기 때문에 사용되는 언어입니다.
JSP 컨테이너 / 엔진: 실제로 JSP 컨테이너의 의미는 서블릿 컨테이너의 개념과 동일합니다. 그렇지만 조금 자세히 보면 실제로 JSP 컨테이너라는 것은 별도로 존재하지 않습니다. 실제로는 서블릿 컨테이너가 JSP 컨테이너가 됩니다. 그 이유는 JSP는 PHP/ASP와 같이 완전히 스크립트 형식으로 동작하지 않고 서블릿으로 변환이 된 이후에 실행되기 때문입니다. 그리고 JSP를 서블릿으로 컴파일을 해주는 것이 바로 JSP 엔진입니다. 다른 프로그램은 잘 모르겠지만 톰캣의 경우에는 JSP엔진이 바로 JSPServlet 입니다. 즉 JSP를 컴파일하고 동작을 시켜주는 것을 특정 서블릿이 담당하고 있습니다. 여기서 보면 JSP 자체가 완전한 서블릿으로 컴파일 되지 않는 다는 것을 알 수 있습니다. 즉 JSPservlet이 구동 할 수 있는 형태의 서블릿으로 바뀌게 됩니다. 그런 의미에서 보면 별도의 JSP 컨테이너가 있다고 할 수도 있을 것 같습니다.
웹서버는 클라이언트/서버 모델과 웹의 HTTP를 사용하여 웹 페이지가 들어 있는 파일을 사용자들에게 제공하는 프로그램이다.
- 웹서버와 JSP컨테이너는 별개라고 할수도 아니라고 할수도 있다. 대부분 JSP로 만들어진 사이트는 웹서버와 JSP컨테이너를 탑재하고 있는 WAS를 연동해 사용하기 때문이다.
https://way2java.com/jsp/jsp-made-simple-what-is-jsp-engine-or-what-is-jsp-container/바로위 링크를 보고 JSP Container는 없는 것인지 알았는데 있는 듯하다.
google에 jsp container를 검색하면 결과도 많다. 톰캣 doc 7 이전 버전에서 톰캣을 The Apache Tomcat 5.5 Servlet/JSP Container라고 소개하니까 말 다했다. (https://tomcat.apache.org/tomcat-5.5-doc/index.html)
근데 명칭이 바낀 이유는 무엇일까?
https://okky.kr/article/243427
웹 브라우저 : 요청
웹 서버 : 응답
웹 브라우저 <-> 웹 서버 <-> 웹 애플리케이션 서버(톰캣) <-> 데이터베이스
웹 브라우저에서 하는 일(동작 과정)
웹 브라우저 <-> 웹서버 (전송 과정)
웹 서버에서 하는 일(동작 과정)
웹 서버 <-> 웹 애플리케이션 서버 (전송 과정)
웹 애플리케이션 서버에서 하는 일(동작 과정)
데이터베이스..
JSP 실행 원리
JSP -> Servlet (.java) -> 컴파일 -> 바이트코드 (.class) -> Servlet 객체 생성됨 -> Servlet Container
//좀더 자세히
1. Webserver나 Servlet 엔진에서 클라이언트의 요청을 받게 됩니다.
2. JSP Handler 즉, JSP Container Process라고 불리우는 루틴을 거치게 되면서 Servlet 객체존재여부와 파일변경여부를 확인하게 됩니다.
3. 변경되었다면 새로 source파일을 생성하고 그리고 compile과정을 거쳐 실행하게 되고 그리고 이미 로딩되어 있는데 변경처리되지 않았다면 기존에 존재하는 것을 이용하게 됩니다.
4. 로딩을 하지않았다면 처음부터 로딩을 시작하여 source파일을 만들고 compile과정을 거쳐 새로 실행합니다.
5. 다른 서블릿들도 Servlet Container에 적재하는 과정을 반복하게 됩니다.
jsp변환 서블릿 프로그램은 jspInit(), _jspService(), jspDestroy()세가지 메서드에 의해서 초기화, 서비스, 파괴의 과정을 거친다고 위에서 언급했습니다.
아래의 그림과 같이 jspInit 메서드를 단 한번 호출한 후 _jspService 메서드를 서비스 요청이 있을 때마다 호출하게 됩니다.
Servlet Container 내부 동작
http://www.libqa.com/wiki/171
"컨테이너"
컨테이너는 서블릿과 웹 서버가 서로 통신할 수 있는 손쉬운 방법을 제공한다. 다시 말하면, 서버와 대화하기 위하여 개발자가 직접 ServerSocket을 만들고 특정포트에 리스닝하고, 연결 요청이 들어오면 스트림을 생성하는 등 이런 복잡한 일련을 할 필요가 없단 얘기이다. 컨테이너는 어떻게 웹 서버와 통신해야 하는지 잘 알고 있으며 이런 통신 기능을 api로 제공한다.따라서 웹 서버와 서블릿이 서로 통신하기 위한 통로인 통신 API에 대해서 고민할 필요가 없다. 개발자가 고민해야 할 부분은 서블릿에 구현해야 할 비즈니스 로직이다.

* 컨테이너가 요청다루기 *
1. 사용자가 서블릿에 대한 요청을 클릭
2. 컨테이너는 들어온 요청이 서블릿이라는 것을 간파하곤 HttpservletRequest, HttpServletResponse 객채생성
3. 사용자가 날린 url을 분석하여 어떤 서블릿에 대한 요청인지 알아내고 해당 서블릿의 스레드를 생성하여 request,response 전달
4. 컨테이너는 서블릿의 service() 메소드를 호출 -> service()에서는 doGet()을 호출할지 doPost를 호출할지 결정(일단 doGet으 로 간주)
5. doGet()메소드는 동적인 페이지를생성한 다음, 이를 response객체에 실어 보낸다. 보내고 난 후에도 response에 대한 레퍼런스를 가지고 있다.
6. 스레드 작업이 끝나면 컨테이너는 response객체 를 HttpResponse로 전환하여 클라이언트로 내려보낸다. 이제 마지막으로 Request와 Response 객체를 소멸.
https://ko.wikipedia.org/wiki/%EC%9B%B9_%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88
웹 컨테이너
웹 컨테이너(web container, 또는 서블릿 컨테이너)는 웹 서버의 컴포넌트 중 하나로 자바 서블릿과 상호작용한다. 웹 컨테이너는 서블릿의 생명주기를 관리하고, URL과 특정 서블릿을 맵핑하며 URL 요청이 올바른 접근 권한을 갖도록 보장한다. [1]
웹 컨테이너는 서블릿, 자바서버 페이지(JSP) 파일, 그리고 서버-사이드 코드가 포함된 다른 타입의 파일들에 대한 요청을 다룬다. 웹 컨테이너는 서블릿 객체를 생성하고, 서블릿을 로드와 언로드하며, 요청과 응답 객체를 생성하고 관리하고, 다른 서블릿 관리 작업을 수행한다.
- 아파치 톰캣 (예전 자카르타 톰캣) 은 아파치 소프트웨어 라이선스 하에 사용할 수 있는 오픈 소스 웹 컨테이너다.
https://trello.com/c/R1YAtY0I/27-%EC%9B%B9%EC%84%9C%EB%B2%84-vs-was-vs-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88
웹서버 vs WAS vs 컨테이너
웹 서버(Web Server)
- 클라이언트의 요청을 받아 HTML이나 오브젝트를 HTTP 프로토콜
- 웹 페이지, 이미지 등 정적인 페이지를 생성
(JSP 컨테이너가 탑재되어 있는 WAS는 JSP 페이지를 컴파일 해 동적인 페이지를 생성)
웹 어플리케이션 서버(Web Application Server / WAS)
- 웹 서버 + 웹 컨테이너.
- 웹상에서 사용하는 컴포넌트들을 올려놓고 사용하게 되는 서버
- EJB와 같은 빈들이 올라가게 되며, 서버에 따라 웹에 필요한 많은 기능들을 포함
- J2EE 스펙을 구현한 서버(JSP / Servlet Container와 EJB Container 로서의 기능)
- Tomcat은 JSP / Servlet Container의 기능을 구현했으나 EJB Container로서의 기능은 없다. 따라서 Tomcat은 WAS가 아니라는 사람들도 있음
컨테이너(Containner)
- JSP와 서블릿을 실행시킬 수 있는 소프트웨어를 웹 컨테이너(Web Container) 혹은 서블릿 컨테이너(Servlet Container)라고 함
- 웹 서버에서 JSP를 요청하면 톰캣에서는 JSP 파일을 서블릿으로 변환하여 컴파일을 수행하고, 서블릿의 수행결과를 웹 서버에서 전달
웹 서버와 WAS의 일반적인 구성
- 사용자가 브라우저에서 요청을 하게 되면 다음과 같이 웹 서버와 WAS 서버를 거쳐 응답이 돌아옴
사용자 요청(웹 브라우저) -> 웹 서버 -> WAS(동적 처리) -> 웹 서버 -> 사용자 응답 메세지
http://h2lloworld.tistory.com/entry/%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%84%9C%EB%B2%84-%EC%84%9C%EB%B8%94%EB%A6%BF%C2%A0%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-JSP%C2%A0%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%C2%A0%EC%9B%B9%EC%84%9C%EB%B2%84
서블릿 서버, 서블릿 컨테이너, JSP 컨테이너, 웹서버
보통 서블릿 서버, 서블릿 컨테이너, JSP 컨테이너, 웹서버 라는 등등의 말을 많이 사용합니다. 그렇지만 실제로 각각에 대한 정확한 의미를 알고 있는 경우는 드문데 각각의 의미를 살펴보면 다음과 같습니다.
서블릿서버 : 현재는 거의 사용되지 않는 말입니다. 공식적으로 사용되는 단어라기 보다는 우리나라에서 관습적으로 사용이 되고 있는 의미로 서블릿을 돌릴 수 있는 서버라는 의미입니다. 실제로 서블릿 컨테이너라는 말을 사용하는 것이 좋습니다. (초기에는 서블릿을 돌리기 위해서 아파치 등에 모듈로 연동을 해서 사용을 했기 때문에 이런 말이 생겨난 듯 합니다.)
서블릿 컨테이너 : 서블릿을 동작 시킬수 있는 환경을 제공하는 서버 프로그램입니다. 즉 HTTP 요청을 받아서 해당 서블릿을 동작을 시키고 그 결과를 사용자의 브라우저로 전달을 해줄 수 있는 기능을 제공합니다. 보통 컨테이너라고 하는 이유는 서블릿 프레임워크 안에서 동작을 하고 서블릿이 동작할 수 있는 환경을 제공해주며, 기타 필요한 작업등을 제공해주기 때문에 그렇게 얘기를 합니다. 즉 HTTP 파라미터 파싱 및 결과 전달 컨트롤, Forwarding, Redirecting 등의 기능을 컨테이너에서 제공을 해줍니다. 이때 서블릿 개발자는 자신이 만든 서블릿을 이 컨테이너에 등록을 하게 되고, 실제 동작을 컨테이너가 알아서 하게 되기 때문에 사용되는 언어입니다.
JSP 컨테이너 / 엔진: 실제로 JSP 컨테이너의 의미는 서블릿 컨테이너의 개념과 동일합니다. 그렇지만 조금 자세히 보면 실제로 JSP 컨테이너라는 것은 별도로 존재하지 않습니다. 실제로는 서블릿 컨테이너가 JSP 컨테이너가 됩니다. 그 이유는 JSP는 PHP/ASP와 같이 완전히 스크립트 형식으로 동작하지 않고 서블릿으로 변환이 된 이후에 실행되기 때문입니다. 그리고 JSP를 서블릿으로 컴파일을 해주는 것이 바로 JSP 엔진입니다. 다른 프로그램은 잘 모르겠지만 톰캣의 경우에는 JSP엔진이 바로 JSPServlet 입니다. 즉 JSP를 컴파일하고 동작을 시켜주는 것을 특정 서블릿이 담당하고 있습니다. 여기서 보면 JSP 자체가 완전한 서블릿으로 컴파일 되지 않는 다는 것을 알 수 있습니다. 즉 JSPservlet이 구동 할 수 있는 형태의 서블릿으로 바뀌게 됩니다. 그런 의미에서 보면 별도의 JSP 컨테이너가 있다고 할 수도 있을 것 같습니다.
웹서버는 클라이언트/서버 모델과 웹의 HTTP를 사용하여 웹 페이지가 들어 있는 파일을 사용자들에게 제공하는 프로그램이다.
- 웹서버와 JSP컨테이너는 별개라고 할수도 아니라고 할수도 있다. 대부분 JSP로 만들어진 사이트는 웹서버와 JSP컨테이너를 탑재하고 있는 WAS를 연동해 사용하기 때문이다.
https://way2java.com/jsp/jsp-made-simple-what-is-jsp-engine-or-what-is-jsp-container/바로위 링크를 보고 JSP Container는 없는 것인지 알았는데 있는 듯하다.
google에 jsp container를 검색하면 결과도 많다. 톰캣 doc 7 이전 버전에서 톰캣을 The Apache Tomcat 5.5 Servlet/JSP Container라고 소개하니까 말 다했다. (https://tomcat.apache.org/tomcat-5.5-doc/index.html)
근데 명칭이 바낀 이유는 무엇일까?
https://okky.kr/article/243427
댓글
댓글 쓰기