본문 바로가기

[NIPA] AI+ 웹개발 취업캠프 (프론트엔드&백엔드)/[백엔드 과정] 과제 업로드

AI 서비스 완성! AI 웹개발 취업캠프 - 백엔드 과제 제출 [NIPA/정보통신산업진흥원]

8월 9일 과제

 

  1. HTTP 헤더에 부분에 Connection 키라는 값 중 Keep-alive라는 옵션이 있음. 이것이 무엇인지 http를 사용하는데 대한 역할과 어떤 상황에서 사용되는지 알아보기
  2. JSON 파일에 대해 간략히 알아보고 Python으로 json 파일을 Read, write 할 수 있는 코드 제출하기 (json 파일에 대한 스터디 자료도 제출)

HTTP 프로토콜의 Keep-Alive 기능은 클라이언트와 서버 간 요청 및 응답 과정을 효율적으로 유지하기 위해서 사용함. 

Keep-Alive를 활성화하면 하나의 TCP 연결을 여러 번 재사용하여ㅛ 응답과 요청을 수행 할 수 있다. 

 

Keep-Alive란?

HTTP 프로토콜에서 클라이언트와 서버 간 여러 요청을 단일 TCP 연결을 재사용하는 방식으로 기능을 말한다. 

HTTP/1.1 프로토콜부터 도입됨. 이 기능을 활성화 하면 여러 HTTP 요청 및 응답 과정에서 발생하는 네트워크 오버헤드를 줄일 수 있습니다.

 

Keep-Alive를 사용하는 경우 HTTP 요청 헤더에 Connection:Keep-Alive라는 값을 포함됨. 

HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Thu, 11 Aug 2016 15:23:13 GMT
Keep-Alive: timeout=5, max=1000
Last-Modified: Mon, 25 Jul 2016 04:32:39 GMT
Server: Apache

(body)

사용 이점


Keep-Alive가 없으면 클라이언트와 서버는 각 요청과 응답에 대한 매번 새로운 TCP 연결을 생성하고 닫아야함. 

이 빙식은 네트워크 리소스가 비효율적으로 사용됩니다.  반면 Keep-Alive를 사용하면 단일 TCP 연결에서 여러 요청과 응답이 이루어지기 때문에 네트워크 지연 시간이 줄어들고 웹 사이트 성능이 좋아집니다. 

 

초기 HTTP/1.0 프로토콜에서는 각 HTTP 요청에 대해 매번 TCP 연결을 새로 생성해야 했기 때문에 위에서 언급한 문제들이 존재했습니다.  이를 해결하기 위해서 HTTP/1.1 프로토콜에 대한 기능이 도입되었습니다. 

 

keep-alive의 상황을 비유하자면, 전화 통화하는 상황을 떠올릴 수 있습니다. 한 고객이 고객센터에 전화를 걸어 제품에 대해 궁금한 정보를 하나씩 묻는다고 해봅시다. 이때 하나의 질문을 할 때마다 대답을 듣고 전화가 끊어진다고 생각해 보세요. 전화를 걸고 다시 물어보는 과정이 반복된다면 매우 피곤할 것입니다. 한번 연결된 전화를 통해 모든 궁금증을 해결할 수 있는 편이 훨씬 효율적입니다.

 

 

예시) keep-alive 활성화 vs 비활성화


1. keep-alive 비활성화

웹 브라우저가 웹 서버에 html 페이지를 요청합니다. 웹 서버는 html 페이지를 전송하고 연결을 종료합니다. 웹 브라우저가 이미지 파일을 요청하기 위해 새로운 연결을 맺습니다. 웹 서버는 이미지 파일을 전송하고 연결을 종료합니다.

 

2. keep-alive 활성화

웹 브라우저가 웹 서버에 html 페이지를 요청합니다. 웹 서버가 html 페이지를 전송하고 연결을 유지합니다. 웹 브라우저가 이미지 파일을 요청합니다. 이때 기존 연결을 재사용해서 요청을 전송합니다. 웹 서버는 이미지 파일을 전송하고 연결을 유지합니다. 이 과정이 반복됩니다.

 

 

정리)HTTP/1.1에서 KEEP-Alive로 인한 장점은 무엇일까? 

  1. 3-way handshake로 인한 지연시간을 줄여줌
  2.  CPU 사용량을 줄여준다: 새로운 TCP 연결을 만들기 위해서 CPU, 메모리 사용과 같은 많은 리소스가 필요하다. 연결된 커넥션을 재사용하기 때문에 로드가 적다. 
  3. HTTP 파이프라인 커넥션: 여러 개의 요청을 파이프라이닝 할 수 있다.  

참고) https://change-words.tistory.com/entry/HTTP-Keep-Alive

 


 

1. JSON(JavaScript Object Notation)이란?

  • JSON은 경량(Lightweight)의 DATA-교환 형식
  • Javascript에서 객체를 만들 때 사용하는 표현식을 의미한다.
  • JSON 표현식은 사람과 기계 모두 이해하기 쉬우며 용량이 작아서, 최근에는 JSON이 XML을 대체해서 데이터 전송 등에 많이 사용한다.
  • 특정 언어에 종속되지 않으며, 대부분의 프로그래밍 언어에서 JSON 포맷의 데이터를 핸들링 할 수 있는 라이브러리를 제공한다.

2. JSON(JavaScript Object Notation) 형식

2.1 name-value 형식의 쌍(pair)

  • 여러 가지 언들에서 object, hashtable, struct로 실현되었다.
  • { String key : String Value}
{
  "firstName": "K",
  "lastName": "DK",
  "email": "spikedk220@gmail.com"
}

2.2 값들의 순서화된 리스트 형식

  • 여러 가지 언어들에서 배열(Array), 리스트(List)로 실현되었다.
  • [ value1, value2, ….. ]
{
  "firstName": "K",
  "lastName": "DK",
  "email": "spikedk220@gmail.com",
  "hobby": ["code","read"]
}

3. JSON Library - Jackson(Java) 적용하기

  • JSON은 쉽게 객체(Object)로 바꿔주거나 객체(Object)를 JSON으로 바꿔주는 Library가 대부분 언어에서 존재한다.
  • Jackson : https://github.com/FasterXML/jackson
  • Spring Framework 를 사용하여 예시를 들어보이겠다.

 

3.1 Maven의 pom.xml의 추가하기

  • Jackson이라고 치면 가장 위에 보이는 Jackson Databind를 선택한다.

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.1</version>
</dependency>

3.2 @ResponseBody를 사용하여 JSON형태로 응답하기

  • Controller를 통해 View로 넘어가지 않고 데이터(JSON OR XML)를 넘겨 줄 수 있다.
  • Spring 3.1에서부터 을 사용하면 HttpMessageConverter가 자동으로 등록된다.
  • @ResponseBody : Return 값은 View를 통해서 출력되는 것이 아니라 HTTP Response Body에 직접쓰여진다.
  • annotation-driven 활성화 하기
<mvc:annotation-driven></mvc:annotation-driven>
  • RestfulController의 getUserList 코드
@RequestMapping(value = "/users", method = RequestMethod.GET)
@ResponseBody
public Map getUserList(){
  List<Offer> userList = offersService.getCurrent(); // DB에 등록된 User List를 받아온다.
  Map result = new HashMap();

  result.put("result",Boolean.TRUE);
  result.put("data",userList);

  return result;
}

 

3.3 서버를 작동시켜 확인해보기.

  • RequestMapping된 주소인 http://localhost:8080/users 확인해보자.
  • 결과 모습 : 잘 도착했지만 보기가 불편하다.

 

3.4 PostMan을 통해 예쁘게 보자.

 

 

참고) https://nesoy.github.io/articles/2017-02/JSON

 

본 후기는 정보통신산업진흥원(NIPA)에서 주관하는 <AI 서비스 완성! AI+웹개발 취업캠프 - 프론트엔드&백엔드> 과정 학습/프로젝트/과제 기록으로 작성 되었습니다.