서블릿 개발하기 연재목록

#1 개발환경 구축 (https://opensrc.tistory.com/180?category=475522)

#2 프로잭트 생성 (https://opensrc.tistory.com/181?category=475522)

#3 첫번째 JSP 파일 만들기 (https://opensrc.tistory.com/182?category=475522)

#4 첫번째 서블릿 만들기 (https://opensrc.tistory.com/183?category=475522)

#5 포스트 요청을 처리하는 서블릿 만들기 (https://opensrc.tistory.com/203?category=475522)

#6 GET/POST 요청과 함께 파라메터 전달 하기 (https://opensrc.tistory.com/204?category=475522)

#7 Servlet 들여다 보기 (https://opensrc.tistory.com/206?category=475522)

===========================================================

 

너무 오랫만에 포스팅을 하게 되었습니다.

스프링 같은 Java Web Application개발용 프레임워크를 이용하지 않고 옛날 방식의 Servlet 개발 방식을 살펴보고 있습니다. 물론 요즘에는 거의 사용되고 있지 않지만 스트러츠나 스프링 같은 고도화된 프래임워크의 작동 방식을 이해하는데 꼭 필요하다는 생각에서 스프링 개발을 진행하기 전에 또는 스프링 기반의 개발 방식에 익숙한 분들께 도움이 될까... 하는 생각에 시작한 연재입니다.

 

HTTP Method 이해

일반적으로 우리가 브라우저 창에 주소를 치거나 웹페이지에서 링크를 클릭해서 화면을 표시하는 방식을 GET 방식이라고 합니다.

다른 페이지에서 우리가 만든 페이지를 찾아오기 쉽게 주소를 기술해 놓은 것을 브라우저 주소창에 붙혀넣거나 클릭하는 것 만으로 해당페이지에 접근 할 수 있는 방식입니다.

이미 모든 분들이 누군가에게 어느 사이트의 주소를 알려줄 때 많이 사용해 보았을 것입니다.

HTTP 프로토콜에는 GET 외에도 POST, PUT, DELETE, HEAD, OPEIONS... 등등 몇가지 방식이 있습니다. 실질적으로 어느 방식을 쓰든 클라이언트(브라주저)에서 서버쪽으로 요청을 보내는 것은 동일하지만 전달하는 방식은 약간 차이가 있습니다.

그 차이는 차차 알아가시면 되고 여기서 설명 할 것은 GET과 POST의 차이만을 설명하도록 하겠습니다.

우선 GET방식의 요청은 브라우저 주소창에 해당 컨텐츠의 주소와 파라메터 까지 그대로 기술 됩니다. 그 주소 만으로 해당 컨텐츠가 온전하게 표시 될 수 있어야 합니다.

반면 POST 방식은 해당 컨텐츠의 주소와 URI 까지만 표시를 하고 파라메터와 그 값은 주소창에 표시 되지 않습니다.

이런 특성을 잘 이용해서 개발을 한다면 GET방식은 읽기에 유용하고 POST는 서버로 데이터를 전송해서 저장, 삭제 하는 기능에 유용합니다.

만일 어느 게시판의 글을 읽는 기능을  GET 방식으로 http://somesite.co.kr/read?artecleId?=10  와 같이 구현 했다면 이것만 복사 해서 카카오톡에도 붙혀넣고 블로그에도 붙혀넣고 누구든 (글을 읽을 수 있는 권한이 있는 경우) 저 주소만 클릭하면 글을 볼수가 있습니다. 

만일 삭제하는 기능도 역시 GET방식으로 http://somesite.co.kr/delete?artecleId?=10 이렇게 구현 했다면 저 주소를 브라우저 창에 입력해서 실행 하는 것 만으로 글 삭제를 시도 할 것입니다.(물론 삭제 할 수 있는 권한이 있는 경우에 그렇게 되겠죠)

그래서 주로 GET은 읽기 엑션에 적당하고 POST, PUT 같은것은 저장/수정, DELETE는 삭제 액션에 적당한 방식입니다.

앞서도 말했지만 여기서는 GET과 POST만을 다루겠습니다. POST를 이해하시면 PUT, DELETE를 사용하시는데 문제가 없습니다.

 

Request Method 확인 하기

이전 포스팅에서 우리가 만들었던 hello world 서블릿은 사용자로부터 GET 방식의 요청을 처리하는 매서드만 가지고 있습니다. 이제 사용자 요청이 POST로 들어오는 것을 처리할 매서드를 추가해 보도록 하겠습니다.

우선 우리가 만들었던 HelloWorldServlet.java 의 doGet(...) 메서드가 정말 GET방식의 요청인지 확인해보도록 하겠습니다.

HelloWorldServlet.java

package com.tistory.opensrc.basicservlet.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 첫번째 hello, world 서블릿
 * @author cloud
 */
public class HelloWorldServlet extends HttpServlet {
	
	/**
	 * serial version id
	 */
	private static final long serialVersionUID = 701289870660846795L;

	/**
	 * GET 요청을 처리
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		response.setContentType("text/html"); // text html 형태로 출력 하겠다고 지정함
		PrintWriter out = response.getWriter(); // response로 부터 출력 장치를 확보
		
		// html 내용을 출력
		out.println("<html>");
		out.println("hello, world");
		out.println("method : " + request.getMethod()); // 요청 메서드 확인
		out.println("</html>");
	}
}

out.println("out.println("method : " + request.getMethod()); // 요청 매서드 확인

코드를 한줄 추가 합니다.

HttpServletRequest request 의 getMethod() 는 Request 헤더를 파싱해서 사용자 요청의 Method를 확인합니다.

이제 서블릿을 호출 해 봅니다.

위와 같은 결과가 나왔으면 정상적으로 처리 된 것입니다.

위와 같이 나오지 않는다면 [서블릿 개발하기] #1 개발환경 구축 편의 4. 서버 실행 파트를 참고 해서 서버를 실행 하셔야 합니다.

POST 로 요청(Request) 하기

이제 우리가 만든 서블릿을 POST로 호출 하도록 준비를 해보겠습니다. POST로 호출하기 위해서는 간단한 페이지를 만들어야 합니다. [서블릿 개발하기] #3 첫번째 JSP 파일 만들기에서 처음 만들었던 hello, world 를 출력하는 index.jsp 파일을 수정해서 만들어 보겠습니다.

<!@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
hello, world</br>
<form action="/hello" method="POST">
	<input type="submit" value="Submit"/>
</form>
</body>
</html>

우리가 출력했던 hello, world 아래에 아무것도 없는 폼 엘리먼트를 하나 추가 하고 액션은 /hello 매서드는 POST로 지정했습니다. Submit 버튼을 클릭하면 우리가 만든 HelloWorldServlet POST Request를 호출 하겠다는 이야기 입니다.

action="/hello" 가 어떻게 HelloWorkdServlet 과 연결이 되는지 이해가 안가시는 분은 [서블릿 개발하기] #4 첫번째 서블릿 만들기 를 다시 한번 보시기 바랍니다.

 

실행을 하면 이런 결과가 나옵니다.

Submit 버튼을 클릭해 봅니다.

우리가 만든 HelloWorldServlet에는 GET 요청만을 처리하는 doGet() 메서드만 추가되어 있기 때문에 아래와 같이 

HTTP Status 405 - HTTP method POST is not supported by this URL

에러가 나오고 있습니다.

이제 HelloWorldServlet에 POST Method Request 에 대응하는 메서드를 추가하도록 하겠습니다.

아래 내용처럼 HelloWorldServlet.java 에 doGet 메서드를 복사해서 doPost 메서드를 추가 합니다.

package com.tistory.opensrc.basicservlet.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 첫번째 hello, world 서블릿
 * @author cloud
 *
 */
public class HelloWorldServlet extends HttpServlet {

	/**
	 * serial version id
	 */
	private static final long serialVersionUID = 701289870660846795L;

	/**
	 * GET 요청을 처리
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("text/html"); // text html 형태로 출력 하겠다고 지정함
		PrintWriter out = response.getWriter(); // response로 부터 출력 장치를 확보
		
		// html 내용을 출력
		out.println("<html>");
		out.println("hello, world<br/>");
		out.println("method : " + request.getMethod());
		out.println("</html>");
	}
	

	/**
	 * POST 요청을 처리
	 * @param request
	 * @param response
	 * @throws ServletException
	 * @throws IOException
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("text/html"); // text html 형태로 출력 하겠다고 지정함
		PrintWriter out = response.getWriter(); // response로 부터 출력 장치를 확보
		
		// html 내용을 출력
		out.println("<html>");
		out.println("hello, world<br/>");
		out.println("method : " + request.getMethod());
		out.println("</html>");
	}
}

 

이제 톰켓 서버를 재시작 하고

앞의 http://localhost 화면에서 Submit 버튼을 클릭해 봅니다.

정상적으로 POST 요청에 대한 응답이 성공하였습니다.

다음 편에서는 GET/POST 요청에 변수(Parameter)를 전송하는 방법을 알아보겠습니다.

 

+ Recent posts