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>
- 버튼이 '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)로 쿼리 스트링 |
효과 | 사용자가 손쉽게 사용할 수 있는 링크 제공 | 단순 조회가 아닌 원하는 작업 처리 |
한계 |
|
|
- 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>
- 웹의 파라미터는 모두 문자열로, 위와 같은 숫자를 처리할 때 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 방식으로도 호출 가능
- 유지보수 측면에서도 input.jsp가 input2.jsp로 변경되었다면, 모든 사용자들이 input2.jsp로 바꿔야함
- 따라서, 다음의 용도로만 제한적으로 JSP 사용
- JSP에서 쿼리 스트링이나 파라미터 처리 x, JSP 대신 Servlet에서 처리
- JSP는 입력 화면을 구성하거나 처리 결과를 보여주는 용도로만 사용
- 브라우저는 직접 JSP 경로로 호출 x, Servlet 경로를 통해 JSP를 보는 방식으로 사용
- 이러한 처리를 위해 웹 MVC 방식 사용(JSP는 결과만 출력, 처리는 Servlet에서)
'back-end > Java' 카테고리의 다른 글
[자바 웹 개발 워크북] 2.2 - 프로젝트 내 JDBC 구현 (0) | 2023.01.05 |
---|---|
[자바 웹 개발 워크북] 2.1 - JDBC 프로그래밍 준비 (0) | 2023.01.04 |
[자바 웹 개발 워크북] 1.5 - 모델(Model) (0) | 2023.01.03 |
[자바 웹 개발 워크북] 1.4 - HttpServlet (0) | 2023.01.02 |
[자바 웹 개발 워크북] 1.3 - Web MVC 방식 (0) | 2022.12.30 |