1. Request(요청) / Response(응답)

  - 브라우저가 서버로 '요청'할 때

  • GET 방식: 주소창에 직접 원하는 데이터를 적거나 링크를 클릭해서 호출
    • 단순 링크로 주소와 필요한 정보를 동시에 보냄, 주로 특정 정보 조회 목적
  • POST 방식: 입력 화면에서 필요한 내용을 작성한 수 '전송'과 같은 버튼 등을 클릭해서 호출
    • 주소와 데이터를 따로 보내며, 웹 화면에서 데이터를 주고 받는 동작을 처리할 때 사용

 

  - 서버가 브라우저의 요청에 '응답'할 때

  • 정적 데이터: 항상 동일하게 고정된 데이터 전송, 파일로 고정된 html, css, 이미지 등
    • 웹 서버(Web Server): 항상 같은 정적 데이터만 보내는 역할 수행
  • 동적 데이터: 매번 필요한 다른 데이터를 동적으로 구성하여 전송, 메일함 등 상황에 따라 다른 데이터로 응답(서버 사이드 프로그래밍), Servlet / JSP 등
    • 웹 어플리케이션 서버(Web Application Server, WAS): 동적 데이터를 만들어 보내는 서버

 

 

 1) HTTP

  • 브라우저의 요청과 서버의 응답 사이의 데이터 교환 약속(프로토콜)
    • HTTPS는 HTTP에서 보안이 강화된 프로토콜

 

  • 메세지의 구성: Header와 Body로 구성되며 Request와 Response가 하나의 쌍으로 묶여서 처리

 

  • 비연결성 : 하나의 요청과 응답을 처리한 후에 연결을 종료함을 의미
    • 여러 사용자가 브라우저를 통해 서버를 호출하는 웹의 특성 상 최대한 많은 사용자에게 서비스를 제공하기 위해 비연결성 채택
    • 특정 웹페이지의 최신 결과를 확인하려면 새로 고침을 해야함
    • 이는 한번 요청과 응답이 오고 간 이후에 서버와 연결이 끊겨, 그 이후의 데이터를 받아오지 않았기 때문
    • 하지만, 요청과 응답 이후 연결을 끊음으로써 다른 사람에게 바로바로 응답을 할 수 있게 해줌

 

 2) 서버 사이드 프로그래밍

  • 서버 쪽에서 프로그래밍을 통해 데이터를 처리할 수 있도록 구성
  • 고려 사항
    • 동시에 여러 요청이 들어온다면 어떻게 처리?
    • 서버에 문제가 생기면 어떻게 처리?
    • 데이터 전송 방법 최적화
    • 분산 환경, 분산 처리 문제
  • JavaEE라는 기술 스펙에 위의 고려 사항들이 정리되어 있음(Servlet과 JSP도 JavaEE의 기술 중 하나)

 

    • Servlet 기술: 서버에서 동적으로 요청과 응답을 처리할 수 있는 API들을 정의한 것(Java 코드로 HTML 문자열 작성)
      • 톰캣 등의 Servlet의 실행이 가능한 환경(Servlet 컨테이너) 필요
      • 객체 생성, 호출의 주체는 사용자가 아닌 Servlet 컨테이너
      • Servlet 클래스에서 생성하는 객체의 관리는 Servlet 컨테이너가 함
      • Servlet / JSP 코드 개발은 Java API와 Servlet API 같이 사용
// java로 시작하는 Java의 API
// javax로 시작하는 Servlet의 API
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
// HttpServlet이라는 부모 클래스가 지정된 HelloServlet 클래스
public class HelloServlet extends HttpServlet {
  private String message;
  
  
  // 아래의 init(), doGet(), destroy() 메서드는 Servlet API에서 지정된 메서드
  // init(), doGet(), destroy()의 호출 주체는 개발자가 아닌 Servlet 컨테이너(톰캣 등)
  // 이런 메서드들을 Servlet의 라이프 사이클이라고 함
  public void init() { message = "Hello World!"; }

  public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    response.setContentType("text/html");
    // Hello
    PrintWriter out = response.getWriter();
    out.println("<html><body>");
    out.println("<h1>" + message + "</h1>");
    out.println("</body></html>");
  }

  public void destroy() {}
}

 

    • JSP(Java Server Page): Servlet과 같은 원리이지만 HTML을 쉽게 이용할 수 있는 방식(HTML 코드 이용, 약간의 Java 코드)
      • JSP 코드는 Java 코드가 아니지만, 컴파일될 때, Java 코드로 변환되어 실행
// Servlet 코드
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    response.setContentType("text/html");

    // Hello
    PrintWriter out = response.getWriter();
    out.println("<html><body>");
    out.println("<h1>" + message + "</h1>");
    out.println("</body></html>");
}

// JSP 코드
<head>
    <title>JSP - Hello World</title>
</head>
<body>

	<h1><%= "Hello World!" %></h1>
    
<br/>
<a href="hello-servlet">Hello Servlet</a>

// JSP 코드는 컴파일되고 실행될 때 Java코드로 변환됨
out.write("\n");
out.write("<DOCTYPE html>\n");
out.write("<html>\n");
out.write("<head>\n");
out.write("	<title>JSP - Hello World</title>\n");
out.write("<head>\n");
out.write("<body>\n");
out.write("\n");
out.write("<h1>");
out.write("Hello World!");
out.write("</h1>\n");
out.write("\n");
out.write("<br/>\n");
out.write("<a href=\"hello-servlet\">Hello Servlet</a>\n");
out.write("</body>\n");
out.write("</html>\n");
    • Servlet / JSP 정리
      • Servlet / JSP 모두 JavaEE의 일부
      • Servlet / JSP를 실행하기 위해서는 Servlet 컨테이너가 필요
      • Servlet 컨테이너는 Servlet / JSP 객체를 생성하고 라이프 사이클을 관리
      • JSP는 내부적으로 Servlet과 동일 방식의 코드(Java 코드)로 변환됨
      • JSP는 HTML 내에 Java 코드 추가, Servlet은 Java 코드 내에 HTML 코드 추가

 

 

2. JSP를 이용해서 GET / POST 처리

 1) GET 방식

  • 입력과 조회
    • 원하는 데이터 조회
    • 사용자가 입력할 수 있는 화면
  • 예시
<!-- <form> 태그와 GET 방식 -->

<!-- page contentType="text/html;charset=UTF-8" language="java" -->
<html>
<head>
    <title>Title</title>
</head>
<body>

<!-- <form>은 입력 양식을 의미 -->
<form>

    <!-- <input>은 문자나 숫자 입력의 용도 -->
    <input type="number" name="num1">
    <input type="number" name="num2">

        <!-- <button>은 화면에 버튼을 보여줌, type="submit"이라면, <form>태그 전송 -->
    <button type="submit">SEND</button>
</form>

</body>
</html>

서버를 열고 localhost:8080/calc/input.jsp를 들어갔을 때 화면
SEND 버튼을 클릭하면 주소창이 바뀜
각 칸에 숫자를 입력하고 SEND 버튼을 누르면 주소창에 해당 숫자가 출력

    • 버튼이 'type=submit'으로 지정되어 버튼을 클릭하면 <form> 태그 내부에 있는 <input> 태그의 속성값이 name 태그와 함께 전송됨
    • 'localhost:8080/calc/input.jsp?num1=1&num2=2'에서 ?로 시작하는 부분이 '쿼리 스트링'
    • 쿼리 스트링은 무언가를 요구하거나 물어보는 용도로 데이터를 전달하기 위해 사용
    • 쿼리 스트링은 키, 값 쌍의 형태로 데이터 전달, 여러 개의 데이터가 필요하면 '&'로 연결

 

 2) POST 방식

  • 처리를 위한 용도
    • action과 method라는 속성을 이용해 양식을 어디에 어떤 방식으로 전송할 것인지 결정
  • 예시
<!-- <form>양식에 action과 method 속성 추가-->
<form action='calcResult.jsp' method='post'>

    <input type="number" name="num1">
    <input type="number" name="num2">
    <button type="submit">SEND</button>
</form>

 

    • http://localhost:8080/calc/input.jsp에서 SEND를 눌렀을 때 화면
    • POST 방식은 주소와 전달하고자 하는 데이터를 분리하여 전송하므로 브라우저를 통해 확인 불가
    • 개발자 도구를 통해 확인 가능, 코드에서 데이터를 calcResult로 보내려고 했으나 calcResult가 존재하지 않아 에러

    • num1과 num2에 입력한 내용도 개발자 도구를 통해 확인 가능

 

  GET POST
주용도 조회 등록,  수정, 삭제 등의 쿼리
구성 URL 뒤의 "?"와 쿼리 스트링 URL 전달 후, HTTP 몸체(body)로 쿼리 스트링
효과 사용자가 손쉽게 사용할 수 있는 링크 제공 단순 조회가 아닌 원하는 작업 처리
한계
  • 브라우저에 따라 길이 제한
  • URL 뒤의 쿼리 스트링으로 모든 정보가 전달됨
  • 쿼리 스트링의 길이에 대한 제한
    (일반적으로 2kb, 브라우저마다 다름)
  • GET 방식에 비해 많은 양의 데이터 전송
  • 주소창만으로는 테스트가 어려움

 

  • input.jsp에서 데이터를 받아 처리하는 calcResult.jsp 작성
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <!-- ${}는 JSP에서 사용하는 Expression Language로 서버에서 데이터를 출력하는 용도(웹에서 System.out.println()과 유사한 역할 -->
    <h1>NUM1 ${param.num1}</h1>
    <h1>NUM2 ${param.num2}</h1>
</body>
</html>

calc/input.jsp에서 num1에 10, num2에 100을 입력한 후 SEND 버튼 클릭
calc/calcResult.jsp가 input.jsp의 num1, num2 데이터를 받아와 명령을 처리

 

  • 웹의 파라미터는 모두 문자열로, 위와 같은 숫자를 처리할 때 Integer.parseInt() 사용
<h1>NUM1 ${param.num1}</h1>
<h1>NUM2 ${param.num2}</h1>

<h1> SUM ${Integer.parseInt(param.num1) + Interger.parseInt(param.num2)}</h1>

 

 3) JSP의 올바른 사용법

  • JSP는 기본적으로 GET / POST 호출을 구분하지 않아서 POST 방식으로 접근해야하는 calcResult를 GET 방식으로도 호출 가능

주소창에 localhost:8080/calc/calcResult.jsp를 입력, calcResult.jsp에 GET 방식으로 접근

  • 유지보수 측면에서도 input.jsp가 input2.jsp로 변경되었다면, 모든 사용자들이 input2.jsp로 바꿔야함
  • 따라서, 다음의 용도로만 제한적으로 JSP 사용
    • JSP에서 쿼리 스트링이나 파라미터 처리 x, JSP 대신 Servlet에서 처리
    • JSP는 입력 화면을 구성하거나 처리 결과를 보여주는 용도로만 사용
    • 브라우저는 직접 JSP 경로로 호출 x, Servlet 경로를 통해 JSP를 보는 방식으로 사용
  • 이러한 처리를 위해 웹 MVC 방식 사용(JSP는 결과만 출력, 처리는 Servlet에서)

+ Recent posts