백엔드 01 - Servlet

JeongEun Kim·2023년 4월 2일
1

Back-end

목록 보기
1/4

Web Architecture

클라이언트에서 데이터 발생 : Get, Post 형식으로 발생됨.
이 때, form에다가 post로 지정하지 않는 것은 모두 get 방식이라고 보면 됨


웹 프로젝트의 구조


META : 톰캣에게 전달해줄 것들 저장하는 폴더
WEB-INF : 내 서버 내에서 사용할 것들 저장


서블릿

서블릿이란?

자바 서블릿(Java Servlet)이란, 자바를 이용해 웹페이지를 동적으로 생성하는 서버측 프로그램, 또는 그 사양을 말한다.
웹 서버 성능 향상을 위해 사용하는 자바 클래스의 일종이며 JSP와 비슷한 면이 있지만, JSP가 HTML 안에 자바 코드를 포함한 것이라면, 서블릿은 자바 코드 안에 HTML을 포함한 것이란 차이가 있다.


Application + let(작은 앱 파일) = applet
servlet = server + aaplet
즉, 서블릿은 서버 안에서 작게 동작하는 프로그램이라 할 수 있다.

서블릿의 동작

서블릿의 동작 흐름


서블릿이 하는 일은 크게
1. 데이터 받기
2. 비즈니스 로직
3. 페이지로 response

서블릿 API


대표적인 두가지 서블릿이다.
추상클래스이며, service() 메소드는 구현이 필요하다.
GenericServlet
서블릿의 보다 일반적이고 공통적인 기능 포함
들어오는 메소드에 따라 구분이 없으며, 메소드를 따지지 않고 업무를 처리함
HttpServlet
Generic+Http 통신에 특화된 기능
클라이언트에 들어오는 것마다 다른 방식으로 작동하는 것 구현 가능
따라서 HttpServlet이 더 많이 쓰인다

서블릿의 기본 코드

import java.io.IOException;
import java.io.PrintWriter;

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

//아래가 url이라고 보면 됨, 파일 생성 후 바꿔도 됨
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//getWriter 위에 있어야함, 없으면 한글 깨짐
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		out.print("<html>");
		out.print("	<body>");
		out.print("Hello Servlet!");
		out.print("안녕 서블릿!");
		out.print("	</body>");
		out.print("</html>");
	}
}



서블릿의 Life-Cycle

서블릿 클래스는 main method가 존재하지 않는다. 즉, 객체의 생성부터 사용의 주체가 사용자가 아닌 Servlet Container에 있다.
Client가 요청(request)를 하면 Servlet Container는 Servlet 객체를 단 한번만 생성하고, 한번만 초기화하며 요청에 대한 처리를 한다. 서블릿의 제거 또한 Container가 담당한다.

서블릿의 라이프 싸이클의 주요 method


클라이언트가 접근되면 서비스가 호출된다.
init()
서블릿이 메모리에 로드 될 때 한 번 호출
코드 수정으로 다시 로드되면 다시 호출된다.
doGet()
GET 방식으로 데이터 전송 시 호출
doPost()
POST 방식으로 데이터 전송 시 호출
service()
모든 요청은 service()를 통해 doXXX() 메소드로 이동
destroy()
서블릿이 메모리에서 해제되면 호출
코드가 수정될 때도 호출된다. 서버가 다운되기 전에 호출되며, 매번 호출되는 건 아니다.

서블릿의 라이프 싸이클 확인 코드

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("/life")
public class LifeCycle extends HttpServlet {
	public LifeCycle() {
		super();
		System.out.println("lifeCycle call");
	}
	
	//링크로 오는 건 다 get
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
		System.out.println("service call");
	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		super.destroy();
		System.out.println("destroy Call");
	}

	@Override
	public void init() throws ServletException {
		// TODO Auto-generated method stub
		super.init();
		System.out.println("inti call");
	}
}

해당 코드의 출력
lifeCycle call
inti call
service call
service call
service call
(만약 reload 할 때 destroy가 호출됨)


서블릿의 파라미터 처리

파라미터 전송 방식

GET과 POST 방식 비교

GETPOST
특징전송되는 데이터가 URL 뒤에 Query String으로 전달.
입력값이 적은 경우나 데이터가 노 출이 되어도 문제가 없을 시 사용.
URL과 별도로 전송.
HTTP header 뒤 body에 입력 스트림 데이터로 전달.
장점간단한 데이터를 빠르게 전송.
form tag뿐만 아니라 직접 URL에 입력하여 전송 가능.
데이터의 제한이 없음.
최소한의 보안 유지 효과를 볼 수 있음.
단점데이터 양에 제한이 있음.
보안이 취약함.
전달 데이터의 양이 같을시, GET보다 느림.(body에 데이터를 구성해야 하기 때문에)

URL과 Query String, Parameter

? 이전까지를 URL이라 하고, ? 이후로 Query String이 시작된다. 맨 처음 파라미터 이름, =, Value 순서대로 배치되며, 파라미터가 여러개일 시 &로 연결된다.

0개의 댓글