[Spring] CH06 서블릿 기본 (책)

jaegeunsong97·2023년 2월 18일
0

[Fast Campus] Spring

목록 보기
7/44
post-thumbnail

📕 POSTMAN 설치

포스트맨은 개발자들이 API를 디자인하고 빌드하고 테스트하고 반복하기 위한 API 플랫폼이다.

https://www.postman.com/downloads/

📕 Fake API

Free fake API for testing and prototyping.

https://jsonplaceholder.typicode.com/

📜 Host

https://jsonplaceholder.typicode.com

📜 Endpoint

GET /posts
GET /posts/1
GET /posts/1/comments
GET /comments?postId=1
POST /posts
PUT /posts/1
DELETE /posts/1

📜 URL

https://jsonplaceholder.typicode.com/posts

📜 요청 상세 가이드

https://jsonplaceholder.typicode.com/guide/

📕 서블릿 이론

자바 서블릿은 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양을 말하며, 흔히 "서블릿"이라 불린다. 자바 서블릿은 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종이다.

📜 버퍼 내용

📜 아파치/톰켓

아파치 톰켓은 서블릿 자바 클래스 파일에 요청 정보를 파싱해서 넘겨준다

📕 DynamicWebProject 세팅

https://getinthere.notion.site/J-Dynamic-WebProject-ec8b19067a5746c3886f35a0c3bfdb54

📕 서블릿 실습

https://github.com/codingspecialist/web1

📜 web.xml 재정의

웹 애플리케이션의 배포 설명자는 애플리케이션의 클래스, 리소스, 구성 및 웹 서버가 이를 사용해서 웹 요청을 처리하는 방법을 기술합니다. 웹 서버는 애플리케이션에 대한 요청이 수신되면 배포 설명자를 사용하여 요청의 URL을 해당 요청을 처리해야 하는 코드에 매핑합니다.

쉽게 생각하면 web.xml은 필터이다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
		version="4.0">
	<welcome-file-list>
		<welcome-file></welcome-file>
	</welcome-file-list>
</web-app>

📜 context-path 변경

웹 어플리케이션 서버(Web Application Server) = Tomcat에서 웹상의 어플리케이션들을 구분하기 위한 Path입니다.

쉽게 생각하면 이클립스에서 프로젝트를 여러개 생성해도 톰캣(WAS)은 하나밖에 없기 때문에 실행할때 프로젝트들을 구분해 줄 필요성이 있습니다. 그럴때를 대비해서 서로간의 프로젝트를 구분시켜 주는 Path를 톰캣(WAS)쪽에 설정해 놓는다고 보면 됩니다.



🔔 MyServletHeader.java

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

@WebServlet("*.he")
public class MyServletHeader extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	// http://localhost:8080/hello.he
		Enumeration<String> names = req.getHeaderNames();
		while (names.hasMoreElements()){
			String headerName = names.nextElement();
			System.out.println(headerName);
		}
	}
}

http://localhost:8080/hello.he

🔔 MyServletHeader.java (코드 추가)

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

@WebServlet("*.he")
public class MyServletHeader extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	// http://localhost:8080/hello.he
		Enumeration<String> names = req.getHeaderNames();
		while (names.hasMoreElements()){
			String headerName = names.nextElement();
			String value = req.getHeader(headerName);
			System.out.println(headerName+" : "+value);
		}
	}
}

http://localhost:8080/hello.he


🔔 MyServlet.java (톰켓이 만들어준 메서드 사용)

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

@WebServlet("*.he")
public class MyServlet extends HttpServlet {
	
    @Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// http://localhost:8080/hello.do?username=ssar
		System.out.println("request 요청됨");
		System.out.println("getRequestURI : " + req.getRequestURI());
		System.out.println("getContextPath : "+req.getContextPath());
		System.out.println("getMethod : "+req.getMethod());
		System.out.println("getRequestURL : "+req.getRequestURL());
		System.out.println("getQueryString : "+req.getQueryString());
		System.out.println("getParameter : "+req.getParameter("username"));
		System.out.println("getSession().getId() : "+req.getSession().getId());
		System.out.println("getCharacterEncoding : "+req.getCharacterEncoding());
		System.out.println("getContentLength : "+req.getContentLength());
		System.out.println("getContentType : "+req.getContentType());
		System.out.println("Cookie Start ==============================");
		for (Cookie cookie : req.getCookies()) {
			System.out.print(cookie.getName()+" = " + cookie.getValue());
			System.out.print(";");
		}
		System.out.println();
		System.out.println("Cookie End ==============================");
		System.out.println("getProtocol : "+req.getProtocol());
		System.out.println("getServerPort : "+req.getServerPort());
		System.out.println("getLocalAddr(서버 IP) : "+req.getLocalAddr());
		System.out.println("getLocalName(서버 이름) : "+req.getLocalName());
		System.out.println("getRemoteAddr(요청자 IP) : "+req.getRemoteAddr());
		System.out.println("getRemoteUser(요청자 이름) : "+req.getRemoteUser());
		System.out.println("getRemotePort(요청자 포트) : "+req.getRemotePort());
		System.out.println("getLocale : "+req.getLocale());
	}
}


🔔 MyServletBuffer.java (http body 값 확인해보기)

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Enumeration;

@WebServlet("*.bu")
public class MyServletBuffer extends HttpServlet {

  @Override
  protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      // PostMan 으로 Post 요청
      // http://localhost:8080/hello.bu
      // 아파치/톰켓은 TCP에 연결된 소켓으로 정보를 읽어드린다.
      // 읽어 드린 정보를 다시 Servlet.java 파일에 넘겨주는데 크게 두분류로 나뉜다.
      // 1. header 정보, 2. body 정보 (body 정보는 getReader()를 통해서 읽는다.)
      BufferedReader br = req.getReader(); // 이 버퍼는 소켓 버퍼를 읽는게 아니라, 아파치/톰켓이 만든 버퍼에 접근
      StringBuilder sb = new StringBuilder();
      while(true){
          String input = br.readLine();
          if(input == null){
              break;
          }else{
              sb.append(input);
          }
      }
      System.out.println("1. 버퍼에 담긴 http body 데이터");
      System.out.println(sb.toString());
      System.out.println("2. header 정보");
      Enumeration<String> requestHeaderNames = req.getHeaderNames();
      while (requestHeaderNames.hasMoreElements()){
          String headerName = requestHeaderNames.nextElement();
          String value = req.getHeader(headerName);
          System.out.println(headerName+" : "+value);
      }
   }
}



🔔 MyServletResponse.java (http body 값 확인해보기)

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("*.resp")
public class MyServletResponse extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// http://localhost:8080/hello.resp
		resp.addHeader("metacoding", "youtuber");
		resp.addHeader("Set-Cookie", "password=9999");
		resp.addHeader("Content-Type", "application/x-www-form-urlencoded");
		PrintWriter out = resp.getWriter();
		out.println("username=ssar&email=ssar@nate.com");
	}
}

🔔 MyServletResponse.java (Content-Type 변경)

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("*.resp")
public class MyServletResponse extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {
		// http://localhost:8080/hello.resp
		resp.addHeader("metacoding", "youtuber");
		resp.addHeader("Set-Cookie", "password=9999");
		resp.addHeader("Content-Type", "text/html");
		PrintWriter out = resp.getWriter();
		out.println("username=ssar&email=ssar@nate.com");
    }
}    



🔔 실습

  1. MyServletResponse 파일을 수정!!
  2. Content-Type 에 들어가는 MIME 타입을 text/html 로 변경
  3. out.println()에 담을 response body 데이터에 html 을 작성해서 아래와 같이 출력되게 하시오.

profile
블로그 이전 : https://medium.com/@jaegeunsong97

0개의 댓글