[Servlet / JSP] 서블릿(Servlet)

suyeon·2022년 6월 20일
0

Servlet / JSP

목록 보기
3/9
post-thumbnail

📌 디렉토리 구조

  • src/main/java : 자바(서블릿) 소스 폴더
  • src/main/webapp : JSP 소스 파일 / 콘텐츠 폴더(HTML, CSS, JavaScript, 이미지 등..) > 정적파일
  • src/main/webapp/WEB-INF : 서버 관련 설정 파일
  • src/main/webapp/WEB-INF/lib : *.jar 관리 폴더
  • src/main/webapp/WEB-INF/web.xml : 사이트 설정 파일

💬 배포 서술자(web.xml)
웹 애플리케이션의 환경설정 정보를 담은 파일.
WAS가 처음 구동될 때 이 파일을 읽어 설정 내용을 톰캣에 적용한다.

📌 Servlet(서블릿)

  • 웹 서버측(사이트)에서 동적인 페이지를 자바로 구현한 서버측 프로그램
  • 서버 측에서 실행. 클라이언트의 요청을 받으면 서버에서 처리한 후, 응답으로 결괏값만 보내주는 구조
  • 자바 진영의 첫번째 웹 기술

[ 특징 ]

  • 클라이언트의 요청에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트이다.
  • MVC 모델에서 컨트롤러 역할을 한다.
  • 모든 메서드는 스레드로 동작된다.
  • javax.servlet.http 패키지의 HttpServlet 클래스를 상속받는다.

📌 서블릿 컨테이너

  • 동적 웹 페이지 방식에서의 '전처리' 부분을 서블릿이 담당한다.
  • 서블릿은 자바 파일(.java)을 컴파일한 클래스 파일(.class) 형태이며, 이를 실행하고 관리해주는 런타임을 서블릿 컨테이너라고 한다.
  • 서버에 만들어진 서블릿이 스스로 작동하는 것이 아니라, 서블릿을 관리해주는 것이 필요한데, 이러한 역할을 하는 것이 바로 서블릿 컨테이너다.
  • 대표적으로 아파치 톰캣(Apahce Tomcat)이 있다.

[ 역할 ]

  1. 통신 지원
  • 클라이언트와 통신하려면 서버는 특정 포트로 소켓을 열고 I/O 스트림을 생성하는 등 복잡한 과정이 필요하다. 서블릿 컨테이너는 이 과정을 간단히 해주는 API를 제공한다.
  1. 생명주기 관리
  • 서블릿을 인스턴스화 후 초기화하고, 요청에 맞는 적절한 메서드를 호출한다. 응답한 후에는 가비지 컬렉션을 통해 객체를 소멸시킨다.
  1. 멀티스레딩 관리
  • 서블릿 요청들은 스레드를 생성해 처리한다. 즉, 멀티스레드 방식으로 여러 요청을 동시에 처리할 수 있다.
  1. 선언적인 보안 관리 및 JSP 지원
  • 보안 기능을 지원하므로 별도로 구현하지 않아도 된다.

📌 서블릿의 처리 동작 순서

  • 서블릿 생성 ~ 클라이언트 요청(Request) ~ 클라이언트 응답(Response) ~ 서블릿 소멸

  1. 클라이언트 요청
  2. HttpServletRequest, HttpServletResponse 객체 생성
  3. Web.xml이 어느 서블릿에 대해 요청한 것인지 탐색
  4. 해당하는 서블릿에서 service() 메소드 호출
  5. doGet() 또는 doPost() 호출
  6. 동적 페이지 생성 후 ServletResponse 객체에 응답 전송
  7. HttpServletRequest, HttpServletResponse 객체 소멸

📌 Servlet 작성 규칙

1. 서블릿 클래스 선언

방법1) javax.servlet.Servlet 인터페이스를 구현한다. (고비용, 복잡함)
방법2) javax.servlet.http.HttpServlet 클래스를 상속받는다. (저비용, 간편함 ) -> 주로 사용

2. doGet/doPost 메소드 선언

  • 둘 중 하나 선언 or 둘 다 선언
  • 클라이언트(브라우저)의 요청이 들어오면, 서버측에서 자동으로 호출되는 메소드 (콜백 메소드)
  • 동적으로 HTML 페이지를 만드는 역할
  • 메소드 작성 규칙
  1. 매개변수 작성
    a. javax.servlet.http.HttpServletReqeust
    b. javax.servlet.http.HttpServletResponse
  2. 예외 미루기
    a. java.io.IOEception : 페이지를 동적으로 만드는 작업(외부 입출력 발생)
    b. javax.servlet.ServletException : 서블릿과 관련 예외 처리

3. 동적 HTML 페이지 작성 구현

  • doGet/doPost 내부에서 문서를 작성하기 위한 코드를 작성한다.
  • HttpServletResponse 객체의 getWriter() 메소드 호출하면 PrintWriter 객체를 반환한다.
  • PrintWriter 객체의 printXXX() 메소드를 사용해서 동적으로 클라이언트 코드를 작성한다.(=BufferedWriter 역할)
  • 페이지 완성 > 브라우저에게 서비스(반환)

4. 브라우저가 자바 파일(서블릿)을 호출한다.

  • 자바는 웹 기술이 아니다.
  • 브라우저를 통해서 자바 파일을 실행할 수 없다.
  • 브라우저가 웹 상에서 자바 파일을 호출할 수 있도록 가상 주소를 생성해서 서블릿에게 매핑을 해야 한다.
  • webapp > WEB-INF > web.xml에서 매핑
<servlet>
   <servlet-name>HelloWorld</servlet-name> // servlet 이름
   <servlet-class>jwprj.servlet.HelloServlet</servlet-class> // 서블릿 클래스가 들어있는 경로
</servlet>

<servlet-mapping>
   <servlet-name>HelloWorld</servlet-name> // 서블릿 이름 (위와 같아야함)
   <url-pattern>/hello</url-pattern>  // 서블릿 요청 주소 매핑
</servlet-mapping>

[ 예제 ]

// 1. 서블릿 클래스 선언
//	방법1. javax.servlet.Servlet 인터페이스를 구현한다.
//	방법2. javax.servlet.http.HttpServlet 클래스를 상속받는다.
public class Ex02 extends HttpServlet {
	
	// 2. doGet/doPost 메소드 선언
	//	a. 매개변수 작성
	//		1. java.servlet.http.HttpServletRequest
	//		2. java.servlet.http.HttpServletResponse
	//	b. 예외 미루기
	//		1. java.io.IOException
	//		2. java.servlet.ServletException

	public void doGet(HttpServletRequest request, HttpServletResponse response) 
    		throws IOException, ServletException {
		
		// 한글 깨짐 > UTF-8
		response.setCharacterEncoding("UTF-8");
		
		
		// 3. 동적 HTML 페이지 작성 구현
		PrintWriter writer =  response.getWriter();
		
		writer.println("<html>");
		writer.println("<head>");
		writer.println("<meta charset='UTF-8'>");
		writer.println("</head>");
		writer.println("<body>");
		writer.println("<h1>서블릿</h1>");
		writer.println("<p>서블릿으로 만든 동적 웹페이지입니다.</p>");
		writer.println("</body>");
		writer.println("</html>");
		
		writer.close(); // 이 작업을 안하면 페이지가 안 만들어진다.
		
		// 4. 브라우저가 자바 파일(서블릿)을 호출한다.
		// 자바는 웹을 지원하지 않는다!!!
		// - http://localhost:8090/ServletTest/servlet/com.test.servlet.Ex02
		
		// - http://localhost:8090/ServletTest/aaa
		
		// * 이클립스
		// - 서블릿에서 Ctrl + F11을 누르면 이클립스가 해당 서블릿에 매핑되어 있는 가상 주소를 대신 브라우저를 통해서 호출해준다.
	}
}
<!-- web.xml -->
  <servlet>
  	<servlet-name>ex02</servlet-name>
  	<servlet-class>com.test.servlet.Ex02</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>ex02</servlet-name>
  	<url-pattern>/ex02.do</url-pattern>
  </servlet-mapping>

참고 자료
🔗 성낙형의 JSP 자바 웹 프로그래밍

0개의 댓글