Servlet과 JSP의 차이점과 구동 절차

ImOk·2021년 12월 9일
2

👩‍💻 웹 개발

목록 보기
8/14
post-thumbnail
post-custom-banner

JSPServlet은 둘 다 기본적으로 Java 프로그래밍 언어를 베이스로 둔다.

1. Servlet

  • 클라이언트 요청을 처리하고 그 결과를 다시 클라이언트에게 전송하는 servlet 클래스의 구현 규칙을 지킨 Server Side에서 돌아가는 JAVA 프로그램이다.
  • 웹 기반의 요청에 대한 동적인 처리가 가능한 하나의 클래스이다.
  • .java 파일에 코드를 작성하고, 그 코드 안에 html을 작성할 수 있는 클래스를 가져와 html 태그를 삽입한다.
  • java 코드 안에 html이 섞여 있기때문에 가독성이 떨어지고, 유지 보수가 힘들다.
  • 컴파일시 xx.java 파일이 xx.class로 변환


1-1 Servlet 구동 절차

  1. 클라이언트 요청이 들어오면 서블릿 컨테이너는 서블릿을 찾는다.
  2. 만약 서블릿이 없다면, 서블릿 클래스를 로딩하고, 인스턴스를 준비한 후 생성자를 호출한다. 그리고 서블릿 초기화 메서드인 init()을 호출한다.
  3. 클라이언트 요청을 처리하는 service() 메서드를 호출한다.
  4. service() 메서드에서 만든 결과를 HTTP 프로토콜에 맞추어 클라이언트에 응답하는 것으로 요청처리 완료한다.
  5. 만약 시스템 운영자가 서블릿 컨테이너를 종료하거나, 웹 어플리케이션을 종료한다면, 서블릿 컨테이너는 종료되기 전에 서블릿이 마무리 작업을 수행할 수 있도록 생성된 모든 서블릿에 대해 destroy() 메서드를 호출한다.

1-2 Servlet LifeCycle 예제

  1. init() : 서블릿 컨테이너가 서블릿을 생성한 후 초기화 작업을 수행하기 위해 호출하는 메서드
  2. service() : 클라이언트가 요철할 때 마다 호출되는 메서드. request/response를 처리하며, 요청이 GET인지 POST인지 구분해 doGet(), doPost()메소드로 분기된다.
  3. destroy() : 서블릿 종료 시 destroy() 메소드 실행
import java.io.IOException;
import javax.servlet.ServletConfig;
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 LifeCycle
 */
@WebServlet("/LifeCycle")
public class LifeCycle extends HttpServlet {
	private static final long serialVersionUID = 1L;

	int initCount = 1;
	int destroyCount = 1;
	int doGetCount = 1;

	public LifeCycle() {
		super();
		System.out.println("LifeCycle() 생성자 호출");
	}

	public void init(ServletConfig config) throws ServletException { // 서버 올라올 때 실행
		System.out.println("init() 호출: " + initCount++);
	}

	public void destroy() {
		System.out.println("destroy() 호출: " + destroyCount++);

	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().append("LifeCycle Servlet Test: ").append(request.getContextPath());
		System.out.println("doGet() 호출: " + doGetCount++);
	}

}

1-3 Servlet LifeCycle 실행💻

  1. url 접속 후 Servlet 요청 시 생성자 호출
  2. init() 호출
  3. 웹 브라우저 refresh 시 doGet() 계속 호출
  4. Servlet 종료 시 destroy() 호출


2. JSP(Java Server Page)

  • Java 언어를 기반으로 하는 Server Side 스크립트 언어
  • .jsp 파일에 html로 틀을 잡아 놓고 그 안에 java 코드를 삽입하는 형식
  • html 태그들이 틀을 잡아 주어 가독성이 보다 좋아지고, 복잡성이 줄어든다. 하지만 코드가 길어지면 이 역시 복잡해진다.
  • View 페이지를 나타낼 때 많이 사용
  • 컴파일 시 xx.jsp 파일이 컨테이너에 의해 xx_jsp.java로 변환되고, xx_jsp.class로 변환

2-1 JSP 구동 절차

  1. 클라이언트가 JSP를 실행해 달라고 요청하면, 서블릿 컨테이너는 서버에 작성된 JSP 파일에 대응하는 자바 서블릿을 찾아서 실행한다.
  2. 만약 JSP에 대응하는 서블릿이 없거나 JSP 파일이 변경되었다면, JSP 엔진을 통해 JSP 파일을 해석하여 서블릿 자바 소스를 생성한다.
  3. 서블릿 자바 소스는 자바 컴파일러를 통해 서블릿 클래스 파일로 컴파일된다. JSP 파일을 바꿀 때마다 이 과정을 반복한다.
  4. JSP로부터 생성된 서블릿은 서블릿 구동 방식에 따라 실행된다. 즉 service() 메서드가 호출되고, 출력 메서드를 통해 서블릿이 생성한 HTML 화면을 웹브라우저로 보낸다.

3. 마치며

View 부분을 개발하는 코드는 JSP 로 작성하고,
Controller 부분을 개발하는 코드는 Servlet 으로 작성한다.

🔗 MVC 아키텍쳐에 대한 정리 https://velog.io/@imok-_/MVCmodel-view-controller


🔗 참고 자료

https://gmlwjd9405.github.io/2018/10/28/servlet.html
https://1ambda.github.io/javascripts/rest-api-put-vs-post/
https://dmitripavlutin.com/variables-lifecycle-and-why-let-is-not-hoisted/

profile
ImOk👌
post-custom-banner

0개의 댓글