백앤드 개념1 - Servlet
Web Architecture
- Web Browser : Markup, HTML, XML, CSS, Script(JS, Flash)
- HTTP stateless : connect -> request -> response -> disconnect
- script언어들은 데이터 베이스에 직접적 접근이 어렵다.
- 웹에서 페이지를 이동하는 방식 2가지 : get, post, put, delete 등
- 서버 : Web Server, Web Application Server(WAS)
- Web Server : Apache
- WAS : Servlet, JSP
Servlet
- Server Side Applet의 약어
- 웹 서버, 즉 웹 컨테이너에서 수행되는 JAVA 클래스
특징
- 서버의 응용 프로그램을 구현하는 기술로서 서버 프로토콜 종류에 관계없이 FTP, SMTP, HTTP 등 여러가지 애플리케이션 기반의 응용 프로그램을 개발할 수 있다.
- 서블릿은 클라이언트의 요청에 대하여 서블릿 컨테이너에 의해 독립된 스레드 기반으로 서비스가 되는 기술로서 다중 스레드 서비스가 기본적으로 제공된다. 그러므로 프로세스 기반의 서비스인 CGI에 비해 수행속도가 빠르다.
- 서블릿 컨테이너는 클라이언트에서 전송되는 서블릿 요청과 응답에 대한 처리를 담당한다.
Servlet API
- javax.servlet package
- javax.servlet.http package
Servlet LifeCycle
method | description |
---|---|
init() | 서블릿이 메모리에 로드 될 때 한번 호출. 코드 수정으로 인해 다시 로드 되면 다시 호출. |
doGet() | GET방식으로 데이터 전송 시 호출. |
doPost() | POST방식으로 데이터 전송 시 호출. |
service() | 모든 요청은 service()를 통해서 |
destory() | 서블릿이 가비지 컬렉션(gabage collection : gc)가 되기 전에 마지막으로 수행해야할 작업이 있다면 destory()에 정의 |
- 서블릿에서는 ServletRequest 객체를 이용하여 요청을 처리하고 응답에 해당하는 결과 페이지를 ServletResponse 객체에서 얻은 PrintWriter 객체를 통해서 출력한다.
Servlet에서의 parameter 처리
GET | POST | |
---|---|---|
특징 | 전송되는 데이터가 URL뒤에 QueryString으로 전달. 입력 값이 적은 경우나 데이터가 노출이 되도 문제가 없을 경우 사용. |
URL과 별도로 전송. HTTP header 뒤 body에 입력 스트림 데이터로 전달. |
장점 | 간단한 데이터를 빠르게 전송. form tag뿐만 아니라 직접 URL에 입력하여 전송 가능. |
데이터의 제한이 없다. 최소한의 보안 유지 효과를 볼 수 있다. |
단점 | 데이터 양에 제한이 있다. (location bar(URL+parameters))를 통해 전송할 수 있는 데이터의 사이즈는 2KB(2048 byte)로 제한된다. |
전달 데이터의 양이 같을 경우 GET방식보다 느리다. (전송 패킷을 body에 데이터를 구성해야 하므로) |
- 로직적으로 두 방식은 같지만 내부적인 데이터 처리 방식이 다르다.
- curl이 설치된 폴더로 이동 후 아래 명령어 입력
curl -X POST localhost:8080/WebBoard/GetPostServlet
curl -X GET localhost:8080/WebBoard/GetPostServlet
GetPostServlet.java
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;
@WebServlet("/GetPostServlet")
public class GetPostServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append("doGet() is called");
System.out.println("doGet() is called");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append("doPost() is called");
System.out.println("doPost() is called");
}
}
Leave a comment