[Servlet][국비교육] Day 64

Ga02·2023년 3월 31일

국비교육

목록 보기
58/82

➰ 요청 파라미터의 한글 인코딩 처리

req.setCharacterEncoding("UTF-8"); 코드 사용

  • 웹 서버 환경(Servlet/JSP)은 한글 인코딩 UTF-8을 사용하고 있음
  • 브라우저(HTML)에서 요청 파라미터를 UTF-8형식으로 전달
  • Apache 웹 서버는 기본 인코딩으로 ISO-8859-1(Latin 1)을 사용하고 있음
    👉🏻 ISO-8859-1 인코딩으로는 한글을 표현할 수 없음
  • 한글 데이터가 웹 서버를 통과할 때 한글 형태를 유지하지 못하게 됨
  • 서블릿 코드로 다시 원본 데이터 형식인 UTF-8로 합성해서 사용할 수 있도록 함

➰ 응답 데이터(HTML)코드의 한글 인코딩 처리

브라우저는 응답데이터(HTML)에 사용된 인코딩 방식을 확인할 필요가 있음

  • 응답 데이터를 생산하는 코드(Servlet/JSP)에서 데이터의 유형을 Content-Type으로 명시해야 함
  • MIME 타입으로 "text/html; charset=utf-8"을 적용
  • Servlet에서 적용하기 👉🏻 Servlet에서 직접 답을 하기 위해서만 사용하므로 웬만하면 사용하지 않음
    • resp.setContentType("text/html; charset=utf-8");
  • JSP에서 적용하기
    • <% page %> 태그에서 contentType="text/html; charset=utf-8" 속성 적용

➰ HTTP GET 요청

전달 파라미터를 URL에 포함시키는 방식
보여져도 되는 정보, 데이터베이스를 조회하려고 할 때 등

➰ HTTP POST 요청

전달 파라미터를 Request Message BODY에 포함시키는 방식
민감한 정보, URL이 길 때, 데이터를 변경하려고 할 때 등

➰ HTTP 요청이 GET 메소드로 파라미터를 전달하는 상황

  • 단순 URL로만 요청했을 때 ➡ 브라우저 주소 입력창에 URL을 입력하고 엔터
  • <a> 링크를 클릭했을 때
  • location.href = "URL"로 페이지 이동했을 때
  • <link>, <script> 태그로 정적 자원을 로드했을 때
  • <form> 태그에 method 속성을 get으로 설정하고 submit 했을 때

➰ HTTP 요청이 POST 메소드로 파라미터를 전달하는 상황

  • <form> 태그에 method 속성을 post로 설정하고 submit 했을 때

👀 서블릿의 동작 흐름, 동작 원리

클라이언트의 URL 요청 👉🏻 Apache Tomcat Server (웹 서버 - WAS) 👉🏻 서블릿 컨테이너
👉🏻 URL - Servlet 매핑 표 확인 👉🏻 서블릿 클래스 객체
👉🏻 서블릿 객체의 service() 메소드를 호출 (service() 메소드는 요청 Method를 분석)
👉🏻 요청 메소드에 따라 doGet() 또는 doPost()를 선택해서 실행
👉🏻 서블릿 컨테이너 👉🏻 Apache Tomcat Server 👉🏻 클라이언트 HTTP 응답

➰ 서블릿 컨테이너, Servlet Container

서블릿이 동작되는 환경을 구축하는 역할을 담당

  • 서블릿 객체를 생성(new)하고 실행시켜주는 역할을 수행
  • WAS서버와 서블릿 객체를 연결
  • URL 매핑 테이블을 가지고 있음
  • 요청 URL Pattern과 서블릿 객체를 연결할 때 사용
  • 서버가 켜질 때 요청 URL과 서블릿을 1:1로 매핑해놓는 작업을 수행
  • 매핑 테이블은 web.xml(배포 관리자, Deployment Descriptor) 또는 @WebServlet 어노테이션을 활용하여 작성됨
  • HTTP 요청 정보(메시지)를 HttpServletRequest 객체로 생성
  • HTTP 응답 정보(메시지)를 HttpServletResponse 객체로 생성
    👉🏻 만들어진 객체를 둘 다 서블릿 객체에 전달

➰ 서블릿 객체의 라이프 사이클(생명주기, Life Cycle)

객체 생성 ➡ 생성자 호출 / 객체 초기화 / 인스턴스
👉🏻 init() ➡ 서블릿 초기화 / 서블릿의 동작 초기 설정
👉🏻 service() 실행 ➡ doGet(), doPost() 실행 / 요청에 따라 반복
👉🏻 destroy() 실행 ➡ 서블릿 객체 정리 / 서버를 종료할 때 실행 / 서블릿이 파괴될 때 실행

  • 객체 생성
    URL 요청에 따라서 서블릿 클래스가 처음으로 사용될 때 수행 👉🏻 지연된 초기화, Lazy Initialization
  • init()
    객체 생성 이후에 곧바로 서블릿 컨테이너가 호출 👉🏻 요청 처리 전에 딱 한번만 수행됨
  • service()
    URL 요청이 있을 때마다 반복적으로 호출됨
    • 요청 정보의 Request Method(요청 메소드)에 따라서 doGet()이나 doPost()를 호출
    • 서블릿 컨테이너에 의해 멀티 스레딩 됨
    • 동시에 여러 클라이언트가 같은 url로 요청해도 동시 실행에 문제가 없음
  • destroy()
    서버가 종료되는 시점처럼 서블릿 객체를 정리할 때 딱 한 번만 호출됨

✔ 서버가 켜질 때 서블릿 객체가 같이 생성(new) 되지 않음
✔ 서버가 켜진 이후 처음으로 url-pattern에 맞는 요청이 와서 서블릿을 사용할 때 요청 - 객체생성 - init() - service() - 응답 순으로 진행
✔ 처음 요청이 아닌 이후 요청부터 서블릿을 사용할 때 요청 - service() - 응답 순으로 진행


🔍 JSP, Java Server Page

자바 언어를 이용하여 서버 페이지를 작성하는 문서(문법)

  • 자바 동적 웹 페이지
    • PHP, Hypertext Processor
    • ASP, Active Server Page
  • JSP는 Servlet클래스를 기반으로 만들어짐
  • JSP 코드를 작성하면 JSP 컨테이너(Jasper)에 의해서 Servlet 코드로 변환됨
  • Servlet의 코드 작성 형식은 Java 코드 안에 HTML코드를 작성하는 형태
resp.getWriter().appeend("<h1>하이</h1>");
  • JSP의 코드 작성 형식은 HTML코드 안에 Java코드를 작성하는 형태
<h1><%=dept.getDname() %></h1>
  • Servlet코드는 HTTP응답으로 HTML코드를 작성하는 것이 불편 👉🏻 JSP코드를 이용하면 HTML응답 코드를 작성하기가 좀 더 편해짐
    👉🏻 Servlet코드는 자바언어를 이용해서 비지니스 로직을 작성
    👉🏻 JSP코드는 Servlet코드의 수행 결과를 이용하여 프레젠테이션 로직을 작성

➰ JSP 기본 태그 문법

  1. 스크립트릿, Scriptlet
<% %>
  1. 선언, Declaration
<%! %>
  1. 표현식, Expression
<%= %>
  1. 지시자, Directive
<%@ %>
  1. 주석, Comment
<%-- --%>

webapp까지는 공개 가능
WEB-INF는 공개 불가 -> 이 안에 들은 jsp는 forward로만 가능

profile
IT꿈나무 댓츠미

0개의 댓글