[스프링의 정석] - Spring MVC - 클라이언트 서버, HTTP 요청과 응답

soon·2023년 4월 2일

원격 프로그램의 실행

  • 브라우저에 URL을 입력한 후 호출하면 컴퓨터에 있는 WAS프로그램이 ip주소를 받아 실행한다.

로컬 환경이 아닌 외부에서 프로그램을 실행하기 위해서는 2가지 일을 해야한다.
1. 프로그램 등록
2. URL과 프로그램을 연결

package com.fastcampus.ch2;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller   // 1. 프로그램 등록
public class Hello {
		
		@RequestMapping("/hello")  // 2. URL에 /hello를 호출하면 해당 main 메서드가 호출된다.
		public void main() {
				System.out.println("Hello");
		}

}
// 브라우저 URL : localhost:8080/ch2 

@Controller로 프로그램을 등록시켜줬으니 브라우저URL에 hello를 검색하면 main()메서드가 실행되어 main()메서드 안의 Hello가 호출된다.
이 때 main()메서드는 객체생성을 하지 않았지만, 톰캣에서 자체적으로 객체를 생성해주기 때문에 main()메서드의 호출이 가능하다.

클라이언트와 서버


클라이언트(client) : 서비스를 요청하는 애플리케이션
서버(server) : 서비스를 제공하는 애플리케이션

서버의 종류

어떤 서비스를 제공하냐에 따라 달라진다.
Email Service를 제공하면 Email server고
File Service를 제공하면 File server고
browser를 이용한 모든 Service를 제공하는게 Web server다.

서버의 포트

1대의 PC에 여러가지 서버를 제공할 수 있는데, 포트번호를 통해 구분한다.
ip주소 뒤에 prot번호를 적으면 어떤 서버로 요청할건지 구분한다.
ex
111.22.33.44:25 25 -> Email server
111.22.33.44:22 22 -> File server
111.22.33.44:80 80 -> Web server

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

웹 애플리케이션을 서비스하는 서버
서버에 모든 프로그램을 설치해서 클라이언트가 프로그램을 사용할 수 있게 해준다.

📌 WAS에 프로그램을 설치하면 한곳에서 update를 하고 클라이언트의 설치용량도 필요없기 때문에 클라이언트에 프로그램을 설치하는 것보다 효율적이다.

Tomcat의 내부 구조

Tomcat Server안에는 Service가 있고, 그 서비스를 처리하는 것이 Engine(Catalina)이다.
Engine안에는 여러개의 Host가 존재하고, Host안에는 여러개의 Context가 있다. Context는 Spring Project를 의미
Context안에 있는 Servlet은 Controller로 생각할 수 있다.
요청이 들어오면 Server(Tomcat)안에 Thread Pool이 대기하고 있다가 한가한 Thread가 도맡아 작업한다.

Tomcat내부구조

Tomcat의 설정파일 - server.xml, web.xml

  • 톰캣설치경로/conf/server.xml  : Tomcat 서버 설정 파일
  • 톰캣설치경로/conf/web.xml     : Tomcat의 모든 web app의 공통 설정
  • 웹앱이름/WEB-INF/web.xml    : web app의 개별 설정

공통 설정을 먼저 한 후에 개별 설정을 한다.

HTTP요청과 응답


HttpServletRequest

  • 웹 브라우저에서 URL을 입력 후 요청 → 톰캣이 HttpServletRequest객체 생성 후 URL 요청 정보를 담고 → main()의 매개변수로 넘겨준다.
    우리는 request객체를 이용해서 요청정보를 알 수 있다.

HttpServletRequest의 메서드

HttpServletRequestMethod
getQueryString()은 값을 전달할 때 사용한다.
getQueryString
&은 구분자로 사용하고 year=2021이, month=10, day=1이 저장된다.

서버가 제공하는 리소스에는 2가지가 존재한다.

  1. 동적 리소스
    : 실행하는 프로그램, 스트리밍

  2. 정적 리소스
    : 이미지 js, .css, *html 등등

프로토콜(protocol)이란?

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

HTTP(Hyper Text Transfer Protocol)란?

  • 텍스트를 전송하기 위한 프로토콜 약속이다.
  • 단순하고 읽기 쉽다.
  • 상태를 유지하지 않는다. (stateless) - 같은 클라이언트에서 요청이 와도 알지 못함. 클라이언트의 정보를 저장하지 않음
  • 쿠키와 세션을 사용해 이를 보완한다.
  • 확장 가능하다. - 커스텀 헤더(header) 추가 기능, 우리가 원하는 대로 추가가 가능하다.

HTTP 메시지

브라우저에 URL을 입력해서 전송하면 요청 메시지가 서버로 전달된다.

<!-- 요청 메시지 -->
GET/ch2/hello HTTP/1.1
Host : 111.22.33.44.8080
Connection:keep-alive
Cache-Control:max-age=0
Accept-Encoding:gzip, deflate, br

서버는 요청을 받고 응답 메시지를 전송한다.

<!-- 요청 메시지 -->
GET/ch2/hello HTTP/1.1
Host : 111.22.33.44.8080
Connection:keep-alive
Cache-Control:max-age=0
Accept-Encoding:gzip, deflate, br

HTTP 메시지 - 응답 메시지 형식

HTTP/1.1 200 OK  <!-- 상태코드 : 200 OK 성공했다는 의미 -->
Content-Length : 44
Content-Type : text/html
Date : Sat, 20 Oct 2021 19:03:38 GMT   <!-- 상태코드 아래는 헤더 N줄 -->

<html>
<head></head>
<body>Hello</body>
</html>
상태코드의미
1XXInformational
2XXSuccess 성공
3XXRedirect 다른 URL요청
4XXClient Error 클라이언트 에러
5XXServer Error 서버 처리중 에러

HTTP 메시지 - 요청 메시지

<!-- Http 요청 메시지 - GET -->
GET/ch2/getYoil?year=2021&month=12&day=1 HTTP/1.1
Host:111.22.33.44:8080
User-Agent:Mozilla/5.0(Windows NT 10.0)
Accept:text/html
Connection:keep-alive

쿼리스트링에 데이터를 직접 입력해서 보낸다. 바디에 첨부 X
리소스를 요청해서 데이터를 얻어오기 위함이며, read 읽기 전용

<!-- Http 요청 메시지 - POST -->
POST/ch2/getYoil HTTP/1.1
Host:111.22.33.44:8080
User-Agent:Mozilla/5.0(Windows NT 10.0)
Accept:text/html
Connection:keep-alive

<!-- 바디 -->
year=2021&month=12&day=1

바디 부분에 데이터를 저장해서 서버로 보낸다.
write글쓰기, 로그인, 회원가입, 파일첨부 등에 많이 사용

HTTP 메서드 - GET, POST

GETPOST
. 서버의 리소스를 가져오기 위해 설계. 서버에 데이터를 올리기 위해 설계
. Query String을 통해 데이터를 전달 (소용량). 전송 데이터 크기의 제한이 없음 (대용량)
. URL에 데이터 노출되므로 보안에 취약함. 데이터를 요청 메시지의 body에 담아 전송
. 데이터 공유에 유리. 보안에 유리, 데이터 공유에는 불리
ex. 검색엔진에서 검색단어 전송에 이용ex. 게시판에 글쓰기, 로그인, 회원가입에 사용

텍스트 파일 vs 바이너리 파일

바이너리 파일 : 문자와 숫자가 저장되어 있는 파일
텍스트 파일    : 문자만 저장되어 있는 파일, 사람이 읽기가 쉽다.

파일 종류쓰기읽기
바이너리문자 → 문자
숫자 → 숫자
문자 → 문자
숫자 → 숫자
텍스트문자 → 문자
숫자 → 문자
문자 → 문자
문자 → 숫자

MIME ( Multipurpose Internet Mail Extensions )

텍스트 기반 프로토콜 바이너리 데이터이미지, 동영상를 전송하기 위해 고안한 것이다.
HTTP의 Context-Type헤더에 사용한다. 데이터의 타입을 명시하는 것


Base64 - 64진법

바이너리 데이터를 텍스트 데이터로 변환할 때 사용
64진법은 ‘0’~’9’, ‘A’~’Z’, ‘a’~’z’, ‘+’, ‘/’ 모두 64개의 문자로 구성
26 + 26 + 10 + 2 = 64개 ( 6bit )의 문자로 구성


0개의 댓글