08. 서블릿 객체 생성과 실행 방법

강철의사나이·2021년 12월 27일
0

Nana servlet 클래스를 어떻게 호출, 실행할 것인가

Nana 자바 파일을 컴파일해서 클래스 파일로 만들었다.
클래스 파일을 어디에 둘 것인가?

클래스 파일은 WEB-INF / classes 안에 둔다.

만약 서블릿 클래스를 만들 때 패키지가 있었다.
com.lecture가 패키지 명이라면
classes 안에 com 폴더를 만들고 아래에 lecture를 만들어서 클래스 파일을 넣어야 함.

그렇다면 클래스 파일을 요청하겠다고 하면 어떻게 요청할까?
/ 홈 디렉터리에서 경로를 따라서
WEB-INF 안에 classes 안에 Nana를 url로 요청하면 될까?

주소를 입력해서 요청하면 실행이 안됨.
사용자가 요청하는 것도 문제고
요청해서 클래스 파일을 주는 것도 문제임
무엇보다 url을 입력한다고 해서 실행되지 않는다.
톰캣이 운영하는 홈 디렉터리에서 web-info는 특별한 의미를 갖는다.

web-/inf 안쪽은 사용자에 의해서 요청될 수 있는 디렉토리가 아니다.
안에 있는 자원들은 특수한 의미로 서버에서만 사용할 수 있고, 클라이언트는 그 내부를 볼 수도 없고 요청할 수도 없게 되어있다.
그래서 우리는 그 내부에 클래스 파일을 두는 것이다.

서버쪽에서만 사용할 수 있음.
클라이언트쪽에서 요청할 수도 볼 수도 없음
비공개영역임

특별한 방법으로 요청을 해야 한다.

사용자가 그러면 어떻게 요청해야 할까

위 사진에서 오른쪽에 있는 내용은
WAS라든지 웹서버, 톰캣만 알고 있으면 됨

사용자가 원하는 것을 말하면
프로그램 실행은 내가 하겠다는 의미로 받아들이자

만약 4를 요청하면 4에 매핑되는 서블릿 코드를 실행해서
결과를 돌려준다.

실제로 서블릿 코드가 nana.class 라도
사용자에게는 다른 이름으로 요청할 수 있게 한다.
그리고 url 형식으로 경로도 web-info가 아닌 다른 경로로 사용할 수 있게 지정할 수 있다.

servlet이라는 조각은 많이 모아두고 있지만, 이들은 classes 폴더에 있음

사용자에게 제공되는 servlet 이름은 hello임
따라서 사용자는 브라우저에 hello라고
http://loclahost/hello 를 요청하면

hello가 왔을 때 Nana가 실행되게 하겠다는 맵핑정보를 톰캣에 설정하면 된다.

그러면 사용자가 직접 Nana를 요청하는 것이 아닌 hello를 요청했을 때 톰캣이 그에 해당하는 서블릿 클래스인 Nana를 찾아서가 실행되도록 해준다.

이 설정을 한 후에 classes폴더에 Nana를 둔다.

위 폴더에 class 파일이 있다면 사용자에게 서비스할 수 없다.


톰캣 디렉토리에서 webapps/ROOT/WEb-INF에
classes폴더를 만들어서 Nana.class 파일을 넣어야지 사용자가 요청할 수 있게 해야 한다.


톰캣을 실행한 후

브라우저에서 실행한다.
localhost:8000/(WEB/ROOT에 있는 어떤 파일도 실행할 수 있다.)
위 파일은 WEB/ROOT에 있는 nana.txt파일을 실행함

위처럼 홈디렉토리에 있는 문서를 요청할 수 있다.

위 웹/루트 안에 있는 nana.txt파일을
WEB-INF에 붙여넣기 한 뒤 브라우저에서 실행하면
파일을 찾을 수 없다는 404오류가 발생한다.

이는 실제로 파일이 없어서 발생하는 것이 아닌
WEB/INF 폴더는 외부에서 절대 요청할 수 있는 디렉토리가 아니다.

따라서 앞으로 설정이나 프로그램 코드는 WEB-INF에 넣는다.

WEB-INF에 있는 nana.class를 요청하기 위해선
약속된 맵핑 방식으로 요청해야 한다.

WEB-INF에 있는 web.xml을 편집한다.

<servlet-mapping>
	<url-pattern>/hello</url-pattern>
hello라는 url 요청이 오면
	<servlet-name>na</serlvet-name>
na라는 서블릿을 실행해 달라

<servlet>
    <servlet-name>na</serlvet-name>
mappingd에서의 na 서블릿은 이 na라는 서블릿을 의미하고
    <servlet-class>Nana</servlet-class>
na의 서블릿은 이 Nana클래스를 의미한다.

서블릿이라는 클래스를 root에 뒀다.
만약 패키지명이 있다면(ex)com.newlecture)
com.newlectureNana라고 써준다.
(Nana클래스를 만들 때 패키지명을 안 뒀기 때문에 그냥 Nana를 사용한다.)

web.xml을 이렇게 수정한 뒤 톰캣 서버를 다시 실행하고

웹에서 localhost:8000/hello로 실행한다.
위에서 설정했듯이 실제로 hello라는 파일이 있는 것이 아니라
요청을 받는 웹서버는 파일을 찾아보고 was에 넘기면
was가 자기 맵핑 정보를 찾아서 hello를 찾고
거기에 맞는 서블릿 코드를 실행한다.


오류가 없고 아무것도 뜨지 않으면 성공
실행은 했지만 사용자에게 반환하는 어떤 출력도 입력한 것이 없다.

Nana.java를 보면
public void service(HttpServletRequest request
, HttpServletResponse response)
throws IOException, ServletException

코드가 실행 됐을 때 실행되는 내용은
System.out.println("hello Servlet");
콘솔에 hello Servlet을 출력하는 것이다.

사용자(클라이언트)에게 출력하는 것이 아니라
서버 쪽 콘솔에 출력하는 것이다.

우리가 원하는 것은 요청한 클라이언트에게 hello Servlet을 출력하고 싶다.

출력을 도와주는 도구가 지금까지 배운 내용이다.

0개의 댓글