웹 페이지는 객체(objects)들로 구성되며 웹 페이지는 보통 참조 객체들이 포함된 기본 HTML 파일이다.

따라서 클라이언트가 웹 페이지에 방문하여 시각적으로 보기 위해서는 기본 HTML 및 객체 정보를 받을 필요가 있는데 이때 사용하는 프로토콜이 HTTP 프로토콜이다.

(HTTP 프로토콜은 웹상에서 불특정 다수와 통신이 가능하도록 설계된 프로토콜)

 

프로토콜 이란?

  • 서로 간의 통신을 위한 약속, 규칙
  • 주고 받을 데이터에 대한 형식을 정의한 것

HTTP(Hyper Text Transfer Protocol)

  • 클라이언트-서버 모델
  • 텍스트 기반의 프로토콜이라 단순하고 읽기 쉽다. (Human Readable)
  • 상태를 유지하지 않는다. 즉 클라이언트의 정보를 저장 하지 않음 (stateless)
    • 따라서 같은 클라이언트가 보낸 요청도 구분하는 것이 불가능 
    • 해결책: Cookie(클라이언트에 정보 저장)와 Session(서버에 정보 저장), JWT를 통해 보완 가능
  • 비 연결성 서버가 클라이언트 요청에 대해 응답을 마치면 맺었던 연결을 끊어 버린다. (Connectionless)
    • 해결책: Keep-Alive 헤더 속성 사용(단 성능 하락 주의)
  • 커스텀 헤드를 추가 하여 확장이 가능하다.
  • 포토 번호 80번을 사용한다.
  • 트랜스포트 계층의 TCP 프로토콜을 사용한다. (신뢰성 있는 전송을 보장)
  • 애플리케이션 계층의 프로토콜이다.

HTTP 종류

  • HTTP/1.1, HTTP/2는 TCP 기반 위에서 동작
  • HTTP/3는 UDP 기반 위에서 동작

HTTP 메시지

요청 메시지: 클라이언트가 URL을 입력시 해당 프로토콜을 사용하여 전송

  • GET
    • 리소스를 얻는 것이 목적 Read 하는 방식
    • 바디 정보 없음, 헤더 정보만 존재
      • 대신 querystring으로 추가 데이터를 보내는 것이 가능
    • 서버에서 리소스를 얻어 올 때 사용
    • 소용량 데이터 전달
    • 보안에 취약
    • 데이터 공유에 유리 
  • POST
    • 리소스를 Write 하는 방식
    • 바디 정보 있음
      • 서버에 전송할 데이터 존재
    • 서버에 정보를 제공해야 할 때 사용
    • 바디 정보를 통해 대용량 데이터 전달 (제한 x)
    • TLS 암호화 프로토콜 (구 SSL)을 같이 사용할 경우 보안에 유리
    • 데이터 공유에는 불리  

응답 메시지: 서버가 클라이언트의 요청에 응답 하여 전송하는 메시지

  • 상태 코드:
    • 1xx Information: HTTP 1.1 때 추가됨 (정보 교환)
    • 2xx Success: 접속 성공
    • 3xx Redirect: 다른 URL로 요청해라
    • 4xx Client Error: 클라이언트가 요청을 잘못 한 경우 ex 404 not Found
    • 5xx Server Error: 서버가 클라이언트 요청을 처리하는게 실패 한 경우

+HTTP 에서 Java를 직접적으로 사용이 불가능

  • 웹에서 자바를 처리하기 위해서 Tomcat 등장

클라이언트와 서버는 역활에 따라 구분되어진다.

  • 클라이언트: 서비스를 요청하는 애플리케이션 혹은 컴퓨터  (요청) +저장된 정보를 DB에 보관, 처리, 관리
  • 서버: 서비스를 제공하는 애플리케이션 혹은 컴퓨터 (응답)

서버는 또 다시 어떤 서비스를 제공하느냐에 따라 여러 종류로 나뉘게 된다.

  • Email server: 이메일 서비스를 제공
  • File server: 파일 제공
  • Web server: 브라우저를 통해서 받을 수 있는 모든 서비스를 제공!

실제 운영시에는 컴퓨터 한대에 소프트웨어 한 개를 주로 사용하지만 

컴퓨터 한 대에 여러 서버 소프트웨어를 설치할 수 있다 

ex 웹 서버와 메일 서버를 같은 컴퓨터에 설치 -> 웹 겸 메일 서버가 됨

 

만약 다음과 같은 서버 컴퓨터에 요청이 들어올 경우 어떤 요청인지 구분을 어떻게 할 수 있을까?

정답: 포트 번호를 통해 요청을 구분한다.

각각의 포트 번호는 각 서버랑 binding 되어 있으며 서버가 해당 포트를 통해 Listening 하고 있다.

+ 포트 번호 0~1023 까지는 예약이 되어 있으며 그것을 제외한 나머지 포트를 사용해야 하는데 약 6만 개의 포트를 사용 가능하다.

 

웹 애플리케이션 서버(WAS): 

  • Application(프로그램)
  • 하는 일: 서버에 프로그램을 설치해두면 클라이언트가 해당 프로그램을 사용하게 해준다
  • 사용하는 이유: 설치된 서버 1곳 만을 업데이트 하면 되기에 업데이트 용이성이 확보되며 클라이언트의 저장 공간을 절약해줄 수 있기 때문에

Tom Cat(WAS)의 작동 방식:

  1. 클라이언트가 브라우저에서 도메인 주소와 Tom Cat의 포트번호 8080 입력 (ex: http://www.suhanlim.com/event/list:8080)
  2.  tomcat 내부에 있던 Thread Pool중에 한가한 Thread가 사용자 요청 처리
    1. Connector 파트에서 입력한 도메인 주소의 프로토콜 방식 매칭 ex: http: 는 HTTP1.1 프로토콜 
    2. Engine 파트에서 입력한 도메인의 Host 매칭 일반적으로는 한 개씩만 존재하나 tomcat은 여러개의 도메인이 존재가능 ex: www.suhanlim.com
    3. Engine 파트안의 Context 매칭 Context는 하나의 Web App 즉 Spring 기준 하나의 STS 프로젝트 ex: event
    4. Context 파트안의 Servlet 매칭 작은 서버 프로그램 (서버에서 실행되는 작은 프로그램)==컨트롤러 클래스 내부 main 함수 ex: list 

 

 

 

 

스프링의 정석 : 남궁성과 끝까지 간다 학습 내용 정리

package com.mytistory.ch2;

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

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

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class GetBirthday {
	@RequestMapping("/getBirth")
	public void main(HttpServletRequest request, HttpServletResponse response) {
		String year = request.getParameter("year");
		String month = request.getParameter("month");
		String day = request.getParameter("day");
		
		response.setContentType("text/html");
		response.setCharacterEncoding("utf-8");
		PrintWriter out=null;
		try {
			out = response.getWriter();
		}
		catch(IOException e) {
			return;
		}
		out.println("생년월일은: "+year+"년 "+month+"월 "+day+"일 입니다.");
		
	}
}

톰캣 서버로 실행 후 브라우저에서 http://localhost:8080/getBirth?year=2021&month=10&day=1 (request)

다음과 같이 URL 입력 시: 톰캣 서버가 요청을 받고 HttpServletRequest 객체와 HttpServletResponse 객체를 생성할 때  굵은 글시체 부분(쿼리 스트링)이 전달이 되어

getParameter() 함수를 통해 해당 String을 가지고 온다. 

 

HttpServletResponse 객체의 메소드 활용

setContentType("text/html"), setCharacterEncoding("utf-8") 을 통해 데이터 형식과 인코딩 방식을 알려주고

(+ 브라우저는 보내는 내용이 text인지 binary 인지 모르기 때문에 명시를 해주어야 한다.)

getWriter()를 통해 출력 스트림을 가지고 와서 해당 브라우저로 출력

 

PrintWriter: 자바에서 문자 단위 입출력을 위한 하위 스트림 클래스  

'Development > Spring' 카테고리의 다른 글

Spring의 4개의 저장소  (0) 2023.01.19
HTTP 프로토콜의 바이너리 파일 전송  (0) 2023.01.08
웹과 HTTP 프로토콜  (0) 2023.01.06
클라이언트와 서버  (0) 2023.01.05
Spring 원격 프로그램 실행 과정  (0) 2023.01.04

로컬 프로그램 실행

  • 개발 환경에서 인터프리터로 실행 파일(exe)을 만들어 실행

원격 프로그램 실행

  • 준비물: 브라우저, WAS(웹 애플리케이션 서버) ex 톰캣 
    1. 프로그램(Servlet) 등록 (@Controller) - Annotation
    2. URL과 프로그램을 매핑 (@RequestMapping()) - Annotation
// web.xml 파일내용 위에는 해당 방식을 Annotation 방식으로 한 것
<servlet>
	<servlet-name>appServlet</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>
		
<servlet-mapping>
	<servlet-name>appServlet</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>
  • 과정:
    • 브라우저에서 URL 입력 엔터 -> 서브넷 주소:포트넘버 (호출)
    • 해당 정보 객체 생성 (톰캣)
      • 이때 해당 클래스의 (1)접근 지정자와 (2)static, non-static 여부 상관없이 생성 가능
    • WAS가 요청을 받고 해당 프로그램 실행 
웹 애플리케이션 서버(AWS)는 웹 애플리케이션과 서버 환경을 만들어 동작시키는 기능을 제공하는 소프트웨어 프레임워크이다. 인터넷 상에서 HTTP를 통해 사용자 컴퓨터나 장치에 애플리케이션을 수행해 주는 미들웨어로 볼 수 있다. -위키 백과-
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class Hello {
	@RequestMapping("/hello") 
	private void main() { 
		System.out.println("Hellow");
	}
}

 

(1) 위에 코드가 접근 지정자가 private 임에도 웹 서버를 통해 동작이 되는 이유:

Spring 은 Reflection API를 이용해 객체를 만들기 때문이다.

 

Reflection API란 ?

  • 클래스 정보를 얻고 다룰 수 있는 매우 강력한 기능을 제공하는 API 
  • java.lang.reflect 패키지를 통해 제공
  • 구체적인 클래스 명을 알지 못 하여도 메소드에 접근을 가능하게 해줌
    • JVM 위에서 자바 프로그램이 실행 될 때 해당 코드가 컴파일 되며 바이트 코드로 변환되 static 영역에 저장되는데 Reflection API가 해당 정보를 참조 하기 때문에 해당 기능이 가능하다.

(2) 에 코드가 static 속성이 아님에도 웹 서버를 통해 동작이 되는 이유:

위에 과정에도 말했듯이 웹 서버 애플리케이션(AWS)가 요청을 받으면 해당 정보를 바탕으로 인스턴스(객체)를 만들기 때문에 non-static 속성인 클래스의 내용도 실행이가능 

 

+ non-static 속성으로 만드는 것이 권장되는 이유: static 매소드는 static 변수만 접근이 가능한 반면 

non-static 메소드는 non-static 변수와 static 변수 모두 접근이 가능하기 때문이다.

+ Recent posts