[Java] Web, Server, Servlet, API

JH·2023년 4월 17일

Java

목록 보기
12/21

1. TIL

Ex URL) http:// localhost:8080/BoardWeb/index.html

프로토콜 : 자원에 접근하기 위해 서버와 통신하는데 사용되는 통신규약 (http)
호스트명 : 자원을 제공하는 서버의 이름 (localhost)
포트번호 : 통신에 사용되는 서버의 포트번호 (8080)
경로명 : 접근하려는 자원이 저장된 서버상의 위치 (BoardWeb)
파일명 : 접근하려는 자원의 이름 (index.html)
쿼리 (query) : URL에서 ? 이후 부분, key = value로 구성
참조 (anchor) : URL에서 # 이후 부분


A. Server

1. Web Server

웹 브라우저를 클라이언트로부터 HTTP요청을 받아들이고 HTML 문서와 같은 웹 페이지를 반환

  • 정적 컨텐츠 제공

  • 동적 컨텐츠를 위한 요청 전달

2. WAS(Web Application Server)

인터넷 상에서 HTTP프로토콜을 통해 사용자 컴퓨터나 장치에 어플리케이션을 수행해주는 미들웨어

MDN HTTP 설명 https://developer.mozilla.org/ko/docs/Web/HTTP

JAVA 기반 서블릿 컨테이너또는 웹 컨테이너만 있는 웹 애플리케이션 서버
https://tomcat.apache.org/


3. Web Server와 WAS

  • 기능을 분리하여 서버의 부하 방지

  • 물리적으로 분리하여 보안 강화

  • 여러대의 WAS 분산시켜 서비스를 제공



B. Servlet

동적 웹 페이지를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술

HttpServlet을 상속받아서 사용해야함

특징

  • 클라이언트의 Request에 대해 동적으로 작동하는 웹 어플리케이션 컴포넌트
  • 기존의 정적 웹 프로그램의 문제점을 보완하여 동적인 여러 가지 기능을 제공

  • JAVA의 스레드를 이용하여 동작

  • MVC패턴에서 컨트롤러로 이용됨

  • 하나의 서블릿에 두 개 이상의 mapping-url을 사용할 수 있음

Life Cycle (생명주기)

container 가 관리함
container의 역할 : 객체 생성을 알아서 해줌 (싱글톤), MVC-패턴의 controller로 사용됨

  1. 초기화 : init()
    • 서블릿 요청 시 맨 처음 한 번 호출
    • 서블릿 생성 시 초기화 작업

  1. 작업 수행 : doGet(), doPost(), ...
    • 서블릿 요청 시 매번 호출
    • 클라이언트가 요청하는 작업 수행

  1. 종료 : destroy()
    • 서블릿이 기능을 수행하고 메모리에서 소멸
    • 서블릿의 마무리 작업


C. API

래퍼런스 ?
https://javaee.github.io/javaee-spec/javadocs/javax/servlet/http/HttpServlet.html

1. HttpServletRequest

  • client가 전송하는 데이터를 보유하고 서버에 제공하는 기능
  • 요청하는 client 의 정보를 모든 정보 보유
    • String getParameter()

2. HttpServletResponse

  • 요청한 client에게 응답하는 기능
  • 주요 메소드
    • PrintWriter getWriter()
    • setContentType()

3. HttpServlet (추상클랫 )

  • client와 server간의 인터넷상 통신 규약인 http를 이미 완벽에 가깝게 구현한 클래스
  • 사용자 정의 servlet 들이 상속
  • 주요 메소드
    • protected void doGet(HttpServletRequest, HttpServletResponse)
    • protected void doPost(HttpServletRequest, HttpServletResponse)

4. 예시 (로그인 성공, 실패)

tomcat Server사용, Dynamic Web Project로 생성


어노테이션의 url-Mapping을 간략하게 사용할 수 있음
@WebServlet("/check")

같은 url 이라면 어노테이션, xml 중 하나만으로 표현해야함

webapp의 web.xml 파일에서의 url-Mapping

<!-- 1. 대상 서블릿 지정 -->
  <servlet>
  	<servlet-name>FirstServlet</servlet-name>
  	<servlet-class>step01.FirstServlet</servlet-class>
  </servlet>
  
  <!-- 2. 서블릿 매핑 url 지정 (단일, 다중) -->
  <servlet-mapping>
  	<servlet-name>FirstServlet</servlet-name>
  	<url-pattern>/first</url-pattern>
  </servlet-mapping>

getParmeter(key) : 해당 key의 value를 받음

login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
	<h1>Login</h1> <!-- action에 서버 경로 지정 -->
	<form action="check" method="POST">
		<input type="text" name="id">
		<input type="submit" value="로그인">
	</form>
</body>
</html>

Validation (view)

@WebServlet("/valid")
public class Validation extends HttpServlet {
	private static final long serialVersionUID = 1L;

	// 같은 데이터 값을 연결하려면 같은 방식으로 연결해야됨 POST
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String id = request.getParameter("id");
		
		response.setContentType("text/html; charset=UTF-8");
		
		PrintWriter out = response.getWriter();
		out.println("Welcome, " + id);
	}
}

Invalidation (view)

@WebServlet("/invalid")
public class Invalidation extends HttpServlet {
	private static final long serialVersionUID = 1L;

	// redirect는 실패에 대한 재요청을 해야하기 때문에 doGet을 써야함
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PrintWriter out = response.getWriter();
		out.println("Not User");
	}
}

IdCheck (controller)

@WebServlet("/check")
public class IdCheck extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// login.html - id : dev 로그인 성공 페이지로 이동 / 실패 페이지로 이동
		String id = request.getParameter("id");
		System.out.println(id);
		request.setCharacterEncoding("UTF-8");
		
		// forward(상태 데이터 값 유지 : 성공) vs redirect(상태 유지 불필요 : 실패)
		if ("dev".equals(id)) {
			// 성공 페이지로 이동 valid
			request.getRequestDispatcher("valid").forward(request, response);
		} else {
			// 실패 페이지로 이동 invalid
			response.sendRedirect("invalid");
		}
	}
}


2. 에러

문제점 : 화면에 한글이 출력되지 않음

response.setContentType("text/html; charset=UTF-8");

문제점 : 체크박스로 된 값을 가져와야 함

request.getParameter()

url-Mapping에서 대소문자 때문에 예외가 발생할 수 있음


3. 보완 해야 할 것

관련된 개념이나 사용법은 크게 어렵지 않으나 조금 폴더 구조에 대해 더 이해가 필요함
위 폴더구조 때문에 action에 입력할 서버 경로를 제대로 지정하지 못함


4. 느낀점

첫 Web은 기존에 알던 지식과 비슷한 부분이 많아서 크게 어렵지 않았음
대신 사용자의 부주의나 사용환경에 따라 예외가 더 많아지므로 더 신경써야할 부분이 많아짐
window 와 mac은 환경설정, 셋팅에서 더 많이 달라지는 것 같음, jdk버전을 달리 쓰고 있어서 폴더구조가 많이 헷갈림

profile
잘해볼게요

0개의 댓글