JSP와 Servlet은 둘 다 기본적으로 Java 프로그래밍 언어를 베이스로 둔다.
- 클라이언트 요청을 처리하고 그 결과를 다시 클라이언트에게 전송하는 servlet 클래스의 구현 규칙을 지킨 Server Side에서 돌아가는 JAVA 프로그램이다.
- 웹 기반의 요청에 대한 동적인 처리가 가능한 하나의 클래스이다.
.java
파일에 코드를 작성하고, 그 코드 안에 html을 작성할 수 있는 클래스를 가져와 html 태그를 삽입한다.- java 코드 안에 html이 섞여 있기때문에 가독성이 떨어지고, 유지 보수가 힘들다.
- 컴파일시
xx.java
파일이xx.class
로 변환
- 클라이언트 요청이 들어오면 서블릿 컨테이너는 서블릿을 찾는다.
- 만약 서블릿이 없다면, 서블릿 클래스를 로딩하고, 인스턴스를 준비한 후 생성자를 호출한다. 그리고 서블릿 초기화 메서드인
init()
을 호출한다.- 클라이언트 요청을 처리하는
service()
메서드를 호출한다.service()
메서드에서 만든 결과를 HTTP 프로토콜에 맞추어 클라이언트에 응답하는 것으로 요청처리 완료한다.- 만약 시스템 운영자가 서블릿 컨테이너를 종료하거나, 웹 어플리케이션을 종료한다면, 서블릿 컨테이너는 종료되기 전에 서블릿이 마무리 작업을 수행할 수 있도록 생성된 모든 서블릿에 대해
destroy()
메서드를 호출한다.
- init() : 서블릿 컨테이너가 서블릿을 생성한 후 초기화 작업을 수행하기 위해 호출하는 메서드
- service() : 클라이언트가 요철할 때 마다 호출되는 메서드.
request/response
를 처리하며, 요청이 GET인지 POST인지 구분해doGet()
,doPost()
메소드로 분기된다.- 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++);
}
}
- url 접속 후 Servlet 요청 시 생성자 호출
init()
호출- 웹 브라우저 refresh 시
doGet()
계속 호출- Servlet 종료 시
destroy()
호출
- Java 언어를 기반으로 하는 Server Side 스크립트 언어
.jsp
파일에 html로 틀을 잡아 놓고 그 안에 java 코드를 삽입하는 형식html
태그들이 틀을 잡아 주어 가독성이 보다 좋아지고, 복잡성이 줄어든다. 하지만 코드가 길어지면 이 역시 복잡해진다.- View 페이지를 나타낼 때 많이 사용
- 컴파일 시
xx.jsp
파일이 컨테이너에 의해xx_jsp.java
로 변환되고,xx_jsp.class
로 변환
- 클라이언트가 JSP를 실행해 달라고 요청하면, 서블릿 컨테이너는 서버에 작성된 JSP 파일에 대응하는 자바 서블릿을 찾아서 실행한다.
- 만약 JSP에 대응하는 서블릿이 없거나 JSP 파일이 변경되었다면, JSP 엔진을 통해 JSP 파일을 해석하여 서블릿 자바 소스를 생성한다.
- 서블릿 자바 소스는 자바 컴파일러를 통해 서블릿 클래스 파일로 컴파일된다. JSP 파일을 바꿀 때마다 이 과정을 반복한다.
- JSP로부터 생성된 서블릿은 서블릿 구동 방식에 따라 실행된다. 즉
service()
메서드가 호출되고, 출력 메서드를 통해 서블릿이 생성한 HTML 화면을 웹브라우저로 보낸다.
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/