[WEB] Servlet

지수·2021년 8월 30일
0

플레이데이터

목록 보기
25/50
post-thumbnail

1. Servlet이란?

✅ Servlet이 뭔데?
웹 개발시 client의 요청을 처리하고 그 결과를 client에게 다시 전송하는 Servlet 클래스의 구현 규칙을 지킨 자바 프로그램


💡 왜, Servlet이 필요할까?

  • html/css/java script는 일반 자바 클래스(순수 자바)와 소통 불가
  • 즉, 웹 요청/응답 처리는 일반 자바 클래스로는 불가능함
  • 브라우저 언어와 소통하여 웹 요청/응답을 처리하는 Servlet 혹은 JSP(Javs Server Page) 필요

2. Servlet 개발 규칙

Servlet은 그 정의에서도 알 수 있듯이 Servlet 클래스의 구현 규칙을 지킨 자바 프로그램이다.

  • 정해진 API 활용
  • HTTPServlet(http 기반의 웹 통신, http 프로토콜을 지원해주는 class) 상속
  • get, post 등 메소드 재정의
  • servlet은 자바 파일이기 때문에 src 안에 위치
    (그 외 html, css, js 등은 webContent 안에 위치)

3. Servlet 객체와 내부 메소드

  • Servlet 객체는 최초의 client 요청시 한 번만 생성됨
    = Servlet 객체 하나로 여러 client 응대

  • client 한 명당 1:1로 doGet() 메소드 할당
    doGet() 메소드 안에 parameter로 개별 HttpServletRequest, HttpServletResponse 입력
    - doGet() : http 표준 요청 방식 get을 재정의 한 메소드
    - doGet()을 servlet 안에서 재정의는 하나 명시적 호출 코드는 없음(자동 실행)
    - web container(web server, WAS, servlet engine)에 client 요청이 감지되면 자동 실행

  • client 한 명당 1:1로 HttpServletRequest 객체와 HttpServletResponse 객체 자동 생성
    = 요청/응답 객체는 client 간에 공유되지 않고, 개별적으로 할당


4. Servlet Life Cycle

기본 생성자 생성 → init() → service()/doGet()/doPost() → destroy()

1. 기본 생성자

  • () parameter가 없는 생성자
  • 최초 client가 url 호출시 실행되어 servlet 객체 생성
  • 로직 갱신 시 기존 객체 제거하고, 갱신 후 최초의 client가 요청시 단 한번 실행되어 객체 생성

2. init()

  • 생성자 호출 직후 단 한번 실행
  • 공유 자원 초기화

3. doGet() / doPost()

  • client 요청시 1:1로 실행(공유X)
  • service 메소드라 표현

4. destroy()

  • 로직 갱신시 갱신된 servlet byte code가 서버 메모리에 로딩될 때 자동 호출
  • 구버전 객체는 메모리에서 소멸 = 구버전 객체 메모리 해제시 자동 실행
  • 서버 다운 직전에도 자동 호출되어 자원 해제
  • 자원 반환

5. Servlet API

  • HttpServlet
    : http 프로토콜을 사용 가능하도록 구현된 class → 상속 후 메소드 재정의만 해서 사용

    • doGet()
    • doPost()
    • service()
  • HttpServletRequest
    : http 프로토콜 기반으로 request하는 client 정보 보유(ip/브라우저 기본 정보/입력 데이터 등...)
    = doGet(), doPost() 메소드 실행을 위해 필요한 client 정보 제공 API

    • setCharacterEncoding() : client가 한글값 입력할 때 필요한 인코딩
    • String getParameter() : web query string으로 넘어온 단일값 받아오기
    • String[] getParmeterValues() : web query string으로 넘어온 다중값 받아오기

    • getRequestURL() : client가 요청하는 프로그램명까지의 url
    • getMethod() : client가 요청한 방식(GET/POST/...)
    • getQueryString() : client가 서버에 전송하는 map 구조의 데이터(name=playdata&name2=encore)

    • getRequestDispatcher() : forward로 화면 전환

    • setAttribute(key, value) : Servlet에서 데이터 저장, key-value 매핑
    • getAttribute(key) : setAttribute()로 저장한 데이터 받아오기
      setAttribute와 getAttribute는 요청 객체가 유지될 때 연동 가능(forward ⭕, redirect ❌)

  • HttpServletResponse
    : http 프로토콜 기반으로 request하는 client에게 response(응답)
    응답 포멧 설정 후 해당 client 브라우저에 응답(setContentType(), getWriter())

    • setContentType() : client 브라우저애 응답하는 포멧 + 인코딩 설정
    • getWriter() : 2byte 출력 가능한 PrintWriter 객체 생성
      (PrintWriter는 접속된 client에게만 출력)

    • response.sendRedirect() : redirect로 화면 전환

  • PrintWriter
    : 2byte 단위로 client 브라우저에 출력

//접속한 client 브라우저에 한글 데이터 출력
//한글 encoding 설정 / html 포멧으로 응답
response.setContentType("text/html;charset=utf-8");
		
//2byte 단위로 client 브라우저에 응답 가능한 출력 객체
PrintWriter out = response.getWriter();
out.println("서블릿은 어려워~");

6. GET vs POST

GETdoGet()

  • 서버에 데이터 전송시 url에 전송되는 데이터 오픈
    (http://localhost/step01_basic/idcheck?id=geesuee&pw=5678)
    → id와 pw 값이 url에 그대로 노출됨
  • 보안 고려 ❌
  • (보안과 관계없는)소량의 데이터 전송, web page 구분용으로 사용 ⭕

POSTdoPost()

  • 서버에서 데이터 전송시 보안을 고려하여 전송 값을 은닉하여 전송
  • 보안이 필요한 경우, 전송하는 데이터 양이 많은 경우 사용 ⭕
profile
사부작 사부작

0개의 댓글