위로 아래

동적 웹페이지 제작을 위한 자바 애플리케이션

자바 애플릿 (java applet)

  1. 서블릿 이전, 웹을 동적으로 만들기 위해, 자바 애플리케이션을 통째로 웹 브라우저에 전송해, 자바 가상 머신을 탑재한 웹 브라우저가 이를 실행하도록 했다.
  2. 속도, 보안, 유연성 등의 한계가 있어서 서블릿 등장 후 사라졌다.

 

서블릿 (Servlet)

  1. 동적 웹 페이지 제작을 위한 웹 애플리케이션 프로그래밍 기술.
  2. 웹에서 들어온 요청과 돌려주어야 할 응답의 흐름을 간단한 메서드 호출만으로 다루는 기술.
  3. java 언어 사용. 서블릿은 자바 파일(.java)를 컴파일한 클래스 파일(.class)의 형태이다.
  4. 서블릿 콘테이너 (Servlet Container) : 서블릿들을 담고 있는 상자. 서블릿을 런타임을 한다. 서블릿의 생성, 실행, 삭제를 담당. 대표적으로 아파치 톰캣.
  5. html 코딩은 JSP가 낫기 때문에, UI 요소가 없는 제어 용도(MVC 중 Controller) 제작에 자주 쓰인다.
  6. UI 변수 선언 및 초기화가 선행되어야 한다.

 

JSP (Java Server Page)

  1. 동적이라 하더라도 어차피 웹페이지 출력은 html인데, 서블릿은 java 중심의 코드를 사용해 코딩이 어렵다. JSP는 html을 기본으로, 필요한 부분에서만 스크립트 형식으로 java를 사용한다.
  2. 웹 컨테이너가 JSP 파일(.jsp)을 java파일(.java)로 변환 후, 컴파일을 통해 서블릿 파일(.class)로 변환하여 웹 서버에 돌려준다.
  3. html 기반이어서 출력 결과물을 만들기 용이한 편이라, MVC 중 View를 만들 때 사용.
  4. 자주 쓰이는 기능을 내장 객체로 제공하여 즉시 사용 가능.
  5. 서블릿 파일로 컴파일하기 때문에, 서블릿의 기능도 사용 가능.

 

 


서블릿

특징

  1. 서블릿도 자바 클래스이다.
  2. webapp 폴더 말고 java 폴더에 만든다.
  3. 일반 자바프로그램과 달리 독자적으로 실행되지 못하고 톰캣과 같은 JSP/Servlet 컨테이너에서 실행된다.
  4. 서블릿이 중요한 이유 : 자바 진영에서 사용되는 대부분의 framework의 기본 원리는 servlet 구조를 가지고 있다 (클라이언트의 요청 정보를 외부에 노출시키지 않고 전달 받아 처리한 후 아무도 모르게 다시 클라이언트에게 전달되는 구조)
  5. 서블릿은 View부분과 Control부분을 독립해서 작업할 수 있는 기본적인 구조를 만들어 준다.
  6. 스레드 방식으로 실행
  7. init으로 시작해서 destroy로 끝난다. (init, get, post, destroy 크게 4가지 종류)
  8. HTML form태그에서 method가 get 방식으로 서블릿을 호출하면 doGet 메소드로 들어간다
  9. HTML form태그에서 method가 post 방식으로 서블릿을 호출하면 doPost 메소드로 들어간다.
  10. HttpServlet 클래스는 GenericServlet 클래스를 상속 받고, GenericServlet 클래스는 Servlet, ServletConfig 인터페이스를 구현한다.
  11. GenericServlet은 여러 프로토콜에서 다 쓸 수 있고, HttpServlet은 HTTP만 쓸 수 있다.
  12. 요청과 응답에 관련된 API는 javax.servlet.http 패키지에 있다.

HttpServlet 클래스

  1. HTTP 프로토콜 기반으로 브라우저로부터 요청을 전달 받아 처리하는 클래스.
  2. 서블릿 클래스 작성 시 HttpServlet 클래스를 상속 받도록 한다.

 

MVC 모델에서의 서블릿

  1. 서블릿은 MVC 모델 중 controller 역할.
  2. MVC 모델에서 Model 부분은 분리하는데 어려움이 없지만, View와 Control 부분의 분리는 쉽지 않다. 두 부분은 직간접적인 연결 고리가 있어야 하기 때문에.
  3. MVC를 분리해야하는 이유 : 혼자 프로젝트 개발을 할 때에는 혼자서 UI도 만들고 제어 코드도 짜고 서버셋팅과 데이터베이스 설계도 하니까 분리할 필요가 없다. 그러나 실무에서는 디자이너, 퍼블리셔, 스크립터, 코더, 개발자, 시스템 운영자, DB 설계자 등 다양한 직무의 사람들이 모여 하나의 프로젝트에 참여하기에 최대한 서로 독립적인 개발 환경을 만들어주어야 한다.

 

JSTL 라이브러리(Java Standard Tag library) 

데이터를 표현할 때 개발 코드 유형이 아닌 HTML 태그 유형으로 쉽게 데이터를 표현할 수 있게 해주어 View와 Model을 분리하는데 도움을 준다. 

 

서블릿 쓰던 시절 코드 예시

더보기
package ex1;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class HelloServlet
 */
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
		response.getWriter().append("-doGet.");
		}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//doGet(request, response);
		response.getWriter().append("-doPost.");
	}

}

확인은 아래 걸로

----------스크린 띄우기 위한 JSP (서블릿 아님. 확인용임.)-----------

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

    <%
    out.print("안녕");
    System.out.println("Hello");
    %>
    
    <form method="post" action="./h">
    	<input type="submit" value="post 전송">
    </form>
    <form method="get" action="./h">
    	<input type="submit" value="get 전송">
    </form>

 

 

 

 


JSP/Servlet 컨테이너

서블릿은 스스로 작동하는 것이 아니라, 관리해주는 그릇이 필요한데, 이를 서블릿 컨테이너라고 부른다.

 

특징

  1. 웹 서버와 통신 지원
    1. web 서버와 통신하기 쉽게 해준다
    2. 여러 API를 제공하여 복잡한 과정을 생략하게 해준다.
  2. 멀티스레딩 지원
    1. 컨테이너는 요청마다 새로운 자바 쓰레드를 생성한다
    2. 메소드를 다 실행하고 나면 스레드를 알아서 소멸시킨다
  3. 생명주기 관리
  4. 보안 관리
    1. 보안 관련된 내용이 보안관리 XML 배포 서술자에 기록된다.
    2. 보안 관련된 내용을 서블릿이나 자바 클래스에 구현해 놓치 않아도 된다.
    3. 수정할 일이 

 

스레드

  1. 프로세스 : 메모리 상에서 실행 중인 프로그램. 최소 하나의 스레드를 보유하고 있다.
  2. 스레드 : 프로세스 안에서 실행되는 흐름 단위. 프로세스보다 크기가 작아, 시간이 적게 걸린다.

 

동작 방식

  1. 클라이언트가 서블릿에 요청을 하면 Http Request가 컨테이너(톰캣, WAS)로 전송된다.
  2. 컨테이너는 사용자 요청이나 응답에 대한 HttpServletRequest 객체와 HttpServletResponse 객체를 생성한다.
  3. 컨테이너는 URL에 맞는 서블릿을 고른 뒤, 스레드를 생성한다. 스레드에 Request 객체와 response 객체를 전달한다.
  4. 개별 스레드에서 service() 메소드를 호출한다. service() 메소드는 다시 doGet()이나 doPost() 같은 메소드를 호출한다.
  5. doGet() 메소드는 동적 페이지를 생성하고, 이를 response 객체에 붙여준다.
  6. 스레드가 수행을 완료하면 컨테이너는 response 객체를 HTTP response로 변경하고 이를 클라이언트에게 반환한다.
  7. 이후 사용을 다 한 request와 response 객체는 제거한다.

 

 

종류

  1. 톰캣 : 무료
  2. JEUS : 유료
  3. Web Logic : 유료
  4. JBOSS

 

 

 


서블릿(Servlet) 계층 구조

  1. Servlet 인터페이스
    1. javax.servlet 패키지에 선언되어 있다
    2. Servlet 관련 추상 메소드 선언
    3. init(), service(), destroy(), getServletInfo(), getServeltConfig() 등
  2. ServletConfig 인터페이스
    1. javax.servlet 패키지에 선언되어 있다
    2. Servlet 기능 관련 추상 메소드 선언
    3. getInitParameter(), getInitParameterNames(), getServletContext(), getServletName() 등
  3. GenericServlet 클래스
    1. javax.servlet 패키지에 선언되어 있다
    2. 일반적인 서블릿 기능을 구사한다.
    3. 상위 두 인터페이스를 구현한 구현 클래스
    4. GenericSerblet을 상속받아 구현한 사용자 서블릿은 사용되는 프로토콜에 따라 각각 service()를 오버라이딩해서 구현
  4. HttpServlet 클래스
    1. javax.servlet.http 패키지에 선언되어 있다
    2. GenericServlet 클래스를 상속 받아서 HTTP 프로토콜에서 사용하는 오버라이딩을 거쳐 HTTP 프로토콜에 맞는 서블릿 기능을 수행한다.
    3. 요청 시 service()가 호출되면서 요청 방식에 따라 doGet(), doPost()가 차례대로 호출된다.

 

 

 


서블릿의 동작 과정

HttpServlet 주요 메소드

//request를 public service()에서 전달받아 doXXX() 메소드를 호출
protected Service (HttpServletRequest req, HttpServletResponse resp)

// 클라이언트의 request를 protected service()에게 전달
public Service (HttpServletRequest req, HttpServletResponse resp)

//서블릿이 GET request를 수행하기 위해 service()를 통해서 호출
protected doGet (HttpServletRequest req, HttpServletResponse resp)

//서블릿이 POST request를 수행하기 위해 service()를 통해서 호출
protected doPost (HttpServletRequest req, HttpServletResponse resp)

//서블릿이 Delete request를 수행하기 위해 service()를 통해서 호출
protected doDelete (HttpServletRequest req, HttpServletResponse resp)

//서블릿이 Head request를 수행하기 위해 service()를 통해서 호출
protected doHead (HttpServletRequest req, HttpServletResponse resp)

 

서블릿의 생명 주기 (Servlet Life Cycle)

  1. 서블릿 생명 주기 : 서블릿 실행 단계마다 호출되어 기능을 수행하는 콜백 메소드
    1. 서블릿도 자바 클래스. 실행하면 초기화 과정, 메모리에 인스턴스 생성, 서비스 수행, 메모리에서 제거 되는 과정을 거친다.
    2. 이런 과정을 거칠 때마다, 서블릿 생명 주기에 따르는 메소드들을 호출해서 초기화, 데이터베이스 연동, 마무리 작업 등을 수행
  2. init() 메소드 : 서블릿 요청 시 맨 처음 한 번만 호출. 초기화 작업.
  3. service() 메소드 : 서블릿 요청이 있을 때마다 재사용되어 호출.  실제로 클라이언트가 요청하는 작업 수행 (재정의 가능)
    1. 요청방식 : 메소드
    2. GET : doGet(request,response)
    3. POST : doPost(request,response)
    4. PUT : doPut(request,response)
    5. DELETE : doDelete(request,response)
    6. HEAD : doHead(request,response)
    7. OPTIONS : doOptions(request,response)
    8. TRACE : doTrace(request,response)
  4. destory() 메소드 : 서블릿이 기능을 수행하고 메모리에서 소멸될 때 호출. 마무리 작업 수행.