오늘은 우분투 터미널로 PostgreSQL을 사용하는 명령어를 모아보았다.

 

인턴직 업무할 때, 퇴근하고 그 날 사용했던 명령어, 쿼리문들을 공부했었다.

그 때의 기억을 살려서 정리해보겠다.

 

 

 

1. PostgreSQL 열기

 

(우분투에서 파일을 설치할 때 말고 웬만하면 sudo를 사용하지 않는게 좋다고한다. 관리자 권한으로 잘못 실행하면 사용자가 접근을 못하는 경우가 발생할 수 있기 때문이다.)

 

터미널을 열고

sudo -i -u postgres

다음 psql

 

* 혹은 바로 유저 진입도 가능하다.

sudo -u 유저이름 psql

 

* 바로 유저의 데이터베이스 진입

psql -U 유저이름 -d 데이터베이스이름 

 

* 테이블 진입

select * from 테이블이름;

 

 

 

2. 시작 및 관리

 

* 부팅 시, 자동시작 설정

sudo systemctl enable postgresql 

sudo systemctl start postgresql

sudo systemctl status ostgresql (상태확인)

 

* 빠져나올때

q

 

 

 

3. 초기 사용자 / 데이터베이스 생성

 

* 진입 + 버전확인

sudo -i -u postgres

psql

 

* 데이터베이스 목록 확인

\l

 

* 유저생성

create user 유저이름 password '패스워드' superuser;

 

* 유저 리스트

\du

 

* 데이터베이스 만들기

create database 데이터베이스이름 owner 유저이름;

 

* psql 종료 / 뒤로 나가기

\q

 

* 종료

exit

 

 

 

4. 테이블 + 컬럼 생성

 

PSQL은 표 형태의 데이터를 저장하는 공간으로

" " 안에는 컬럼명을 적고, 그 컬럼의 밸류형태가 문자면 TEXT, 실수면 FLOAT, 부동소수점 4자리면 REAL로 타입을 설정한다.

 

 

 

 

5. 테이블 이름 바꾸기

 

예를들어, wather_data 테이블에서 기온컬럼의 이름을 temperature로 바꾸고 싶다면?

 

ALTER TABLE weather_data RENAME COLUMN "기온" TO "temperature";

 

 

 

6. 테이블 삭제

 

drop table 테이블이름;

 

해당 테이블의 전체데이터를 삭제

DELETE FROM 테이블명;

 

 

 

7. 테이블 조회

내 데이터베이스 진입 후,

\dt

 

 

 

8. 특정 테이블에서 모든데이터를 조회

 

SELECT * FROM 테이블 이름;

SELECT 컬렴명 FROM 테이블이름;

 

 

 

9. 특정 열 지우기

 

ALTER TABLE 테이블명 DROP COLUMN 컬럼명;

 

 

10. 테이블의 모든 데이터는 제거하면서 테이블의 구조와 인덱스는 유지

 

TRUNCATE 테이블명;

 

 

 

11. 순서대로 정렬하기

 

 예를들어 timestamp컬럼의 시간순서를 최신순으로 정렬하고싶을 때,

 

select * from 테이블명 order by timestamp desc;

 

 

 

12. 테이블 데이터를 csv로 저장

 

11번을 그대로 저장하고싶으면, 위 쿼리문을 그대로 적는다.

\copy (SELECT * FROM water_quality order by timestamp desc) TO '/경로/파일이름.csv' WITH CSV HEADER;

 

 

 

오늘은 내가 다양하게 활용했던 Flask 프레임워크에 대해 심도있게 다뤄보겠다.

 

 

[ 활용 내용 ]

 

1. API생성하여 사용자에게 정보제공

https://jayindustry.tistory.com/28

 

 

2. 트레이딩 자동매매봇 서버구현

https://jayindustry.tistory.com/71

 

 

 

[ 개념 ]


Flask는 Python을 사용하여 웹 애플리케이션을 개발할 수 있는 경량화된 웹 프레임워크이다. 필요에 따라 다양한 확장 기능을 추가할 수 있다. Flask는 RESTful API 개발, 데이터베이스 통합, 마이크로서비스 아키텍처 구성 등 다양한 웹 기반 프로젝트에 적합하다.

 

 

 


[ Flask의 활용 예시 ]


웹사이트 및 웹 애플리케이션 개발: Flask는 개인 블로그, 기업 웹사이트, 온라인 교육 플랫폼 등 다양한 유형의 웹사이트 개발에 적합하다.

RESTful API 개발: 클라이언트와 서버 간의 데이터 송수신에 사용되는 API 서버 구축에 유용하다.

데이터베이스 기반 애플리케이션: 사용자 인증, 데이터 관리 등 데이터베이스가 필요한 웹 애플리케이션 개발에 활용된다.

마이크로서비스 아키텍처: 소규모 서비스를 독립적으로 개발하여 큰 시스템을 구성할 수 있다.

사물인터넷(IoT) 및 하드웨어 프로젝트: IoT 기기와 통신하는 백엔드 서버 개발에도 사용된다.

머신러닝 및 데이터 분석: 학습된 머신러닝 모델을 서버에 배포하고, 예측 결과를 제공하는 API를 구축하는 데에도 적합하다.

 

 

 


[ Flask의 주요 HTTP 메서드 ]

 


Flask에서 자주 사용되는 HTTP 메서드는 GET과 POST다.

 

 

 

 

HTTP 메서드란?

 

HTTP는 웹에서 데이터를 주고받는 데 사용되는 프로토콜로, 클라이언트(보통 웹 브라우저)와 서버 간의 통신을 가능하게 한다.

 


GET 메서드: 서버로부터 정보를 조회하는 데 사용된다. 데이터를 읽거나 검색할 때 주로 사용되며, 요청 정보는 URL에 포함된다.

POST 메서드: 서버에 데이터를 제출하는 데 사용된다. 새로운 데이터를 생성하거나 업데이트할 때 주로 사용되며, 데이터는 HTTP 메시지의 바디에 담겨 전송된다.

 

 

즉, POST 메서드는 클라이언트에서 서버로 데이터를 보내거나 서버에 데이터를 제출할 때 사용되는데, 주로 새로운 데이터를 생성하거나 서버에 데이터를 전송하는 경우에 사용된다.. 예를 들어, 웹 폼을 통해 사용자 정보를 서버에 등록하거나, 새로운 게시물을 작성할 때 이다.

 

반면, 클라이언트가 서버로부터 데이터를 받아오고 싶을 때는 주로 GET메서드를 사용한다. GET은 서버에 저장된 정보를 검색하거나 요청하는데 사용되며, 데이터를 조회할 목적으로 사용딘다.

예를들어, 웹사이트의 특정페이지를 불러오거나 데이터베이스에서 특정정보를 검색하는 경우이다. 이 때, 서버는 클라이언트의 요청에 따라 데이터를 반환한다.

 

 

 

 


[ Flask 예시 코드 ]

 

 

 

 

 

터미널 결과

 

 

 

 

 

웹페이지 결과

 

 

위는 Flask 프레임워크를 사용하여 기본적인 웹 페이지를 생성하는 예시코드이다.

@app.route('/') 데코레이터는 루트 URL ('/')에 접근했을 때 'Hello, Flask!'라는 메시지를 반환한다.

Flask는 파이썬에서 웹 개발의 다양한 기능들을 제공하며, 간결하고 쉬운 구조를 가지고 있다. 

이러한 특성 덕분에 Flask는 Python 개발자들 사이에서 자주 쓰이는 웹 프레임워크로 자리 잡고 있다.

 

 

오늘은 블록체인 암호화폐 시장에서 꼭 알아야할 금융지식 키워드 2탄을 준비했다.

 

 

< 저번 포스팅 1탄 >

https://jayindustry.tistory.com/89

 

[금융공부] 블록체인 시장에서 꼭! 알아야할 주요키워드 - 1

요즘같은 상승장에 암호화폐의 주요 개념 및 트랜드가 될만한 키워드들에 대해 다시금 공부해보았다. 암호화폐 투자에 도움이 될만한 이 주요 개념들을 2편에 걸쳐서 정리해보려고 한다. [ 개요

jayindustry.tistory.com

 

 

[ 개요 ]

 

< 1탄 >

1. Defi

2. STO

3. NFT

 

 

< 2탄 >

4. Real World Assets (RWA) 

5. Hard pork

6. Staking

7. PoS, PoW

 

 

 

 

 

[ 본문 ]

 

4. RWA ( Real World Assets )

 

개념

 

현실 실물 자산이라고도 불리며 블록체인 / 코인 시장에서 사용되는 개념이다.

 

증권형 토큰인 STO와 얼핏보면 비슷한 개념인것 같으나 엄연히 다른 개념이다.


RWA는  현실 세계의 자산을 디지털화한 것을 말하는데, 이는 부동산, 예술품, 금융 자산 등 다양한 형태의 물리적 또는 비물리적 자산이 될 수 있다. 반면, STO는 1탄에서도 설명했듯, 증권형 토큰 공개라고 불리며, 전통적인 금융증권을 디지털 형태로 발행하는 것을 의미한다. 이는 기업의 주식, 채권, 투자 펀드 같은 전통적인 금융 증권을 토큰 형태로 나타낸 것입니다.

목적 또한 다르다. STO는 투자 유치와 자금 조달을 목적으로 하는 반면, RWA는 자산의 유동성 증가와 더 넓은 접근성 제공이 주된 목적이다. 그리고 STO는 주로 인증된 투자자들을 대상으로 하며, RWA는 보다 일반적인 투자자들에게도 접근 가능하다.

 

 

장점

 

유동성 증가 : 현실 세계 자산을 디지털화함으로써 유동성이 크게 증가될 수 있다. 이는 자산을 더 쉽고 빠르게 거래할 수 있게 한다.

접근성 향상 : 전통적인 실물자산 시장에 접근이 어려운 사람들에게 투자 기회 제공한다.

투명성/보안성 : 블록체인 특성상 거래 기록이 투명하게 관리되어 보안성이 높아진다.

분산화 : 중앙화된 기관의 필요없이 자산을 관리 / 거래 가능하다.

 

 

 

단점

 

규제의 부재 / 불확실성 : 아직은 명확한 구제가 마련되어있지 않아, 법적 불확실성이 존재한다.

가격 변동성 : 디지털 자산의 가치가 현실 실물자산의 실제가치와 다르게 움직일 수 있어, 가격 변동 리스크가 있다.

기술적 장벽 : 일반 투자자들에게 블록체인 기술이나 디지털 자산거래가 어려울 수 있다.

 

 

 

예시

 

부동산 토큰화 : 부동산 자산을 디지털 토큰으로 나누어 소유권을 가질 수 있다.

예술품 토큰화 : 고가의 예술품 역시 소유권 토큰으로 나누어 다수의 투자자들이 적은 금액으로 투자 가능하다.

금융 상품 : 채권 , 주식 등 금융 자산을 디지털화하여 블록체인 상에서 거래할 수 있다.

 

 

 

정리

 

디지털 자산과 실물 실제자산을 연결하는 중요한 역할을 하고 있으므로 앞으로 더 큰 발전이 예상된다. 개인적으로 이는 현재 메타로서 작용하는 듯 보인다. 그러나, 위험요소 / 규제문제가 아직 많은 도전거리로 남아있다.

얼핏 STO와 개념이 중복되는 것들이 있으나 타겟과 목적성, 투자대상에 차이가 있다.

 

 

 

 

 

5. Hard pork 

 

 

개념

 

하드포크는 기존의 블록체인 규칙을 변경하거나 업데이트하는 과정에서 발생하는 두 개의 서로 다른 체인으로의 분할을 뜻한다. 기존 블록체인과 호환되지 않는 새로운 규칙이나 프로토콜을 도입 시, 발생한다.

 

즉, 기존체인과 새로운 체인이 동시에 존재하게 되면서 각각 다른 규칙을 따르게 되는데, 이 때 사용자,채굴자,개발자들은 두 체인 중 하나를 선택해야 한다.

 

 

 

장점

 

기술적 개선 : 새로운 기능추가나 성능향상을 위해 사용된다.

보안강화 : 보안 취약점을 해결할 수 있다.

거버넌스 및 정책 변경 : 커뮤니티 의견분열이나 정책적 이슈를 해결할 수 있다.

 

 

 

단점

 

분열의 위험 : 커뮤니티나 네트워크가 분열되어 두 개의 경쟁 체인이 생길 수 있다.

가치의 불확실성 : 새로운 체인의 토큰가치가 불안정해질 수 있다.

호환성문제 : 새로운 체인과의 호환문제가 발생할 수 있다.

 

 

 

예시

 

비트코인 하드포크)

 

비트코인 캐시 : 2017년 비트코인 블록크기 제한을 두고 진행된 논쟁으로인해 생성되었다. 비트코인 캐시는 더 큰 블록크기를 통해 트랜잭션 처리속도를 향상시켰다.

 

비트코인 골드 : 같은 해에 발생한 또 다른 하드포크로, 채굴 중앙화 문제를 해결하기 위해 새로운 채굴 알고리즘을 도입하면서 생겨났다.

 

이더리움 하드포크)

이더리움 클래식 : 2016년, DAO 해킹사건 이후 이더리움 커뮤니티는 해킹으로 인해 잃어버린 자금을 복구하기 위해 하드포크를 결정했다.

이로 인해 원래 체인은 이더리움 클래식, 일명, 이클이라는 이름으로 계속되었고, 새로운 체인은 이더리움이 되었다.

따라서 이더리움 클래식은 해킹 전의 원래 체인을 유지하는 것을 목표로 한다.

 

 

 

정리

 

하드포크는 기술적, 정책적, 또는 보안상 이유로 인해 발생할 수 있다. 블록체인 네트워크의 새로운 방향을 결정하고, 때로는 새로운 토큰이나 암호화폐를 탄생시키기도 한다. 그래서 이더리움 클래식이 이더리움을 뒤집어 엎는다는 말들 또한 기존의 체인을 선호하는 사람들이 많아지면 가능한 개념이다.

 

 

 

 

6. Staking

 

 

개념

 

스테이킹은 특정 암호화폐를 보유하면서 특정지갑에 고정적으로 넣어둠으로써, 네트워크에 참여하는 행위이다.

이는 네트워크의 보안을 강화하고 새로운 블록을 생성하거나 거래를 검증하는 데 참여한다. 이 과정에서 사용자는 넣어둔 물량과 비례하여 이자형식으로 보상을 받는다.

 

 

장점

 

수익 창출 : 정기적 보상으로 수익을 창출할 수 있다.

네트워크 기여 : 블록체인 생태계를 강화한다.

 

 

 

단점

 

유동성 제한 : 스테이킹된 자산은 일정 기간동안 고정되어있으므로 유동성이 제한된다.

가격변동위험 : 스테이킹 기간동안 암호화폐가 하락하여 손실로 이어질 수 있다.

네트워크 위험 : 네트워크가 비정상적이거나 실패할 경우 등으로 스테이킹 자산에 영향을 줄 수 있다.

 

 

예시

 

이더리움 2.0 : 이더리움은 PoS로 전환을 계획하고 있으며, 2.0사용자들이 ETH를 스테이킹하여 네트워크에 기여하고 보상을 받을 수 있다.

카르다노(에이다) : PoS프로토콜인 오로보로스를 사용하여 스테이킹을 지원한다. 에이다 보유자는 스테이킹으로 네트워크 운영에 참여하고 보상을 받는다.

테조스 : 자체적 PoS변형 프로토콜인 '베이킹'시스템으로 사용자가 스테이킹하고 보상받을 수 있다.

 

 

 

정리

 

스테이킹은 암호화폐시장에서 수동적 수익창출의 방법 중 하나로, 네트워크에 기여하고 보상을 받는 행위이다.

하지만 위와 같은 위험 사례들이 여럿 존재하고 잠재적 단점 또한 리스크로 작용한다.

 

 

 

 

 

7. PoS, PoW

 

PoS(Proof of Stake)와 PoW(Proof of Work)는 블록체인 네트워크에서 트랜잭션을 검증하고 새로운 블록을 생성하는 두 가지의 다른 알고리즘이다.

 

 

PoW(Proof of Work)의 개념

 

PoW는 '작업 증명' 방식으로, 복잡한 수학적 문제를 해결하기 위해 컴퓨터의 계산 능력을 사용하는 방식.


작동 방식: 채굴자들이 복잡한 수학적 문제를 해결하고, 해결된 문제를 네트워크에 제출하여 블록을 생성한다.

이 과정에서 상당한 양의 전기와 컴퓨팅 파워가 소모된다.

보안: 높은 계산 능력을 요구하기 때문에 네트워크를 보호하는 데 강력하지만, 많은 에너지를 소모한다.

예: 비트코인, 라이트코인

 

 

 

 

PoS(Proof of Stake)의 개념


PoS는 '지분 증명' 방식으로, 네트워크 참여자들이 자신이 보유한 암호화폐의 양(지분)을 기반으로 블록을 생성하고 트랜잭션을 검증한다.


작동 방식: 사용자들은 자신의 암호화폐를 일종의 '보증금'으로 묶어 네트워크에 기여한다. 블록 생성 기회는 보유 지분에 비례한다.
에너지 효율성: PoW에 비해 상대적으로 적은 에너지와 컴퓨팅 파워를 필요로 한다.
: 이더리움 2.0, 카르다노, 테조스

 

 

 

PoS와 PoW의 차이점


에너지 소모: PoW는 많은 에너지와 컴퓨팅 자원을 필요로 하지만, PoS는 상대적으로 적은 에너지를 사용
보안: PoW는 높은 컴퓨팅 파워를 통한 보안을 제공하지만, PoS는 보유 지분을 통해 네트워크 참여자들이 장기적으로 네트워크에 투자하도록 장려
중앙화 문제: PoW는 고성능 채굴 장비를 필요로 하여 중앙화 문제를 야기할 수 있는 반면, PoS는 보유 지분에 따라 블록 생성 기회가 주어져 상대적으로 분산화를 장려
참여 장벽: PoW는 고가의 채굴 장비가 필요하지만, PoS는 보유한 암호화폐의 양에 따라 참여할 수 있어 접근성이 높음

 

 

 

정리

 

 블록체인 네트워크의 목적과 요구 사항에 따라 다르게 선택된다. PoS는 특히 에너지 효율성과 분산화 측면에서 주목받고 있으며, 많은 최신 블록체인 프로젝트에서 선호되고 있다.

 

 

 

 

 

요즘같은 상승장에 암호화폐의 주요 개념 및 트랜드가 될만한 키워드들에 대해 다시금 공부해보았다.

 

암호화폐 투자에 도움이 될만한 이 주요 개념들을 2편에 걸쳐서 정리해보려고 한다.

 

 

[ 개요 ]

 

< 1탄 >

1. Defi

2. STO

3. NFT

 

 

< 2탄 >

4. Real World Assets (RWA) 

5. Hard pork

6. Staking

7. PoS, PoW

 

 

 

 

1. DeFi

 

 

개념

 

DeFi : Decentralized Finance, 탈중앙화 금융 서비스

전통적인 금융 시스템을 대체 및 보완하는 블록체인 기반 탈중앙화 금융서비스를 의미한다.

말 그대로 은행같은 금융기관의 중앙집중형 기관이 없이도 스마트컨트랙트와 블록체인 기술로 금융거래를 한다.

대출, 예금, 거래, 자산관리 등의 금융서비스를 제공하며 전 세계 어디에서나 이용가능하다.

 

 

 

장점

 

접근성 : 은행계좌나 금융서비스 없이도 이용가능하다.

투명성 : 블록체인 특성상, 전자장부인 만큼 모든 거래 기록이 투명하게 공개되어 큰 신뢰성을 제공한다.

혁신성 : 새로운 형태의 금융 상품과 서비스가 제공가능하다.

 

 

 

단점

보안 : 스마트 컨트랙트의 특성상, 거래에서 버그나 해킹으로 인한 위험이 존재한다.

변동성 : 암호화폐 가격 변동성이 큰 만큼, 디파이 서비스 안정성에 영향을 줄 수 있다.

규제의 부재 : 아직 여러 국가에서 디파이에 대한 규제가 명확히 없어 법적 불확실성이 존재한다.

 

 

 

디파이 예시

Uniswap : 탈 중앙화 거래소(DEX)로, 사용자들이 중앙집중형 거래소 없이 토큰을 교환할 수 있다.

MakerDAO : 탈중앙화 대출 / 예금 플랫폼이다. 암호화폐를 담보로 대출을 받거나 제공하여 이자를 얻을 수 있다.

Compound : 자동화된 대출 및 서비스를 제공하는 탈중앙화 애플리케이션이다.

 

위 예시들은 실제 코인으로 있으며 나도 한번씩 매매를 해본 코인들이다.

 

 

 

정리

DeFi는 근 미래의 금융혁신에 중요한 역할을 할 것이다.

전통적인 금융시스템한계를 극복하면서 동시에 보안 및 규제관련 위험성도 존재하니, 아직은 도전할 사항들이 많아보인다.

 

 

 

 

2. STO

 

개념

 

STO : Security Token Offering, 증권형 토큰 제공

기존 증권인 주식, 채권, 부동산 등을 블록체인 기반의 토큰으로 발행하는 것이다.

이 토큰들은 실제 자산이나 수익을 대표할 수 있고, 전통적인 증권과 유사한 가치 및 권리를 가진다.

 

ICO(initial Coin Offering)과 달리, 증권법같은 금융 규제에 준수해야하며, 투자자보호를 위해 법적으로 충족시켜야 한다.

 

 

여기서 ICO란?

 

ICO는 신규 블록체인 프로젝트나 암호화폐가 초기 자금을 모집하기 위해 토큰을 공개적으로 판매하는 것이다.
투자자들은 신규 코인이나 토큰을 구매함으로써 해당 프로젝트에 자금을 제공하고, 이에 대한 대가로 해당 신규 토큰을 받는다.
이 토큰들은 프로젝트가 성공하면 가치가 상승할 수 있다는 하이리스크 / 하이리턴의 성격을 지닌다.

 

 

 

장점

 

규제준수 : STO는 규제를 준수하기에 높은 신뢰성과 보안성이 있다.

자산유동화 : 실제 자산을 쉽게 분할하여 거래하므로, 자산의 유동성을 증대시킨다.

글로벌접근성 : 인터넷만 있다면 전 세계 어디서나 STO참여가 가능하다.

 

 

 

단점

 

높은 진입장벽 : 복잡한 규제준수 때문에, 발행자와 투자자 모두 높은 진입장벽이 있다.

제한된 시장 : 아직 STO시장은 초기단계이며, 전통 증권시장만큼 규모나 유동성을 갖추지 못했다.

 

 

 

예시

 

RealT : RealT는 부동산을 토큰화하여 투자자들이 부동산투자에 소액으로 참여할 수 있게 한 플랫폼이다.

 

 

 

 

 

3. NFT

 

개념

 

NFT : Non-Fungible Token, 대체 불가능 토큰

블록체인 기술을 사용하여 생성된 말 그대로 고유한 대체불가능한 디지털 자산이다.

 

각각의 식별자(예를들어 바코드같은)를 가지고 있으며, 해당 자산의 유일무이함을 보장한다.

따라서 절대 대체될 수 없다.

 

주로 디지털 아트, 음악, 비디오, 게임아이템 등등 다양한 형태의 콘텐츠가 NFT에 적용될 수 있다.

 

 

 

장점

 

소유권의 명확성 : 디지털 소유권을 명확히 하여 창작자의 권리가 보호된다.

새로운 시장 창출 : 예술가, 음악가 등의 창작인들에게 새로운 수익 창줄 시장이 열렸다.

유일성/희소성 : 각 NFT의 유니크함이 수집가들에게는 그 가치가 높게 평가될 수 있다.

 

 

 

단점

 

시장의 변동성 : NFT시장은 매우 변동성이 커서 예측하기 어려울 수 있다.

저작권문제 : NFT의 소유권과 실제 콘텐츠의 저작권 사이에 혼란이 발생할 수 있다.

환경문제 : 생성, 거래 시, 사용되는 코인(주로 이더리움)들에게서 많은 에너지를 요구하며 환경문제를 일으킬 수 있다.

 

 

 

예시

 

Beeple : 디지털아티스트 Beeple의 작품 중, The First 5000 Days는 NFT로 판매되어 약 693억의 가격에 낙찰되었다.

CryptoKitties : 블록체인기반 가상 고양이 수집게임으로 각 고양이는 독특한 NFT형태로 존재한다. 이 역시 가격이 높다.

NBA Top Shot : NBA의 하이라이트 순간 영상들이나 스냅샷을 NFT형태로 수집하고 거래할 수 있는 플랫폼이다.

 

 

 

정리

 

NFT는 디지털 세계에서 창작물의 가치를 재정의하고 새로운 경제기회를 제공한다.

하지만, 단점에서도 언급햇듯이 아직은 여러 도전적인 과제들이 많이 있다.

 



 

오늘은 최근 고안한 새로운 전략방법을 어떻게 구현할 수 있을까 고민해보도록 하겠다.

 

 

 

 

< 지난 포스팅 >

https://jayindustry.tistory.com/87

 

#13 [바이낸스 선물] 에러해결 및 코드수정

이번포스팅에서는 트레이딩 자동매매봇 실전도입 시, 나타나는 에러현상들을 최종적으로 해결하였다. 지난 단계까지는 트레이딩뷰에서 내 전략에 대한 매수,매도 시그널을 웹훅을 통해 파이썬

jayindustry.tistory.com

 

 

지난 포스팅까지는 현재까지 만든 자동매매봇과 서버스크립트의 에러를 최종적으로 해결하였다.

지금은 위 스크립트들를 실행시켜놓고 실전수익률을 체크중이다.

 

 

 

 

 

[ 개요 ]

 

하루동안 실전테스트를 진행하면서 어떻게 기존전략을

업그레이드 할 수 있을까 고민해보았다.

 

 

1. 백테스팅 결과

2. 기존 전략의 문제점 및 해결방안

3. 새로운 지표 및 전략

 

 

 

 

 

[ 내용 ]

 

1. 백테스팅 결과

 

 

 

 

"실전매매법_1"

 

 

 

약 72일간 진행한 백테스팅 결과에서 359회를 트레이딩하였고, 순익은 25%이다.

커미션(수수료)을 0.01%씩 부여하면 약 16%로 순익이 줄어든다.

 

 

 

 

 

2. 기존 전략의 문제점 및 업그레이드 기준

 

현재 내 전략은 승률은 높으나, 매매빈도가 너무 낮고, 수수료를 감안하면 기간에 비해 수익률이 너무 낮다.

원인을 파악하고 어떻게 바꾸면 좋을지 고민해보겠다.

 

 

 

 

< 원인 파악 >

 

1) 나의 전략은 횡보할때는 적합하나 한 방향으로 훅 치고올리거나 내릴때는 잘 먹지 못한다는 단점이 있었다.

 

 

5분봉 BTC 기준이다. (파랑은 롱진입, 분홍은 롱 종료)

위 같은 횡보장에는 타점을 비교적 잘 찾아내는 것 같다.

 

 

 

 

하지만 위와같은 위로 훅! 치고올리는 부분에서는 수익을 별로 내지 못하였다.

 

 

해결방안)

종료조건이 아직 치밀하지 못한것같다.

추세 및 추가지표로 종료 조건을 더 정밀하게 만들어야겠다.

 

 

 

 

2) 단기적 과매수상태에서도 매매를 진행한다.

 

예를들어 급격하게 오른 후 박스권을 횡보할 때 이다.

이 땐 5분봉은 MFT(Money flow index) 과매도가 나타난다 하더라도

15분봉, 1시간봉 등은 과매수일 경우가 있다.

 

이럴땐 롱진입하면 리스크가 크다. 아니나다를까 이럴때 많이 손해를 보는것 같았다.

 

 

1시간봉으로 과매수상태이면 당분간은 쭉 빠지는게 맞다.

하지만 5분봉은 너무 짧기에 그 안에서도 과매수 과매도 상태를 왔다갔다한다.

위 사진에서는 이런 상황일 때, 마구 손절하는 모습을 보인다.

 

 

 

해결방안)

차트에서 보이는 흰색선은 EMA이다.

EMA아래에 있을땐 숏포, 위에있을땐 롱포를 잡는 등

상승추세 혹은 하락추세에 따른 롱포, 숏포지션을 유동성있게 설정해야겠다.

 

 

 

 

3) 의미없는 포지션이 많다.

 

위 사진에서는 또 하나 문제점이 있다.

바로 수익률, 손실률이 거의 없는 상태로 포지션이 진입 및 종료된다는 것이다.

이러면 수수료만 빠져나가서 결국엔 손해이다.

 

 

해결방안)

진입 및 종료 조건에 지표와 조건들을 추가하여 더 정밀하게 만들어야겠다.

 

 

 

 

3. 새로운 지표 및 전략

 

위의 해결방안들을 고려해보면,

진입 및 종료에서 좀 더 정밀한 지표, 조건들이 필요해보이고

상승과 하락추세를 알려주는 지표 또한 필요하다.

 

그래서 트레이딩뷰에 있는 유료지표인 모든차트패턴이라는 지표를 활용하려고한다.

 

 

이는 자동으로 차트를 분석하여 다양한 차트패턴을 알려준다.

다만, 트레이딩뷰에서 제공하는 것이라 오픈소스가 없다는 것이다.

알람설정도 되지 않는다.

 

이를 어떻게 구현할지 고민하던 찰나,

패턴들을 따로따로 쪼개어 지표로 볼 수 있었다.

 

 

이런식으로 따로 추가하여 볼 수 있는데,

이렇게 낱개로 되어있는 지표는 알람설정이 가능하다!

 

내가 좋아하는 패턴들만 가지고 알람들을 설정해보도록 하겠다.

 

EMA추세와 이 차트패턴들을 조합하여 좀 더 정밀하게 구현하면 승률과 수익률이 조금은 개선될 것으로 보인다.

 

 

이번포스팅에서는 트레이딩 자동매매봇 실전도입 시, 나타나는 에러현상들을 최종적으로 해결하였다.

 

 

 

지난 단계까지는 트레이딩뷰에서 내 전략에 대한 매수,매도 시그널을 웹훅을 통해 파이썬으로 보내어 매매를 해보았다.

 

 

< 지난 포스팅 >

https://jayindustry.tistory.com/78

 

#12 [바이낸스선물] 트레이딩뷰 시그널연동하여 매매하기, API key 보호

오늘은 트레이딩뷰 파인스크립트 전략에 따라 다른 시그널들을 파이썬에 보내고 그에 따른 자동매매를 진행해보았다. 그리고 API key 유출방지하기 위한 방법도 고안해보았다. < 지난 포스팅 > htt

jayindustry.tistory.com

 

 

 

다음단계로 서버코드와 실행코드를 반복문으로 켜놓고 자동으로 매매가 잘되는지,

수익은 얼마나 나는지 직접 실험해보았는데, 중간중간 계속 서버관련 에러가 발생하였다.

 

그래서 이번포스팅에서는 이러한 에러현상에 대한 원인파악과 문제해결을 하였다.

 

 

 

[ 개요 ]

 

1. 에러 원인파악 

2. 파이프라인 수정

3. 코드수정

4. 결과

 

 

 

 

[ 본문 ]

 

기존의 파이프라인은 다음과 같다.

실행스크립트를 반복문으로 계속 실행하면, 지속적으로 서버스크립트로부터 웹훅(트레이딩뷰 롱,숏시그널)메시지를 받아와서 지표모듈과 전략모듈과 연결하여 매매를 진행하는 방식이었다.

 

 

그런데 서버스크립트로부터 메시지를 get하는 부분에서 한번씩 에러가 떴다.

 

 

 

에러문구

   response = requests.get(url)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='127.0.0.1', port=10080): Max retries exceeded with url: //get-latest-data (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x124b6c730>: Failed to establish a new connection: [Errno 60] Operation timed out'))

 

 

대충 연결시간이 너무 지연되어 연결이 안된다는 뜻인데 원인은 다양하다.

 

 

 

원인파악

 

1. 다양한 이유로 인한 서버부하

2. 서버가 중단되거나 로컬네트워크 상태가 좋지 않을 때

3. 컴퓨터의 CPU, 메모리 상태 등의 문제

 

 

네트워크나 pc상태의 문제는 아니었고 서버부하의 문제인가 싶었다.

직접 수동으로 스크립트를 실행하면 잘 작동하는데 반복문으로 1분마다 자동실행하면 이렇게 에러가 뜨니 구조자체를 조금 바꿔야겠다고 생각했다.

 

 

 

 

 

 

 

2. 파이프라인 수정

 

서버로부터 데이터를 지속적으로 받아오지 못하니, 중간단계를 넣어야겠다고 생각했다.

-> 로컬상의 저장공간을 활용해보자.

 

 

 

< 기존의 파이프라인 >

 

트레이딩뷰 웹훅메시지 -> 서버스크립트 -> 실행스크립트의 request요청(Get)

 

 

 

< 새로운 파이프라인 >

 

트레이딩뷰 웹훅메시지 -> 서버스크립트 -> CSV파일에 한줄만 저장 -> 실행스크립트에서 CSV파일메시지 읽어오기

 

 

 

Csv에 웹훅메시지가 계속 쌓이면 공간을 너무 잡아먹으니, 서버스크립트에서 웹훅메시지가 들어올때마다 Csv를 초기화하고 새롭게 저장하는 방식을 택하였다. 이렇게 하여 새로운 메시지만, 총 1줄만 csv에 업데이트된다.

 

 

 

 

 

 

 

3. 코드 수정

 

Server 코드

 

 

 

먼저 csv파일에 웹훅메시지를 저장하도록 한다.

덮어쓰기: 'w' 모드로 파일을 열면, 해당 파일이 이미 존재하는 경우 기존 내용을 모두 지우고 새로운 내용을 작성한다.

파일이 존재하지 않는 경우 새 파일을 생성해준다.

 

 

그리고 csv를 지속적으로 비우기 위해 다음코드를 추가한다.

새로운 웹훅메시지가 들어올 때, 해당 Csv파일을 열었다 닫음으로서, 이전 파일을 초기화시킨다.

 

 

 

 

bot_module

 

 

그리고 다양한 함수들을 모아놓은 모듈파일에 새로운 함수를 추가한다.

csv파일을 읽고, 첫번째 행을 반환하는 코드이다

 

Running

 

 

마지막으로 실행하는 스크립트에서 위에서만든 함수를 실행한다.

 

실행 딜레이 때문에 5분봉 매매기준으로 반복문 time.sleep을 딱 1분(60)이 아닌 50정도로 맞춰주었다.

서버코드에서 받은메시지를 모듈로 보내고 모듈에서 다시 받아오게 되어잇는데 그럴 필요가 없어졋다.

이는 나중에 개선할 필요 있다고 생각되면 수정하자.

 

 

 

 

 

 

4. 결과

 

서버스크립트 터미널 결과

 

지속적으로 웹훅을 잘 받아오고 있다.

 

 

 

실행스크립트 결과

 

 

이번엔 실행스크립트 결과이다.

서버스크립트를 통해 자동으로 Long, longclose 포지션을 잘 잡아준다.

 

 

이제 오류도 해결되었겠다!

다음번엔 이 스크립트들을 통해 자동매매를 실전에 도입해보도록 하겠다.

이번엔 저번에 만든 서버코드3으로부터 gps데이터를 받아 그라파나 대시보드에 구현하는 html을 만들어보도록 하겠다.

 

 

< 3단계 서버코드3 >

https://jayindustry.tistory.com/84

 

#5 [3단계] 서버코드3 (최종)

이번 3단계에서는 2단계 서버코드2에서 날짜에 따른 경로표시 기능을 추가하기 위한 작업을 한다. < 2단계 서버코드 > https://jayindustry.tistory.com/82 #3 [2단계] 파이프라인 + 서버코드2 이번 포스트에

jayindustry.tistory.com

 

 

 

 

 

 

[ 3단계 개요 ]

 

2단계까지는 로봇의 현재위치와 최근 20분의 경로가 표시되었다면, 3단계(최종)에서는 소비자가 특정날짜를 선택하면 그 날짜의 모든 경로를 위성맵에 표시하는 기능을 구현한다.

 

이를 위해서는 날짜별로 실시간 모든 gps데이터들이 담긴 DB와 추가적인 연결이 필요하였다.

이제까지는 몽고DB에서 데이터를 저장하고 꺼내왔는데, 날짜별로 저장되어있는 DB는 PSQL이라는 PostgreSQL이다. (이는 위 링크의 서버코드에서 진행하였다.)

 

 

 

1. GPS데이터 받기

2. 받은 데이터를 필터링 및 정제하고 경로그리기 함수실행

3. 경로그리기 함수

 

 

 

 

 

[ 내용 ]

 

1. GPS데이터 받기

 

먼저 서버코드로부터 psql의 선택한 날짜의 gps데이터를 전달받는다.

 

 

('date-picker') 부분은 소비자가 입력할 날짜가 들어간다. 

그 날짜를 date에 넣고 서버코드에 해당날짜에 대한 데이터들을 요청한다.

 

credentials : include는 서버와 클라이언트 사이 사용자 이용정보를 포함하는 기능인데, 자세히는 몰라서 혹시 몰라 추가했다.

헤더로 추가옵션을 주는데 application/json문구를 넣어줌으로서 데이텨형식을 명확히하고 특정 주소:외부포트로부터 오는 정보들은 허용하는 명령을 담았다.

 

마지막엔 받은 데이터를 제이슨형식으로 담았다.

 

 

 

 

 

 

 

2. 받은 데이터를 필터링 및 정제하고 경로그리기 함수실행

 

 

받은 데이터를 콘솔에 출력하고, 데이터가 존재하고 배열형태인지 확인한다.

만약 데이터가 위 조건을 만족하면, 기존에 선택되어진 날짜경로를 삭제하여 갱신하고,

서버로부터 받은 데이터를 map함수로 변환한다.

 

d.으로 원본배열 data의 각 요소를 순차적으로 돌며 새로운 객체로 만든다.

즉, data의 각 요소가 d로 전달되고,

parseFloat(d.latitude)와 parseFloat(d.longitude)는 d 객체의 latitude와 longitude 속성을 실수로 변환한다.

 

그리고 이는 gpsCoordinate라는 새로운 배열로 저장된다.

 

 

참고로 코드 맨 위에 특정날짜와 해당날짜의 경로를 저장할 변수를 만들어준다.

 

 

 

 

 

3. 경로그리기 함수

 

그리고 받은 gpsCoordinates를 기반으로 아래 함수를 실행시킨다.

 

 

그럼 기존의 특정날짜에 대한 경로는 없애고 새롭게 받은 날짜에 대한 경로만 표시하게 된다.

 

 




[ 결과 ] 

 

위 결과물은 그라파나 대시보드 상에서 고객이 볼 수 있는 화면이다.

 

아래 날짜선택 드롭바를 누르면 캘린더가 나오고, 고객이 특정 날짜를 선택하면 위의 사진처럼 로봇의 해당날짜에 대한 모든 경로가 파랑색으로 표시된다. 주황색은 2단계에서 구현한 최근 20분의 경로이고, 노랑점은 현재위치를 나타내는 점이다.

 

서버코드를 잠깐 실행중단하여 주황색 20분 경로가 갱신이 안된모습이라 노랑*현재위치와 약간 멀리 있다.

 

 

 

 

 

[ 소감 및 피드백 ]

 

이번 프로젝트를 계기로 서버와 클라이언트를 다시한번 실전에서 사용해보았다.

 

그리고 파이썬이 아닌 html과 javascript로 서버,클라이언트를 구현해 보아서 어려웠지만 더 다양한 언어를 다뤄보았다는 것에 대해 매우 뿌듯하였다.

 

노시퀄인 몽고DB, 시퀄인 PostgreSQL 둘 모두와 연결하여 데이터를 저장하고 꺼내봄으로서 쿼리문에 대한 이해와 콜렉션,테이블, 전반적인 DB에 대한 이해도가 좀 더 상승하였다.  

 

다만 서버스크립트가 중단되면 대시보드의 경로 또한 표시되지 않으니 티묵스를 사용하여 back에서 서버가 자동실행되도록 구현할 필요성은 있을 것이다. 이는 더 공부하면서 연구해봐야겠다.

 

 

이번 3단계에서는 2단계 서버코드2에서 날짜에 따른 경로표시 기능을 추가하기 위한 작업을 한다.

 

 

 

< 2단계 서버코드 >

https://jayindustry.tistory.com/82

 

#3 [2단계] 파이프라인 + 서버코드2

이번 포스트에서는 최근경로를 지도맵상에 계속 업데이트하며 표시해주는 기능을 구현하고 지난시간의 서버코드를 개선하도록 하겠다. < 지난 1단계 포스팅 > https://jayindustry.tistory.com/79 #1 프로

jayindustry.tistory.com

 

 

< 2단계 HTML >

https://jayindustry.tistory.com/83

 

#4 [2단계] 최근 20분경로표시 및 자동업데이트 HTML

지난 포스팅에서 만든 2단계 서버코드2를 기반으로 한 HTML을 구현해보도록 하겠다. 지난포스팅에서는 2단계의 파이프라인과 서버코드를 구현하였다. < 지난 포스팅 > https://jayindustry.tistory.com/82 #3

jayindustry.tistory.com

 

 

 

 

[ 3단계 개요 ]

 

2단계까지는 로봇의 현재위치와 최근 20분의 경로가 표시되었다면, 3단계(최종)에서는 소비자가 특정날짜를 선택하면 그 날짜의 모든 경로를 위성맵에 표시하는 기능을 구현한다.

 

이를 위해서는 날짜별로 실시간 모든 gps데이터들이 담긴 DB와 추가적인 연결이 필요하였다.

이제까지는 몽고DB에서 데이터를 저장하고 꺼내왔는데, 날짜별로 저장되어있는 DB는 PSQL이라는 PostgreSQL이다.

 

 

1. PSQL연결

2. 데이터가져오기(쿼리문실행)

3. 클라이언트로 보낼 데이터정제

4. 에러처리

 

 

 

 

[ 내용 ]

 

1. PSQL연결

 

먼저 PSQL에 연결하려고 Pool 객체를 이용하였다.

Node.js에서 PostgreSQL 데이터베이스와의 연결을 관리하는 데 사용된다.

 

 

 

 

 

 

 

2. 데이터가져오기(쿼리문실행)

 

연결한 PSQL데이터베이스의 테이블에서 End point를 만들어 데이터를 보낼 수 있게 라우트를 생성한다.

 

 

date = req.query.date는 클라이언트 즉, html스크립트로부터 받는 쿼리스트링 중 date변수를 가져와 date에 저장하는 기능이다.

쿼리 스트링은 클라이언트로부터 받은 URL 중, ? 뒤에 오는 부분이다.

 

다음은 html 중 일부이다. (html은 다음 포스트에서 자세히 다룬다.)

 

여기에서 ? 뒤에있는 {date}를 가져와서 서버코드의 date변수에 넣는다는 말이다.

 

그럼 위에 쿼리문대로 해당 날짜의 timestamp에 대한 latitude,longitude 위도,경도데이터들을 가져온다.

여기서 $1이 [date]변수를 가리킨다.

 

 

 

 

 

 

 

3. 클라이언트로 보낼 데이터 정제

 

 

 

가져온 데이터는 filter와 map 함수를 사용해 정제됩니다. filter는 위도와 경도가 유효한 숫자인 데이터만 선택합니다. map은 각 행의 데이터를 새로운 형식으로 변환합니다. 마지막으로, 정제된 데이터를 JSON 형식으로 클라이언트에게 응답합니다.

 

psql에 NaN 값들이 있어서 이를 처리해주는 구문이 필요했다.

filter함수로 위도 경도가 NaN이 아닌 값만 가져오도록 하고

map함수로 가져온 각 행의 데이터형태를 { }안의 형태로 바꾼다.

row.을 붙임으로서 각 행의 해당 열에 대한 데이터를 가져온다.

 

예를들어 한 줄의 행을 가져오면 다음과 같이 바꾼다.

 

    timestamp: "2023-11-27T13:00:00Z",
    latitude: 35.6895,
    longitude: 139.6917

 

 

 

 

 

 

4. 응답 및 에러처리

 

위에서 정제한 cleanedData를 제이슨형태로 응답한다.

그리고 실행 중 에러가 나면  콘솔에 에러를 기록하고 클라이언트에게 500 상태 코드 + 오류 메시지를 보낸다.

 

 

 

 

 

 

이렇게 html(클라이언트)로 psql에 저장되어있는 특정날짜에 대한

위도,경도 데이터를 보낼 서버코드가 완성되었다.

 

다음은 최종적으로 html에서 이 서버코드로부터

gps데이터를 받아 위성맵에 경로를 구현해보도록 하겠다.

 

지난 포스팅에서 만든 2단계 서버코드2를 기반으로 한 HTML을 구현해보도록 하겠다.

 

지난포스팅에서는 2단계의 파이프라인과 서버코드를 구현하였다.

 

 

< 지난 포스팅 >

https://jayindustry.tistory.com/82

 

#3 [2단계] 파이프라인 + 서버코드2

이번 포스트에서는 최근경로를 지도맵상에 계속 업데이트하며 표시해주는 기능을 구현하고 지난시간의 서버코드를 개선하도록 하겠다. < 지난 1단계 포스팅 > https://jayindustry.tistory.com/79 #1 프로

jayindustry.tistory.com

 

 

 

 

[ 2단계 개요 ]

 

1. 파이프라인

2. 서버코드2

3. 최근 20분경로만 표시 및 자동업데이트 HTML

 

 

이번 포스팅에선 2단계의 3번부터 진행한다.

 

 

 

 

3. 최근 20분경로만 표시 및 자동업데이트 HTML

 

 

 

경로를 연결하기 위한 주황색 점을 그리는 스타일과 방식을 지정한다.

 

 

 

 

 

 

위의 주황점들을 연결하는 경로 선을 정의한다.

 

지속적으로 경로를 업데이트 하기위해 기존의 경로를 제거하고 다시그려주는 기능을 추가하였다.

 

 

 

 

 

서버스크립트로부터 gps20data를 받아 처리하기

 

서버와 API로 연결, 및 매개변수를 설정한다. (서버코드 스크립트는 24003외부포트로 포트포워딩하였다.)

 

 

 

다음은 API엔드포인트로 gps20data콜렉션에 저장된 robot00005의 1분간격의 gps데이터 20분 분량을 가져온다.

 

자세한 코드설명은 아래 문제 및 해결과 함께 설명하도록 하겠다.

 

 

*** 문제 및 해결 ***

 

1. 경로 갱신하기

20분 분량의 경로만 표시되어야하니 20개만 경로에 표시되기를 원했다.

그래서 가장 오래된 주황색 점과 경로선을 지워야겠다고 생각 후 코딩하였으나 잘 구현되지 않았다.

 

그래서 방법을 바꾸어 html이 반복호출 될때마다 기존경로 전체를 지우고 다시 띄우는 방식을 택하였다.

( marker.setMap , path.setMap )

 

 

 

2. 뒤죽박죽 경로선이 연결되는 문제

가끔 시간순서대로 점을 연결하지 못하여 뒤죽박죽 경로선이 연결되는 현상을 겪었다.

그래서 data.sort와 data.forEach 메서드로 시간순서대로 정렬하여 연결하게끔 개선하였다.

 

 

 

 

 

로봇의 현재위치 표시 + 경로표시 함수 실행

 

 

이 함수는 구글맵 지도를 초기화하고 위에서 만든 함수들을 실행하는 실행함수이다.

이 때 10초마다 반복호출하도록 기능을 넣는다.

 

 

 

*** 문제 및 해결 ***

 

1. 처음 html을 작성하였을 때, 내가 그라파나 사이트를 수동으로 새로고침하지 않으면 경로가 갱신되지 않았다.

 

고민끝에 반복호출을 생각했다.

 

이 구글맵 지도초기화 및 실행함수를 인터벌로 자동호출되도록 설정한다.

이는 새로고침하지않아도 경로가 지속적으로 업데이트될 수 있게 해준다.

 

 

 

 

[ 결과 ]

 

 

로봇 1.

 

 

로봇 2.

 

 

 

로봇 3.

 

 

 

로봇 1,2,3호기의 결과를 가져와보았다.

그라파나 대시보드 상에 모두 원하는 a기능을 잘 구현해내었다.

 

현재위치를 실시간으로 노랑점으로 잘 표시하였고, 1분마다 경로가 주황점으로 찍히며 선으로 연결되었다.

최신 20분의 경로가 자동지속적으로 갱신되었다.

 

이는 소비자가 보았을 때 로봇의 경로를 실시간으로 확인할 수 있게 구현되었다.

이번 포스트에서는 최근경로를 지도맵상에 계속 업데이트하며 표시해주는 기능을 구현하고 지난시간의 서버코드를 개선하도록 하겠다.

 

 

 

 

< 지난 1단계 포스팅 >

 

https://jayindustry.tistory.com/79

 

#1 프로젝트소개 및 서버코드 + 로봇위치 HTML

이번 프로젝트는 회사에서 진행한 프로젝트이다. 소비자가 대시보드상에서 로봇의 현재상태를 확인하기 위한 트래킹맵을 제공하기 위함이다. [ 프로젝트 소개 ] 실제로 전국의 여러 저수지나

jayindustry.tistory.com

 

 

지난 포스팅에서는 이번 트래킹맵 프로젝트의 소개와 서버코드로 다양한 데이터를 로봇과 주고받고, 로봇의 현재위치를 웹소캣으로 받아서 위성맵 위에 점으로 찍는 HTML까지 구현해보았다.

 

오늘은 저번 1단계에서의 피드백을 바탕으로  2단계에 서버코드를 개선하고 최근 경로표시 기능을 추가한다.

 

 

 

 

 

[ 2단계 개요 ]

 

1. 파이프라인

2. 서버코드2

3. 최근 20분경로만 표시 및 자동업데이트

 

 

 

 

1. 파이프라인

 

1. 이전에 포트포워딩 해놓은 24101외부포트로부터 웹소캣으로 전국의 모든 로봇의 데이터정보를 받는다.(from RabbitMQ MQTT메시지) -> 이를 서버스크립트와 HTML에 구현하여 양쪽 모두 실시간 로봇의 gps데이터를 받는다.

: HTML에서도 웹소캣을 연결한 이유는 실시간으로 현재위치를 찍을 때, 굳이 서버와 연동하지 않는게 더 가볍고 빠를 것 같았다.

 

2. 서버스크립트에서는 이 gps데이터를 몽고 DB에 실시간으로 모두 저장한다.

: 웹소캣으로 들어오는 총 8대의 로봇에 대한 모든 정보 중, gps데이터만 topic으로 가져와 저장한다.

 

3. gpsdata컬렉션에 모두 저장하고, 이 저장된 데이터들의 시간정보를 넣어 1분 간격으로 gps20data컬렉션에 따로 저장한다.

: 그럼 8대의 로봇의 gps데이터가 1분 간격으로 저장이 된다.

: 컬렉션의 최대 데이터수를 160으로 제한하여 각 로봇마다 20분 분량의 경로데이터만 저장되게끔 한다.

: 로봇8대 * 20개의 gps데이터(20분) = 160개

 

4. HTML에서 이 gps20data의 데이터를 호출하여 지도에 주황색으로 찍게 한다.

: HTML에서는 로봇의 ID만 변경하여 원하는 로봇의 경로를 찍을 수 있다.

 

 

 

 

 

2. 서버코드2

 

위의 기능을 추가하기 위해 지난 시간의 서버코드1을 업그레이드 하였다.

 

먼저 웹소캣과 연결하여 RabbitMQ를 거쳐 MQTT메시지형태로 들어오고 있는 모든 로봇의 데이터를 서버스크립트로 들어오게 한다.

 

 

 

 

 

저장할 몽구스DB와 연결

 

먼저 몽구스 라이브러리를 가져오고 연결한다.

 

 

 

 

다음은 들어온 메시지를 처리하는 함수이다.

 

제이슨형태로 파싱하고, gps_location을 토픽으로 받아서 해당 데이터만 받아오도록 하였다.

 

그리고 if (matches)구문에서 추출한 gps데이터를 GPSdata모델을 활용하여 몽고DB의 gpsdata에 저장하도록 한다.

 

 

 

 

그리고 아래 코드로 gpsdata수를 100개 이하로 제한한다.

: 만들어진 시간순서대로 정렬하여, 가장 늦게 저장된 데이터들은 순차대로 삭제하는 방식이다.

 

100개로 제한한 이유는 이 콜렉션은 아래서 만들 1분마다 20개가 저장될 gps20data콜렉션을 위해 만든 임시콜렉션이기 때문이다.

: gps20data는 이 gpsdata콜렉션에서 1분간격으로 데이터를 가져와 저장하는 방식이다.

 

 

 

 

 

*** 문제 및 해결 ***

 

그런데 자꾸 gpsdata 콜렉션에 100개가 넘어가는 현상을 겪었다.

이렇게 되면 무한대로 계속 저장되어 용량을 너무 많이 잡아먹는다.

문제가 뭘까 찾아보던 중, 웹소캣으로 한번에 너무 많은 데이터가 빠르게 들어오면 제한된 양보다 더 많이 저장된다는 버그가 있다는 것이다.

 

그래서 다음과 같이 개선하였다.

 

위 코드에서 now - lastSavedTimestamp < gpsdatas_interval 조건문 현재 시간(now)과 마지막으로 데이터가 저장된 시간(lastSavedTimestamp) 사이의 차이가 설정된 간격(gpsdatas_interval)보다 작을 경우, 즉 데이터가 너무 자주 저장되는 경우, 추가 데이터 저장을 하지 않고 함수에서 빠져나가도록 한다.

gpsdatas_interval 변수는 2000밀리초(2초)로 설정했고 최소 2초의 간격을 두고 GPS 데이터를 데이터베이스에 저장하도록 제어한다. 이렇게 하여 서버와 데이터베이스에 너무 많은 요청이 한꺼번에 들어오는 것을 방지하고, DB콜렉션의 안정성을 유지할 수 있었다.

 

 

 

 

결과적으로 몽고DB의 컬렉션에 잘 저장되고있는 모습이다.

 

 

 

 

 

 

데이터 갯수도 제한된 100개 이상으로 초과되지 않았다.

 

 

 

 

 

 

다음은 GPSdata모델의 스키마(정의)이다.

 

다음과 같은 키 밸류 쌍으로 밸류의 데이터형식을 지정해준다.

 

 

 

 

 

이제 1분 간격으로 총 20분 분량의 gps데이터를 저장할 gps20data콜렉션을 구현한다.

 

먼저 저장형식 스키마를 정의하고, 그 방식을 토대로 모델을 구현한다.

 

 

 

 

 

로봇ID를 순회하며 각 로봇 1~8번까지의 각 로봇의 gps데이터들이 1분 간격으로

쭉 저장되게 한다.

 

 

위에서 저장한 GPSdata콜렉션을 조회한 후, 1분 인터벌로 각 로봇의 데이터를 GPS20data컬렉션에 저장한다.

위 파이프라인에서 설명했듯이, 데이터제한은 160개로 제한한다. (8대로봇 * 20개의 데이터)

 

 

 

 

아래는 20분 분량의 몽고DB gps20data 컬렉션 결과이다.

 

 

 

 

 

갯수도 제한한 160개를 초과하지 않고 잘 저장되고 있다.

 

 

 

 

다음은 gps20data에서 특정로봇의 데이터를 조회할 수 있는 API를 만든다.

 

이는 HTML에서 호출할 수 있게 해준다.

 

 

 

다음 포스팅에서는 만들어진 서버코드2로 2단계 HTML을 구현해보도록 하겠다.

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts