본문 바로가기
서블릿 JSP

Servlet 프로그램 만들기

by 영카이브 2024. 2. 20.

 

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

  1. -cp 옵션 : 클래스 패스(classpath)를 지정하는 옵션( 클래스 패스는 컴파일러나 실행 시점에 자바 컴파일러나 JVM이 클래스 파일을 찾을 때 사용하는 경로 )
  2. -cp 옵션을 사용하여 이 JAR 파일을 클래스 패스에 추가하면 컴파일러가 해당 JAR 파일에 있는 클래스들을 사용할 수 있다.
  3. 따라서 위의 명령어는 Nana.java 파일을 컴파일할 때 servlet-api.jar 파일을 클래스 패스에 추가하여 컴파일하는 것을 의미한다.
  4. 이렇게 함으로써 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 객체 생성과 실행 과정

  1. D:\dev\tools\apache-tomcat-9.0.86\webapps\ROOT\WEB-INF 안에 classes폴더를 만들고 Nana.class를 복붙한다.
  2. D:\dev\tools\apache-tomcat-9.0.86\bin 에서 startup배치파일을 실행하여 톰캣을 실행한다.
  3. 브라우저 주소창에 localhost:8080/nana.txt 입력한다.
  4. D:\dev\tools\apache-tomcat-9.0.86\webapps\ROOT 에 있는 nana.txt를 복사해 D:\dev\tools\apache-tomcat-9.0.86\webapps\ROOT\WEB-INF 에 붙여넣기한다.
  5. 브라우저 주소창에 localhost:8080/WEB-INF/nana.txt 입력하면 404 에러가 발생한다.
  6.  '톰캣이 운영하고 있는 홈디렉토리에서 WEB-INF 폴더는 사용자(client)의해서 요청될수 없다' 를 증명한다. 따라서 설정이나 프로그램 코드를 넣을때는 외부접근이 불가하도록 WEB-INF폴더 안에 넣는다. 
  7. 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