Servlet이란?
서블릿이란 자바를 사용하여 웹을 만들기 위해 필요한 기술이다.
클라이언트가 요청을 하면 그에 대한 결과를 다시 전송해주어야 하는데, 이러한 역할을 하는 것이 자바 프로그램이다.
서블릿은 정적인 웹페이지를 제공하는 웹 서버와 달리 다양한 요청을 통해 동적 페이지 웹 서비스를 제공하기위해서 WAS(웹 어플리케이션 서버)를 사용하는 기술이다.
서블릿은 조각나있는 서버 어플리케이션( Server Application Let )이며 수 많은 기능들이 따로 구현되어 있다.
- 사용자가 GET : /notice/list 를 요청하면 list라는 서블릿만 실행해서 결과를 보여준다.
- 사용자가 GET : /notice/del 를 요청하면 del이라는 서블릿만 실행해서 결과를 보여준다.
따라서 요청마다 각각 다른 처리가 이루어지므로 서블릿을 사용하면 전체 프로그램을 모두 실행시키는 것이 아닌 필요한 기능만 실행할 수 있다.
Servlet 특징
- 클라이언트 요청에 대해 동적으로 작동하는 웹 어플리케이션 컴포넌트
- HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 상속받음
- html을 사용하여 요청에 응답
- Java Thread를 이용해 동작
- MVC패턴에서 Controller로 이용
- 단점 : HTML 변경 시 Servlet을 재컴파일 해야함
WAS(웹 어플리케이션 서버) 란?
다양한 서버 내 알고리즘, 비즈니스 로직, DB 조회 등 클라이언트 요청에 따라 동적인 콘텐츠를 제공하는 서버, 프로그램이다. ex) Tomcat
WAS는 서블릿 컨테이너를 통해 여러 서블릿을 관리하는데 서블릿 컨테이너는 서블릿의 생성, 실행, 파괴를 담당한다.
서블릿 컨테이너는 클라이언트의 Request를 받아주고, Response를 할 수 있도록 웹 서버와 SeverSocket을 통해 통신하는데 Socket을 생성하고, 특정포트에 리스닝을 하고 있다가 연결요청이 들어오면 스트림을 생성한다.
Servlet 프로그램 만들기
서블릿은 보통 HttpServlet 클래스를 상속받아서 구현하는데 이 클래스는 웹 애플리케이션의 요청을 처리하기 위한 여러 메서드를 제공한다. 이 중에서도 가장 중요한 메서드는 service() 메서드이다. 서블릿 클래스들은 웹 애플리케이션 서버(WAS)가 시작될 때 메모리에 로드되며, 클라이언트의 요청이 들어오면 서블릿 컨테이너가 해당 요청을 처리하기 위해 적절한 서블릿의 service() 메서드를 호출한다.
자바 어플리케이션에서는 main() 메소드부터 호출되는 것처럼
자바 "웹" 어플레이케이션 ( Servlet 프로그램 ) 에서는 service() 함수가 먼저 호출된다.
과정
1. 메모장에 코드 입력 후 Nana.java파일로 저장, D드라이브 jsp폴더에 위치
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class Nana extends HttpServlet
{
public void service(HttpServletRequest request
, HttpServletResponse response)
throws IOException, ServletException
{
System.out.println("hello Servlet");
}
}
2. 컴파일
cmd창에서 해당 폴더로 디렉토리 이동후 Nana.java 컴파일
Java 컴파일러(javac)를 사용하여 Nana.java 파일을 컴파일하는 명령어
D:\jsp>javac -cp D:\dev\tools\apache-tomcat-9.0.86\lib\servlet-api.jar Nana.java
- -cp 옵션 : 클래스 패스(classpath)를 지정하는 옵션( 클래스 패스는 컴파일러나 실행 시점에 자바 컴파일러나 JVM이 클래스 파일을 찾을 때 사용하는 경로 )
- -cp 옵션을 사용하여 이 JAR 파일을 클래스 패스에 추가하면 컴파일러가 해당 JAR 파일에 있는 클래스들을 사용할 수 있다.
- 따라서 위의 명령어는 Nana.java 파일을 컴파일할 때 servlet-api.jar 파일을 클래스 패스에 추가하여 컴파일하는 것을 의미한다.
- 이렇게 함으로써 Nana.java 파일에서 서블릿 API에 관련된 클래스들을 사용할 수 있다.
class파일을 어떻게 요청하는가
클래스 파일은 만들면 보통 웹 애플리케이션의 클래스 경로(CLASSPATH)에 위치하고 이 경로에는 ROOT(/) WEB-INF/classes 가 포함된다.
따라서 WEB-INF/classes폴더를 만들고 그 안에 Nana.class가 위치하도록 한다.
톰캣이 운영하고 있는 ROOT(홈디렉토리)의 WEB-INF 폴더는 사용자(client)에 의한 요청이 절대 불가하다.
따라서 특별한 방법이 필요하다.
WAS는 사용자가 요청한 URL과 매핑된 Servlet코드를 찾아서 실행한다.
사용자가 요청할때는 Nana가 아닌 hello라는 이름으로 요청하고 톰캣이 이 요청과 매핑된 Nana클래스 파일을 실행시켜보자!
Servlet 객체 생성과 실행 과정
- D:\dev\tools\apache-tomcat-9.0.86\webapps\ROOT\WEB-INF 안에 classes폴더를 만들고 Nana.class를 복붙한다.
- D:\dev\tools\apache-tomcat-9.0.86\bin 에서 startup배치파일을 실행하여 톰캣을 실행한다.
- 브라우저 주소창에 localhost:8080/nana.txt 입력한다.
- D:\dev\tools\apache-tomcat-9.0.86\webapps\ROOT 에 있는 nana.txt를 복사해 D:\dev\tools\apache-tomcat-9.0.86\webapps\ROOT\WEB-INF 에 붙여넣기한다.
- 브라우저 주소창에 localhost:8080/WEB-INF/nana.txt 입력하면 404 에러가 발생한다.
- '톰캣이 운영하고 있는 홈디렉토리에서 WEB-INF 폴더는 사용자(client)의해서 요청될수 없다' 를 증명한다. 따라서 설정이나 프로그램 코드를 넣을때는 외부접근이 불가하도록 WEB-INF폴더 안에 넣는다.
- D:\dev\tools\apache-tomcat-9.0.86\webapps\ROOT\WEB-INF의 web.xml에서 매핑정보를 추가한다
클라이언트가 'hello'라는 url요청을 보내면
해당 서블릿인 이름인 'na'로 식별하고
'Nana'클래스를 로드하고 실행한다.
톰캣을 다시 실행하고 브라우저에 localhost:8080/hello를 입력한다. - 성공! - 서블릿코드 실행
하얀 화면이 나온 이유 : Nana 클래스의 System.out.println("hello Servlet");은 서버단에 출력된다.
참고 자료 출처 :
https://velog.io/@dh97k/%EC%84%9C%EB%B8%94%EB%A6%BF
https://mangkyu.tistory.com/14
https://www.youtube.com/watch?v=mjyygG7zp1c&list=PLq8wAnVUcTFVOtENMsujSgtv2TOsMy8zd&index=7
https://www.youtube.com/watch?v=jp7vtbLin-s&list=PLq8wAnVUcTFVOtENMsujSgtv2TOsMy8zd&index=8
'서블릿 JSP' 카테고리의 다른 글
입력 데이터 배열로 받기 (0) | 2024.02.21 |
---|---|
GET요청 & POST요청 & 서블릿 필터 (0) | 2024.02.20 |
Servlet 출력 형식의 이해 (0) | 2024.02.20 |
Annotation을 이용한 Servlet과 URL 매핑 (0) | 2024.02.20 |
Servlet 웹 입/출력 (0) | 2024.02.20 |