플레이데이터 - 21일차 Servlet 공부

Kim Hyen Su·2023년 7월 28일

🎇Servlet

🐽 HTTP

  • Hyper Text Transfer Protocol
  • 서버와 클라이언트 간에 데이터를 주고 받는데 기반이 되는 프로토콜
* 요청
웹 브라우저 ➡️ HTTP 요청 ➡️ 웹서버 ➡️ 데이터 조회 ➡️ DB

* 응답
DB ➡️ 데이터 반환 ➡️ 웹서버 ➡️ 웹페이지 구성 ➡️ HTTP 응답 ➡️ 웹브라우저

HTTP 요청

  • 웹서비스 요청을 위해 URL 구성
  • 기본 구성 : http://localhost8080/ <파일 경로>
  • 파일 경로 : 프로젝트명/요청페이지명.html(.jsp) <쿼리 스트링>
  • 쿼리 스트링 : GET 방식의 요청 메서드를 갖는 form에서 사용자가 입력한 파라미터 리스트.
    - name = value 형태

HTTP 응답

  • 요청된 웹페이지(파일) 확장자에 따라 처리한 결과를 응답.
  • HTTP 응답 코드

    • 200 : 정상응답
    • 301 : 페이지 영구이동
    • 302 : 페이지 임시이동
    • 304 : 요청 페이지 캐시됨.
    • 400 : BAD REQUEST, 잘못된 요청.
    • 401 : UNAUTHORIZED, 요청 권한 없음.
    • 403 : FORBIDEN, 페이지 요청 금지.
    • 404 : NOT FOUND, 요청한 페이지에 대한 자원 찾을 수 없음.
    • 405 : 서버에 정의되지 않은 요청 메서드.
    • 500 : 서버 내부 오류.
    • 503 : 서비스 사용 불가(유지보수)

🐽서블릿(Servlet)

  • 자바를 기반으로 하는 웹 애플리케이션 프로그래밍 기술.

서블릿 개요

  • 클라이언트 측에서 요청받은 페이지를 출력할 때 회원 정보와 같은 경우 동적으로 변경되는 데이터 값을 갖는다. 따라서 웹 서버 내에서 정적 페이지에 동적 요소를 추가해주어 페이지를 구성해주는 작업이 필요한데, 이를 수행해주는 것이 WAS(Web Application Server)이다. WAS에 의해서 완성된 웹 애플리케이션(웹 페이지)을 Servlet이라고 한다.

    • 대표적인 예로 Apache Tomcat이 있다.
  • 웹 애플리케이션 프로그래밍을 위해 작성한 클래스를 서블릿 클래스라고 하며, 자바 클래스 형태이다.

  • 서블릿 클래스 실행을 위해서는 서블릿 객체 생성 및 초기화 과정을 거쳐야 한다.

  • 위 과정은 서블릿 컨테이너에 의해 수행되며, 개발자는 서블릿 클래스 작성 후 서블릿 컨테이너에 등록만 해주면 된다.

  • 서블릿 운영 방식은 멀티 쓰레드 방식인데, 웹 서버에서는 동시에 여러 개의 요청을 처리해야 하는 경우가 발생하기 때문에 하나의 쓰레드로는 처리하기에는 한계가 있다.

  • 멀티 쓰레드 사용 시 주의할 점은 프로세스의 자원을 공유하여 사용하기 때문에, 동기화 및 deadlock이 발생할 위험이 있다. 따라서 이를 방지하기 위해서 서블릿 클래스에 인스턴스 변수를 선언하지 않는 것이 좋다.

Servlet Container와 WAS 차이점

WAS는 간단히 설명하면, Web Server + Web Container로 구성되어 있다.
따라서 WAS는 정적 요소를 제공(Web Server) 하면서 웹 컨테이너를 이용해 내부 로직을 거쳐 동적인 페이지를 만들 수 있다.

Servlet은 자바 웹 애플리케이션 구현 기술로서 Servlet이 관리하고 jsp 파일을 실행할 수 있도록 해주는 것이 Servlet Container 이다.

즉, WAS가 Servlet Container를 포함하는 개념이다.

서블릿 코드 작성 방법

  • 추상클래스인 HttpServlet 상속
  • service(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException 메서드 내부에 기능 구현.

서블릿 실행

1. 서블릿 클래스 코드 작성
	public class 클래스명 extends HttpServlet{
    	
        service(HttpServletRequest request,
        HttpServletResponse response)throws IOException,
        ServletException{
        	코드 구현
        }
    }

2. 일반적으로 서블릿 클래스는 보호목적으로 WEB-INF/classes 라는 폴더 안에 컴파일 후 저장된다. WEB-INF 폴더 안의 파일은 서버 내에서만 접근이 가능하며,외부에서는 접근이 불가능하다.

3. 클라이언트가 서버 내 서블릿에 접근할 수 있도록 하기 위해 서블릿과 매핑된 URL을 제공한다. 만약 URL 요청이 들어오면, 해당 요청 URL과 매핑된 Servlet 코드를 찾아서 실행하도록 한다.

4. 매핑 URL 주소 등록을 위해 WEB-INF/web.xml(서블릿 설계도) 안에 서블릿과 매핑할 URL 등을 정의해줘야 한다.

web.xml 작성

  <web-app>
      <servlet>
        <!-- 서블릿 클래스의 이름이 들어갈 부분 -->
        <servlet-name>servlet 명칭</servlet>
		<servlet-class>servlet 클래스 명칭(full name)</servlet-class>
      </servlet>
      <servlet-mapping>
        <!-- 서블릿 클래스를 호출할 때 사용할 URL이 들어갈 부분 -->
        <servlet-name>servlet 명칭</servlet-name>
		<url-pattern>매핑할 URL</url-pattern>
      </servlet-mapping>
  </web-app>
  
  ※ 주의할점은 servlet-name 내 정의한 이름은 <servlet><servlet-mapping>
  	은 동일한 값으로 넣어줘야 mapping이 가능하다.

웹브라우저에 문자열 출력하기

◎ 웹으로 입출력하기 위한 방법.(stream을 이용한 데이터 출력)
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;

public class OutputStringServlet extends HttpServlet{
	public void service(HttpServletRequest request,
    HttpServletResponse response) throws IOException,
    ServletException{
    
    OutputStream os = response.getOutputStream();
    PrintStream out = new PrintStream(os,true);
    out.println("Hello Servlet");
    }
}
* PrintStream(InputStream is, boolean b);
PrintStream : print 계열의 메서드를 제공하는 객체.
boolean b : 네트워크로 데이터를 전송하는 스트림은 기본적으로 버퍼를 사용하는데, 버퍼의 특성 상 용량(8Kbyte)이 꽉차야 전송이 되는데, print 매개 값의 용량이 꽉차지 않아도, 바로 전송되도록 하기 위한 매개변수. true -> 바로바로 전송, false -> 꽉차야 전송

==== 결과 ====
Hello Servlet

◎ PrintWriter 객체 사용.
PrintWriter out = response.getWriter();
out.println("Hello Servlet!");
- Writer 객체는 문자열 전송을 위한 스트림으로, 기본적으로 다국어 기능도 포함하고 있다.
- 따라서 Servlet에서는 PrintWriter라는 객체를 많이 사용한다.
- 상대적으로 코드가 짧기도 하다.
profile
백엔드 서버 엔지니어

0개의 댓글