본문 바로가기
[패스트캠퍼스] Spring/스프링의 정석 : 남궁성과 끝까지 간다

Ch.02 Spring MVC (05~08)

by 엑츄얼리 2022. 5. 11.

05. 클라이언트와 서버

1. Browser를 이용하여 URL을 통해 Request 할 때

 a. Tocmat이 Request 객체를 생성하여 정보를 저장

 b. 해당 객체를 Mapping 된 Method에 저장

 c. Method를 통해 원하는 Request 정보를 획득 가능

 

 1-1. Request 정보 획득 방식

 - Enumeration enum = request.getParameterNames();   (Enumeration : iterator의 구버전)

 - Map paramMap = request.getParameterMap();          => key : value 형태로 데이터를 저장

 - String[] yearArr = request.getParameterValues("year"); => String Arr 형태로 데이터를 저장

 

 

2. 서버의 종류

 - Email Server(Port 25), File Server(Port 22), Web Server(Port 80)

    * Web Server는 브라우저로 할 수 있는 모든 것을 제공

 - PC가 1개의 IP에 있는 여러 개의 Server에 접근 시 어떤 서버에 접근하는지는 Port를 통해 구분

     (port가 서버와 Binding 되어있다. = Port가 서버를 Listening 하는 상태)

 - Port Number 1~1023까지는 시스템에 예약되어 있음 (~65535까지 사용 가능)

 

 

3. WAS (Web Application Server)

 - 서버에 Application을 Service

 - Server에 프로그램을 설치해 두고 Client가 해당 프로그램을 사용할 수 있게 해 줌(Update 용이 : Server만 업데이트)

 

 

4. Tomcat 내부 구조

 - Context 하나가 1개의 WebApp Project이고 내부에 여러 개의 Servlet(작은 서버 프로그램)을 포함하고 있음

 

 4-1. Debug 모드로 Tomcat을 구동하여 확인

 TwoDice.java <int idx2 = (int) (Math.random() * 6) + 1>에 중단점 -> tomcat을 debug mode로 실행

  Debugger -> Frame에서 확인 가능

 - 위에 빨간 박스 아래부터 순서대로 처리된 것

Request -> ThreadPool -> HttpProcessor(request, response 객체 생성)

 -> Engine -> Host -> Context -> Filter -> DispatcherServlet -> Controller

 

 

6. Tomcat 설정 파일 - Server.xml, web.xml

 - 톰켓 설치경로/conf/server.xml     : Tomcat 서버 설정 파일

 - 톰켓 설치경로/conf/web.xml       : Tomcat의 모든 web app의 공통 설정

 - 웹앱 이름      /WEB-INF/web.xml : web app의 개별 설정

 

1. WEB-INF/web.xml

 1) Servlet 등록 (Spring의 @Controller와 연동, Servlet의 @WebServlet과 연동)

 2) URL 연결    (Spring의 @RequestMapping과 연동)

 

 a. 원격 프로그램 등록

<servlet>
    <servlet-name>dispatcher<servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

  

 b. 원격 프로그램 URL 맵핑

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

 

 

7. HTTP 요청과 응답

1. 프로토콜 (protocol)

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

 

 

2. HTTP(Hyper Text Transfer Protocol)

 - 단순하고 읽기 쉽다. (Text기반의 Protocol -Human Readable)

 - 상태를 유지하지 않는다. (Stateless - 클라이언트에 저장 X)

   ex. 같은 Client가 Request를 2번 보내도 Server는 알 수 없다. => 이를 보안하기 위해 Coockies와 Session을 사용

 - 확장 가능하다. (Custom Header 추가 가능)

 

 2-1. Http Response Message

  a. Http Response Message Format

Http/1.1 200 OK => Status Line
[Header N Line]
[헤더와 바디를 구분하기 위한 빈줄]
[바디]

 

  b. Header

HTTP/1.1 200 OK                    
Context-length:1024                
Context-type:text/html
Date:Sat,20 OCT 2021 19:03:38 GMT

 - HTTP/1.1 200 OK : HTTP 응답 메시지

 - 아래는 {Header-Name} : {Value}의 형태로 기입되며, 공백이 무시되고, 대소문자가 구별되지 않는다.

 

  c. Body

<html>
<body>
.
.
.
</body>
</html>

 

 - 상태 코드

 

 2-2. Http Request Message

   a. Ex

<!--URL (http://111.22.33.44.:8080/ch2/hello) 입력시 -->
GET/ch2/hello HTTP/1.1
host://22.33.44:8080
connection:keep-alive
cache-control:max-age=0
accept-encoding:gzip,deflate,br

 - Server에서 Request를 처리 후 Response 메시지를 생성 및 전송

 

 a. GET - Server를 통해 Resource 요청 (Read)

<!--URL (http://localhost:8080/ch2/getYoil?year=2021&month=10&day=1) 입력시 -->
[Header]
GET /ch2/getYoil?year=2021&month=10&day=10 HTTP/1.1 => Request Line

[Body 없음]

 

 b. POST - 게시판 글쓰기, 글쓰기, 로그인, 회원가입

<!--URL (http://localhost:8080/ch2/getYoil?year=2021&month=10&day=1) 입력시 -->
[Header]
POST ch2/getYoil HTTP/1.1 => Request Line

[Body]
year=2021&month=10&day=1

 

 

3. HTTP 메서드 - GET, POST

 * https:// = HTTP + TLS (암호화 Protocol, 이전에는 SSL)

                 HTTP와 TLS의 결합을 통해 보안성 향상

 

 3-1. Request Message 확인

  URL 입력 -> F12 -> Network -> Name -> 원하는 Request 클릭 -> Header를 통해 HTTP 메시지 확인

 

 

8. 텍스트와 바이너리, MIME, base64

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

  - 바이너리 파일 : 문자와 숫자가 저장되어있는 파일

  - 텍스트 파일 : 문자만 저장되어있는 파일 (저장 시 숫자 -> 문자로 변환하여 저장)

 * 메모장으로 열었을 때 읽을 수 있으면 텍스트 파일, 읽을 수 없으면 바이너리 파일

 

1-1. 바이너리와 텍스트에서 숫자 12 저장 방식

  - 바이너리(4byte) : 00 00 00 AC

  - 텍스트 (2byte)   : 31 32

  * 1byte = 8bit, 바이너리의 AC를 예로 들면 16진수 2자리로 4bit + 4bit = 8bit

 

 

2. MIME (Multipurpose Internet Mail Extension)

 - 텍스트 기반 프로토콜에 바이너리 데이터를 전송하기 위해 고안

 - HTTP Content-type Header에 사용, 데이터의 타입 명시

 

 

3. PostMan

 - Chrome 확장 프로그램 : Postman - Rest Client

 

 

 3-1. Preview를 통해 Request Message 확인

 

 3-2. RequestHeader.java 을 통해 Header 확인

@Controller
public class RequestHeader {
    @RequestMapping("/requestHeader")
    public void main(HttpServletRequest request) {

        Enumeration<String> e = request.getHeaderNames();

        while (e.hasMoreElements()) {
            String name = e.nextElement();
            System.out.println(name + ":" + request.getHeader(name));
        }
    }
}

 

URL : http://localhost:8085/ch2/requestHeader 에 접근 시 아래와 같이 Request Header Message 확인 가능

 

 

4. Base64 (64진법) - 6bit

 - ASCII : 7bit로 용량을 축소시킬 수 있음(시스템 명령어들도 포함되어있으므로, 텍스트 데이터에서는 쓸모없음)

 

 - 바이너리 데이터를 텍스트 데이터로 변환할 때 사용

 

 '0'~'9'[10개] + 'a'~'z'[26개] + 'A'~'Z'[26개] + '+' + '/' = 64

 

 * image를 Base64로 변환하여 (Binary to Text) 아래와 같은 방식을 통해

   이미지를 저장하지 않고도 안전하게 불러올 수 있음

<img src="data:image/jpeg;base64, {image to base 64 text}>

 a. https://www.base64encode.org/ 이 페이지에서 이미지를 Base64 format으로 변환

 

 b. 소스코드 및 실행 화면

댓글