1. GET 방식 : 입력과 조회
사용하는 경우
- 원하는 데이터 조회
- 사용자가 입력할 수 있는 화면
- <form> 태그와 GET 방식
아래는 webapp 하단의 calc 폴더 안에 있는 input.jsp 코드이다.
<%@ page contentType="text/html;charset=UTF-8" Language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form>
<input type="number" name="num1">
<input type="number" name="num2">
<button type="submit">SEND</button>
</form>
</body>
</html>
<form> 태그를 이용해서 사용자가 입력하는 내용들을 전송하는 용도로 사용한다.
프로젝트를 실행하고 브라우저에 'calc/input.jsp' 주소를 입력하면 화면을 GET 방식으로 볼 수 있게 된다.
SEND 버튼을 누르면 해당 주소를 다시 호출하게 된다.
화면상의 결과는 같지만 주소창의 내용은 ?num1=&num2=가 붙어 있게 변경된 것을 볼 수 있다.
SEND 버튼의 type이 submit으로 지정되어 있는데 이 경우 버튼을 클릭하면 <form> 태그 내에서 사용자가 입력한 값을 <input> 태그의 name 속성값과 함께 전송하게 되기 때문이다.
- 쿼리 스트링과 파라미터
쿼리 스트링이란?
쿼리 스트링웹에서 주소창 뒤에 ?로 시작하는 내용물
질의 문자열. 무언가를 요구하거나 물어보는 용도로 데이터를 전달하기 위해 사용한다.
파라미터란?
쿼리 스트링은 키=값의 형태로 데이터를 전달하는데 여러 개의 데이터가 필요한 경우 &를 이용해서 연결한다.
키=값의 형태를 흔히 파라미터 이름과 값이라고 한다.
2. POST 방식 : 처리를 위한 용도
- <form> 태그와 POST 방식
<form> 태그에는 action과 method라는 속성을 이용해서 양식을 어디에 어떤 방식으로 전송할 것인지를 결정할 수 있다.
input.jsp의 코드를 아래와 같이 변경해보자.
<form action="calcResult.jsp" method="post"> //action, method 속성 추가
<input type="number" name="num1">
<input type="number" name="num2">
<button type="submit">SEND</button>
</form>
<form> 태그의 action을 calcResult.jsp로 전송하고, 전송방식 method는 post로 변경되었다.
주소창을 살펴보면 GET 방식과 달리 POST 방식은 num1과 num2가 보이지 않는 것을 살펴볼 수 있다.
POST 방식은 주소와 전달하고자 하는 데이터를 분리해서 전송한다.
👉 브라우저를 통해서는 확인할 수 없고 개발자 도구를 이용해야만 확인이 가능하다.
만일 사용자가 num1, num2에 값을 입력하고 'SEND'를 호출하면 개발자 도구에서는 사용자가 입력한 내용을 확인할 수 있다.
POST 방식은 등록/삭제/수정과 같은 작업을 수행하기 위해서 사용한다.
POST 방식은 GET 방식과 달리 정보의 확산이 목적이 아니다.
👉 굳이 하나의 문자열로 모든 정보를 표현하지 않고, URL과 정보를 따로 구분해서 전달한다.
input.jsp에서 전달되는 num1/num2를 받아서 처리하는 calcResult.jsp를 작성한다.
<%@ page contentTyep="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>NUM1 ${param.num1}</h1>
<h1>NUM2 ${param.num2}</h1>
</body>
</html>
${ }로 처리된 부분이 존재하는데 이 부분은 JSP에서 사용하는 EL (Expression Language) 이라는 기술이다.
서버에서 데이터를 출력하는 용도로 System.out.println()과 유사한 역할을 한다.
EL을 이용할 때는 param이라는 이름의 지정된 객체를 이용해서 현재 요청에 전달된 파라미터를 쉽게 추출할 수 있다.
<form> 태그에서 num1이라는 이름의 전송된 데이터는 ${param.num1}과 같은 형태로 간편하게 사용할 수 있다.
- 웹의 파라미터는 모두 문자열
JSP가 브라우저에 전달하고 싶은 데이터를 구성하는 데는 상당히 편리하지만 복잡한 코드를 넣는 데는 적합하지 않다.
num1과 num2처럼 전달되는 모든 데이터는 문자열로 처리된다.
👉 결과 데이터를 처리하기 위해서는 calcResult.jsp를 다음과 같이 Integer.parseInt()를 적용해서 다시 ${ }로 감싸서 처리해야 한다.
<h1>NUM1 ${param.num1}</h1>
<h1>NUM2 ${param.num2}</h1>
<h1>SUM ${Integer.parseInt(param.num1) + Integer.parseInt(param.num2)}</h1>
3. GET, POST 정리
GET | POST | |
주용도 | 조회 | 등록/수정/삭제 |
구성 | URL 뒤의 ?와 쿼리 스트링 | URL 전달 후 HTTP body로 쿼리 스트링 |
효과 | 사용자가 손쉽게 사용할 수 있는 링크를 제공 | 단순 조회가 아니라 원하는 작업을 처리할 수 있음 |
한계 | - 브라우저에 따라 길이의 제한 - URL 뒤의 쿼리 스트링으로 모든 정보가 전달됨 👉 보안 취약 - 쿼리 스트링 길이에 대한 제한 |
- GET 방식에 비해서 많은 양의 데이터를 전송함 - 주소창만으로는 테스트가 어려움 |
4. JSP의 올바른 사용법
- JSP의 문제점
- GET/POST 방식의 호출을 구분하지 않는다.
👉 POST 방식으로 접근해야 하는 calcResult.jsp를 GET 방식으로도 얼마든지 호출할 수 있다.
👉 Integer.parseInt()에서 문제가 발생하면서 예외가 발생한다. - 유지 보수 측면에서도 문제가 발생한다.
input.jsp 대신에 input1.jsp와 같이 다른 JSP 파일로 변경했을 경우 과거의 input.jsp만 알고 있는 사용자들에게는 다시 주소가 변경되었다는 점을 알려주어야 한다.
이러한 이유로 JSP는 제한적인 용도로 사용한다.
- JSP의 용도
- JSP에서 쿼리 스트링이나 파라미터를 처리하지 않음 - 대신 서블릿을 통해 처리
- JSP는 입력 화면을 구성하거나 처리 결과를 보여주는 용도로만 사용
- 브라우저는 직접 JSP 경로를 호출하지 않고 서블릿 경로를 통해서 JSP를 보는 방식으로 사용
👉 웹 MVC 방식으로 이러한 문제를 해결함. JSP는 결과만 출력하고, 처리는 서블릿을 이용하는 방식으로 변화함
'Web > Servlet + JSP' 카테고리의 다른 글
[Servlet] web.xml과 @WebServlet (이클립스 이용) (0) | 2024.04.02 |
---|---|
[Servlet + JSP] 자바 서버 사이드 프로그래밍 - 자바 웹 개발 워크북 (1) | 2024.03.29 |