Jsp

[JSP]JSP와 Servlet/ 동작과정__10/20

하체는 스쿼트 2022. 10. 20. 18:03
동적페이지가 나온이유

 

정적으로 페이지를 처리하는 것에 한계가 있다. 

예) 환율 같은거는 실시간으로 우리가 요청할때 마다 값이 변동되어야 한다,

      상품에 관련된 정보는 실시간으로 사용자에게 전달 되어야한다.(할인이 적용되면 상품값이 달라짐)

 

그래서 동적으로 페이지를 처리하는 CGI방식(ex - 서블릿)이 나왔다.

 

초기 CGI 방식은 프로세스 방식으로 동작했다.

=>클라이언트1이 요청하면 환율조회 기능 프로세스를 메모리에 생성 후 1이 원하는 정보를 반환해 주고

클라2 가 요청한 환율조회 기능 프로세스를 또 메모리에 생성해주고 원하는 정보를 반환함

(같은 기능을 하더라도 똑같이 메모리에 계속 생성함....ㄷ)

 

시대가 발전하면서 인터넷 환경이 발전하고 사용자 수가 급격히 늘면서 메모리에 과부하가 걸릴수도 있게됨

 

이 문제를 개선하기 위해 나온게 JSP임

 

JSP는 쓰레드 방식이기 때문에 CGI방식보다 효율적

클라1 => 환율 정보 요청 => 서버에서 환율 조회 기능 메모리에 올림

          <= 환율정보 반환  <=

클라2 => 환율 정보 요청 => 서버에 기존 메모리에 올라가 있던 환율 조회 기능 사용

         <= 환율정보 반환  <=

 

각각 의 요청에 대한 기능을 메모리에 따로따로 로드하지 않아도 된다.

 

JSP  동작 방식의 특징

  • 프로 세스 방식이 아닌 쓰레드 방식으로 실행
  • 클라이언트의 요구를 처리하는 기능은 최초 한 번만 메로리에 로드된다.
  • 클라이언트가 동일한 기능을 요구하면 기존에 사용한 기능을 재사용한다.

 

참고)

웹은 HTTP와 CGI(웹 커먼 게이트 인터페이스) 의 규격을 맞춰서 코딩을 해야한다.

자바에서는 CGI 기본 규격을 맞추기 위해 HttpServlet 클래스를 만들었다.

 

HttpServlet 안에서 자체적으로 doGet doPost가 들어오면 처리해주는 서비스가 구현되어져 있다.

 

 

 

JSP가 나온 이유

 

 

servlet에 일일히 작성해야하는 번거로움을 감소하기 위해 JSP가 생겨남

 

 

(서블릿은 view 부분을 만들기 너무 어렵다......이걸 보완하기 위해 나온게JSP)

(예를 들어 out.println부분에 일일히 out.println을 쓰면서 style 관련 코딩을 다 해야 한다고 생각해봐라=> 최악)

 

*정리*

최초의 html이 있었고 이걸 배포하려면 그냥 아파치(웹서버)만으로도 충분했다.

근데 동적 페이지를 만들고 싶었고 자바같은 연산이 필요했다.

 

웹서버로는 연산이 불가하고 WAS 안에서 자바를 돌려서 for문도 돌리고~ if문도 돌리고 db랑 접속도하고 해서 동적으로 페이지를 만들어서 렌더링해서 배포해야했다.

 

그러다 보니 위에 사진 처럼 코드가 복잡하고 지저분해 졌다.

=> 이로인해 문제가 view단이랑 서비스단이 분리가 안되버렸다.

이걸 해결하기 위해

view에 대한 정보는 .jsp 로 넘기고 비지니스로직들은 servlet로 하겠다고 분리를 시킨것이다.

 

 

 

 

 


 

 

웹 어플리케이션이란?

 

기존의 정적인 웹 어플리케이션의 기능을 그대로 사용하면서 이 책에서 다루는 서블릿,JSP, 자바 클래스들을 추가하여
사용자에게 동적인 서비스를 제공하는 프로그램이다.

 

웹 어플리케이션의 기본 구조

 

웹 어플리케이션의 이름으로 이루어진 루트 디렉터리와 하위 디렉터리 구조를 기본 구조로 가진다.

기본 구조의 각 역할

  • 웹 어플리케이션이름 :  웹 어플리케이션의 루트 디렉터리, 다른 웹 어플리케이션 이름과 중복을 허하지 않으며                                                  여기에는 JSP, HTML 파일이 저장된다.
  • WEB-INF : 웹 어플리케이션에 관한 정보가 저장되는 곳, 이 디렉토리는 외부에서 접근할 수 없다.
  • classes : 웹 어플리케이션이 수행하는 서블릿과 다른 일반 클래스 들이 위치하는 곳이다.                                                             (.class 파일들이 들어있는 곳이다.)
  • web.xml : deployment descriptor(배치 지시자) 로서 일종의 환경 설정 파일이다. 웹 어플리케이션에 대한 여러가지                      설정을 할 때 사용된다.

 

*참고)

WEB-INF 폴더 안에 추가적으로 bin, conf, src 폴더 등을 더 생성해서 사용할 수 있다.

  • bin : 어플리케이션에서 사용되는 각종 실행파일이 저장되는 곳이다.
  • conf : 프레임워크에서 사용하는 각종 설정 파일이 저장된 곳이다.
  • src : 자바 소스 파일이 저장된 곳이다.

 

 

 

 

JSP/Servlet 컨테이너 종류 중 하나가 톰캣 컨테이너다.

 

톰캣은 webapps 폴더부터 읽어 들어간다.

 

 

Context

 

 

우리가 매번 어플리케이션을 만들고 webapps 폴더 밑으로 이동 시킬 순 없다.

 

그래서 개발자가 정한 위치에 어플리케이션을 생성한 후 그 위치를

server.xml에 등록해 놓고 톰캣을 실행하는 식으로 개발을 진행해야한다.

톰캣이  server.xml에 입력된 정보에 따라 해당 위치로 이동하여 어플리케이션을 확인하고 실행할 것이다.

 

server.xml에 등록하는 웹 어플리케이션을 context(컨텍스트) 라고 부른다. 

즉, 톰캣의 입장에서 인식하는 한 개의 웹 어플리케이션이라고 생각하면된다.

 

참고)

applicationContext 도 거의 유사한 의미로 사용된다.

웹 어플리케이션들이 사용하는 메모리 들의 영역을 context 라고 불리기도 한다.

그래서 관점에 따라 의미를 다르게 생각 할 수 있다.

 

 

 

server.xml에 context를 등록하는 방법

 

 

참고) 웹 어플리케이션당 하나의 컨텍스트가 등록된다.

sever.xml에 등록한다.

 

<Context path="/컨택스트 이름"
	docBase="실제 웹 어플리케이션의 WEB-INF 디렉터리 위치"
	reloadable="true 또는 false"/>
  • path : 웹 어플리케이션의 컨텍스트 이름이다. 웹 어플리케이션의 이름과 다를 수도 있으며, 웹 브라우저에서 실제 웹            어플리케이션을 요청하는 이름입니다.
  • docBase : 컨텍스트에 대한 실제 웹 어플리케이션이 위치한 경로이다.  WEB-INF 상위 폴더까지의 경로를 나타낸다.
  • reloadable : 실행 중 소스 코드가 수정될 경우 바로 갱신할지를 설정한다.만약 false로 설정하면 톰켓을 다시                                    실행해야 추가한 소스 코드의 기능이 반영된다.

Context path(컨텍스트 패스)는 @@@자리에 온다.

locahost(자기 아이피):포트번호/@@@/파일명

 

 

 

 

 

톰캣 컨테이너에서 웹 어플리케이션 동작과정

 

  1. 웹 브라우저에서 Context(컨텍스트) 이름으로 요청
  2. 요청을 받은 톰캣 컨테이너는 요청한 컨텍스트 이름이 server.xml에 있는지 확인
  3. 해당 컨텍스트 이름이 있으면 컨텍스트 이름에 대한 실제 웹 어플리케이션이 있는 경로로 가서 요청한 파일명.html 을 웹 브라우저로 전송
  4. 웹 브라우저는 전송된 파일명.html을 브라우저에 나타냄

 

 

톰캣과 이클립스 연동

 

 

이클립스에서 하단에서 톰캣 서버를 연결하는 과정이 하는 의미

=> 이클립스와 톰캣을 연동하는 것이다.

==> 이클립스에 톰캣 컨테이너를 추가하면 project explorer에 servers 항목이 추가되면서 톰캣과 관련된 xml파일들이 생긴다.

 

 

 

 

Add and Remove 누르면 자동으로 이클립스에서 톰캣 컨테이너 server.xml에

 

<Context path="/프로젝트명" ~~

 

라는 코드를 자동으로 추가시켜준다.

 

=> 이클립스에서 만든 프로젝트를 톰캣 컨테이너에 등록하는 것이다.

 

 

 

 

 

 

이클립스에 탐캣을 연동(등록)하면 기존의 서버를 실행시키는 주요 파일들이

이클립스폴더 위에 한번 싹 복제가 된다.

 

C:\dev64\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0

 

여기 경로에 복사가 된다.

 

 

 

C:\dev64\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\webShop\WEB-INF\classes\sec01\ex01

 

위의 경로에는  .class 서블릿 파일의 위치를 확인할 수 있다.

 

 

 

 

 

 

C:\dev64\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\webShop\org\apache\jsp

 

여기 들어가면 우리가 방금 작성했던 요청된 jsp코드가 변환된 .java 파일과 .class 파일을 볼 수 있다.

 

 

 

 

 

프로젝트 실제 배포

 

이클립스로 만든건 실제로 어떻게 배포할까?

 

  1. .war 파일로 export 시킨다.
  2. export한 .war 파일을 Tomcat서버의 wepApps 폴더에 넣는다.

그러면 자동으로 톰캣이 .war 파일 압축을 해체함과 동시게 자동으로 컨텍스트로 등록한다.

 

 

 


 

 

서블릿이란?

 

서버 쪽에서 실행되면서 클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바 클래스이다.

 

 

내가 서블릿을 만들었으면 이걸 웹상에 등록을 해줘야 한다.

 

web.xml에 코딩해야 하는 부분

 

  <!-- 서블릿 등록부분 -->

 <servlet>
   <servlet-name>hello</servlet-name>
   <servlet-class>servlet.first.HelloServlet</servlet-class>
 </servlet>


  <!--등록한 서블릿 매핑 하는 부분  -->
  <!-- 외부 요청에 의해 등록된 서블릿을 찾게 해주는 역할 -->

  <servlet-mapping>
  	<servlet-name>hello</servlet-name>
  	<url-pattern>/hello</url-pattern>
  </servlet-mapping>

 

 

<load-on-startup>

 

서블릿은 생성자가 수행되고 HttpServlet 안에 init이라는 메서드가 무조건 수행되게 되어있다.

 

<load-on-startup> 에 0이상의 수가 오면 서블릿에 대한 인스턴스가 미리 생성된다.

서버를 키면 생성자와 init() 함수 까지 실행됨

요청을 해야 service가 수행됨

 

<load-on-startup>에 0미만의 수가 오면 서블릿에 대한 인스턴스가 미리 생성되지 않는다.

서버만 킨다고 아무 일도 일어나지 않음.

요청하면 생성자가 수행되고 메서드들이 실행됨

 

 

 

 

 

 

서블릿 동작과정

 

 

WAS = 웹 어플리케이션 서버

 

톰캣은은 webapp 밑에 있는 .jsp 파일을 찾아서 읽는것이다.

 

요청은  was컨테이너에 들어온 이후 계속 있는거다.
=> 그래서 저 생명주기 안에서 처음 요청이 도달한 서블릿에서 request, response를 매개변수로 넘기면서 request.getParameter를 쓸 수 있다고 생각하면 된다.
==>저 생명주기 안에서 request.getParameter()가 실행되고 그 값을 뱉어 준다고 생각하면 편하다.

.class 컴파일 된 후에 요청에서 넘어온 데이터를 넣는거다.

 

요청이 들어오면 HTTP요청 바디에 데이터가 날아오고 was가 어떤 jsp를 찾아야 할지 action 태그에 의해 알게 된다.

=> 데이터와 요청jsp 가 함께 was에 온다고 생각하면된다.

 

 

was에서 랜더링 과정을 거쳐서 웹서버에 보내주고

웹 서버에서 htttp 응답 바디에 담아서 웹 브라우저로 보내주는거다. 

 

서블릿의 특징

  • 서버쪽에서 실행되면서 기능을 수행
  • 쓰레드 방식으로 실행
  • 컨테이너에서 실행
  • 컨테이너 종류에 상관없이 실행(플랫폼 독립적)
  • 웹 브라우저에서 요청 시 기능을 수행

 

 

 

서블릿의 계층 구조

 

우리가 사용하는 서블릿이

HttpServlet을 상속받아 HTTP 프로토콜로 동작하는 웹 브라우저의 요청을 처리하는 서블릿이다.

 

 

HttpServlet 기능

  • HTTP 프로토콜을 사용하는 웹 브라우저에서 서블릿 기능을 수행
  • Service()가 호출되면서 요청 방식에 따라 doGet()이나  doPost()가 차례대로 호출된다.

참고)

HttpServlet 안에 service 라는 메서드가 있다.

service 메서드에서 요청이 어떤 타입인지 분석한 후 알맞게

doGet 또는 doPost를 호출해 준다.

 

 

서블릿 생명주기

 

 

서블릿도 자바 클래스이므로 실행하면 당연히 초기화 과정 그리고 메모리에 인스턴스를 생성하여 서비스를 수행한 후 다시 소멸하는 과정을 거친다.

 

생명주기 단계 호출메서드 특징
초기화 init() - 서블릿 요청 시 맨 처음 한 번만 호출
- 서블릿 생성 시 초기화 작업을 주로 수행
작업수행 doGet()
doPost()
- 서블릿 요청시 매번 호출
- 실제로 클라이언트가 요청하는 작업을 수행
종료 destroy() - 서블릿이 기능을 수행하고 메모리에 소멸될 때 호출
- 서블릿의 마무리 작업을 주로 진행

 

 

서블릿은 web.xml 또는  @Servlet(어노테이션)을 사용하여 등록할 수 있다.

 

 

 

 

렌더링 이라는 과정을 걸쳐서 html로 변환한다음 클라이언트(브라우저)로 보내준다.

이게 '응답'이라는 거다.

 

 

웹 브라우저는 '요청'과 '응답'으로 이루어져 있다.

 

 


 

 

오늘의 고민

 

 

서버를 키면 발생하는 일

 

was에서 web.xml 또는 @어노테이션을 읽어서 서블릿을 등록한다.