약 2주간 http/https 프로젝트를 진행하였다.
리눅스 상에서 총 프로그램은 3개이다.
ServerProviderViewerTx 서버와 Rx 서버를 별도로 실행하고,
제공자 클라이언트가 데이터를 제공하고,
Tx 서버는 제공자로부터 수신한 데이터를 메서드에 따라 작업을 진행하여 Rx에게 tcp 소켓으로 보낸 후,
뷰어 클라이언트는 Rx 서버에게 데이터 GET 요청을 10초마다 보내 조회한다.
각 프로그램의 과정을 순서도로 그려보았다.
흐름을 알고 가면 쉽게 이해할 수 있다.




위 사진은 프로젝트에서 사용하는 구조체 및 여러 구조체를 슬라이스에 담아 확인하는 과정이다.
프로그램별로 구조체를 만들어두었다. 서버는 sData, 제공자는 pData, 뷰어는 vData로~
프로젝트에서 사용하는 데이터는 아래와 같다.
이는 구조체로 각 프로그램에서 기록하며, Tx와 Rx 간 송수신에서는 Protocol Buffers로 관리된다.
indexindexconst)const)data := make([]pData, n)
for i := 1; i <= n; i++ {
data[i-1] = pData{
Id: i,
Name: fmt.Sprintf("Alex%d", i),
Address: DefaultAddress,
Sex: DefaultSex,
}
}
아래는 소켓을 통한 송수신 과정에서 사용되는 프로토버프를 정의한 일부이다.
Data와 Data를 기록하고 관리하는 DataPackage를 만들었다.
data_list: 여러 data 구조체를 리스트에 저장total_count: 리스트 내 구조체의 개수syntax = "proto3";
message Data {
int32 id = 1;
string name = 2;
string address = 3;
string sex = 4;
}
message DataPackage {
repeated Data data_list = 1;
int32 total_count = 2;
}
해당 데이터 형식을 본인이 사용하고자 하는 언어에서 활용할 수 있도록 컴파일해야 사용할 수 있다!
본 프로젝트에는 두 명의 클라이언트가 있다.
제공자 클라이언트와 뷰어 클라이언트를 알아보자.
제공자 클라이언트를 먼저 알아보자.
제공자 클라이언트는 데이터 송신자의 기능을 수행하며, 아래와 같은 작업을 진행한다.

1) 명령행 인자로 작업(method)을 입력 받아 서버에게 해당 작업 요청
POST에 요구되는 명령행 인자로 데이터의 개수(n)를 입력 받음PUT에 요구되는 명령행 인자로 아이디(id), 이름(name) 입력 받음DELETE에 요구되는 명령행 인자로 아이디(id) 입력 받음2) 작업 요청 후, 프로그램이 사용자에게 다음으로 수행할 작업 입력 요청
POST: 새로운 데이터 생성 및 기존 데이터 대체 (생성할 데이터 개수 입력 요청)PUT: 기존 데이터 수정 (아이디와 수정할 이름 데이터 입력 요청)DELETE: 특정 데이터 삭제 (삭제할 아이디 입력 요청)3) POST로 생성된 데이터는 id, name, address, sex 필드를 포함한 구조체
→ 예시: n=3인 경우
id는 1, 2, 3 형태로 데이터 생성name=Alex → Alex1, Alex2, Alex3 형태로 데이터 생성address와 sex는 n과 무관하게 초기 데이터와 동일하게 사용4) 전송 데이터 형식:

위 사진은 제공자 클라이언트 프로그램을 실행시킨 것이다.
명령행 인자로 메서드 및 그에 요구되는 추가 인자를 입력하고, tx 서버의 주소를 명시한다. ← 서버는 실행시킨 상태!
해당 작업이 소요된 시간(millisecond 단위)을 출력한 후, 그 다음으로 진행할 작업의 입력을 요청한다.
사용자가 입력한 작업과 인자의 정보를 바탕으로 작업 진행 및 작업 소요시간을 출력한다.
다음으로 뷰어 클라이언트를 먼저 알아보자.
뷰어 클라이언트는 서버의 데이터를 조회한다.

GET 요청을 보내 데이터를 수신 및 출력
위 사진은 뷰어 클라이언트 프로그램을 실행시킨 것이다.
명령행 인자로 서버(Tx/Rx)의 주소를 명시한다. ← 서버는 실행시킨 상태!
해당 작업이 소요된 시간(millisecond 단위)을 출력하고, 10초 후에 다시 GET 요청을 보낸다.
사용자가 입력한 서버 주소 정보를 바탕으로 작업 진행 및 작업 소요시간을 출력한다.
하나의 서버 프로그램 내에서는 Tx 서버와 Rx 서버가 동작한다. (HTTPS와 HTTP가 같이 동작)
cert.pem) 및 키 파일(key.pem)을 사용InsecureSkipVerify: true 설정 (테스트 용도로만 사용)
위 사진은 서버 프로그램을 실행시키기 위한 명령행 인자의 설명이다.
Tx 서버는 HTTP/HTTPS 중 하나의 프로토콜로 동작하며,
제공자/뷰어 클라이언트로부터 메서드 작업 요청을 수신해 이를 진행하여 Rx 서버에게 작업이 완료된 데이터를 송신한다.
POST/PUT/DELETE 요청 처리GET 요청 처리
위 사진은 HTTP를 사용하는 Tx 서버가 제공자 클라이언트로부터 요청받은 작업을 수행하고 Rx 서버에게 송신하는 과정이다.
Rx 서버는 HTTP/HTTPS 중 하나의 프로토콜로 동작하며,
뷰어 클라이언트로부터 메서드 작업 요청을 수신하는데, Tx 서버로부터 데이터를 수신하여 이를 뷰어에게 제공한다.

위 사진은 HTTPS를 사용하는 Rx 서버가 Tx 서버로부터 데이터를 수신해 서버에 저장된 출력하는 과정이다.
세 프로그램을 실행해보자.
1. 제공자 클라이언트

제공자 클라이언트가 총 3개의 데이터의 POST 작업을 Tx 서버에게 요청했다.
2. 서버
2-1. Tx 서버

HTTP를 사용하는 Tx 서버는 포트 8080에서 서버를 구동시켰다.
제공자 클라이언트로부터 3개 데이터의 POST 작업을 요청받고 수행했다.
그 결과, Tx 서버에는 총 3개의 데이터가 담겨있다.
POST 작업을 수행하는 소요시간과, Rx 서버에게 TCP socket을 통해 보낸 바이트 크기와 송신 소요시간이 출력되었다.
2-2. Rx 서버

HTTPS를 사용하는 Rx 서버는 포트 8443에서 서버를 구동시켰다.
Tx 서버로부터 프로토버프 형식으로 작업이 완료된 데이터를 수신한다.
그 결과, Tx 서버에는 총 3개의 데이터가 담겨있다.
Tx 서버로부터 수신한 바이트 크기와 수신 소요시간이 출력되었다.
3. 뷰어 클라이언트


뷰어 클라이언트는 Rx 서버에게 데이터를 GET하는 요청을 보냈다.
총 3개의 데이터를 조회하였으며, 10초 후 다시 GET 요청을 보낸다.
GET 요청은 브라우저에서도 결과를 확인할 수 있다!
- 10만 개 데이터까지 테스트해보았을 때, 문제없이 동작하는 걸 확인했다
이렇게 진행한 프로젝트를 정리해보았다.
아마 이 프로젝트가 인턴을 하며 진행하는 마지막 개인 프로젝트가 될 것 같은데,,
많은 걸 배운 것 같다..