책에서 다 설명할 수 없었던 IT/프로그래밍 배경지식과 추가 정보, 학습 방법과 자료들에 대해서 소개하는 보충 수업입니다.
프로그래밍이 너무 어렵다고 포기하지 마시고 즐겁게 프로그래밍하면서 원하는 바를 이루시길 바랍니다!
안녕하세요. ‘암호화폐 자동매매 시스템 만들기 with 파이썬' 지은이 정성문입니다.
제 책은 초보자가 간단하게 잘 동작하는 자동매매 시스템을 만드는 과정을 처음부터 설명하고 있습니다. 개발 환경을 설정하고, 요구 사항의 정의하고 10장까지 모듈을 하나씩 만들면 텔레그램으로 컨트롤할 수 있는 자동 매매 시스템을 만들게 됩니다.
책에서는 파이썬의 꽃이라는 리스트 컴프리헨션이나 asyncio 등의 고급 기술을 배제한 채 기본적인 제어문만을 사용해서 초보자도 코드를 쉽게 이해할 수 있도록 하였습니다. 각 모듈은 200라인이 넘어가지 않는 간단한 구조를 갖고 있어서 100라인 내외의 파일 하나만 이해하면 모듈을 하나씩 이해할 수 있습니다.
그럼에도 불구하고 어렵다고 하시는 분들이 있습니다. 그것은 아마도 책에서 다루지 않는 IT/프로그래밍 기본 개념들에 대해서 익숙하지 않은 분들일 것 같습니다. 예를 들어, 클래스나 인터페이스, 스레드, 추상화, 멀티프로세스, 큐와 같은 개념은 누군가에게는 너무 당연하지만, 비전공자에게는 매우 어렵게 느껴질 수도 있습니다. 사실 그런 개념조차 전혀 알 필요 없이 프로그램을 만들 수도 있습니다.
어쩌면, 인터넷에 떠돌아다니는 많은 프로그램이 그런 식으로 작성되어 있습니다. 전역변수와 역할이 모호한 함수들을 사용해서 한두 개의 파일에 순차적으로 동작하도록 작성하면 당장 동작을 이해하는 것이 더 쉬울지도 모릅니다.
하지만, 그것은 결코, 절대 좋은 방법이 아닙니다. 프로그래밍을 아주 잘 못 배우게 되는 과정이라고 생각합니다. 당장 동작하는 코드를 만들기 위해서, 눈앞에 빠른 결과물만을 고려하는 방식입니다. 최단거리 알고리즘을 만들고 튜링상을 수상한 다익스트라는 다음과 같은 말을 했습니다.
아시는 분은 아시겠지만 BASIC이라는 언어는 초창기에 아주 쉽게 프로그래밍을 할 수 있도록 고안된 언어입니다만, 아주 쉽다는 목적은 달성했지만 컴퓨터 구조나 논리적인 프로그래밍과는 거리가 멉니다.
파이썬은 범용 언어로써 다양한 방식으로 사용이 가능합니다. BASIC처럼 당장 초보자도 코딩의 맛을 보는 역할로 사용할 수도 있을 것입니다. 하지만 진정한 프로그래머가 되려고 한다면, 제가 책에서 소개해 드린대로 요구사항부터, 함수, 모듈의 역할을 정하고 이해하게 쉬운 코드로 함수와 모듈을 작성하는 방법을 익히시길 바랍니다. 어쩌면 그것은 초보 개발자에게, 처음 발걸음을 내딛는 개발자에게 더욱 중요합니다.
예상했던 것보다 시간이 많이 걸리고 더 많은 노력이 필요하다고 생각하실 수 있습니다. 하지만 그 허들을 넘으면 파이썬이 아니라 다른 언어도 금방 배우실 수 있을 것이고, 뒤죽박죽으로 만들어 놓은 프로그램의 잘못된 동작 때문에 밤낮으로 에러 코드와 싸우는 일도 줄어들 것입니다.
책의 내용과 smtm 프로그램은 제가 짧지 않은 기간 동안 경험했던 내용을 바탕으로 제대로 프로그램을 만드는 과정에 대해서 작성했습니다. 쉽고 자세하게 설명하려고 노력했지만, 독자분들의 배경지식이나 학습에 투여할 수 있는 시간과 노력을 생각해 볼 때 불만족스러운 부분이 있을 수 있을 것 같습니다.
송구스럽지만, 부족한 부분은 다른 서적과 인터넷에서의 정보를 통해 채워주시길 부탁드리고 싶습니다. 제 책이 어렵더라도 프로그래밍에 대한 흥미를 잃지 말고 부디 목표한 바를 이루시기를 진심으로 기원하겠습니다.
2023년 12월 정성문 드림
파이썬은 쉽습니다. 하지만 컴퓨터와 프로그램이 어떻게 동작하는지 모른다면 파이썬으로 프로그램을 만드는 일이 결코 쉬운 것만은 아닙니다.
대부분의 파이썬 책에서 파이썬에 대해서만 이야기하지만 프로그래밍 자체를 이해하지 못하고 파이썬을 학습하려는 독자들이 있습니다. 물론 자세하게 몰라도 파이썬을 배우면서 느낌적으로 프로그램을 이해하는 경우가 많지만, 끝내 머릿속에서 정리가 되지 않은 채 혼란 속에서 프로그래밍을 포기하는 경우도 많은 것 같습니다.
그런 분들은 컴퓨터의 구조와 프로그램의 동작 원리에 대해서 먼저 공부해 보세요.
프로그램이라는 것은 컴퓨터를 동작시키는 명령어들의 집합이라고 볼 수 있습니다. 매일 사용하는 스마트폰에 어플리케이션, 안드로이드, 인터넷 브라우저 모두 별개의 프로그램이며 각자의 목적에 맞게 동작하도록 프로그래밍 되어 있는 것입니다. 이 부분이 굉장히 중요한데, 좋은 한국어 영상을 못 찾겠네요.
파이썬은 스크립트 언어이고 파이썬으로 여러분이 작성한 파이썬 스크립트를 실행하는 순간 하나의 프로그램이 실행되면서 여러분이 작성한 프로그램이 규칙에 따라 순서대로 실행됩니다. 그러므로 우리의 목적은 파이썬 코드를 만들어서 컴퓨터에게 일을 시키는 것으로 정의할 수 있습니다.
컴퓨터의 구조나 프로그램의 동작 원리가 중요하다고 했지만, 그것을 모두 정확하게 알고 있을 필요는 없습니다. 앞에서 말했듯이 대부분의 사람들은 느낌적으로 그것을 이해하고 대충 넘어갑니다. 그렇게 적당히 이해하고 넘어가는 사람도 있고, 하나하나 꼭꼭 씹어서 소화시켜야 다음으로 넘어가는 분들도 있더라고요. 어느 것이 정답인지는 모르겠지만, 모두 잘 알면 좋지만 반드시 지금 다 알아야 하는 것은 아니고, 적당히 이해하고 나중에 다른 개념과 함께 이해하면 더 잘 이해가 되는 경우가 있는 것이 사실입니다.
적당히 컴퓨터의 구조를 알고 파이썬 프로그램이 어떻게 동작하는지 이해가 되면, 본격적으로 파이썬을 학습하면 되는데, 저는 책에서 나온 정도의 지식이면 충분하다고 생각합니다. 솔직히 파이썬 문법과 용법 다 알고 프로그램 만들어도 결국 다시 찾아보게 됩니다. 😆
책에 나온 내용은 파이썬 공식 사이트의 자습서를 참조했습니다. 그 정도면 파이썬 프로그래밍을 시작할 준비는 충분하다고 생각하며, 조금 더 실습을 원하는 분들은 관련된 온라인 자료를 살펴보면서 감을 잡아보시길 추천드립니다.
책에도 썼지만 자료형부터 시작해서 문법을 줄줄이 설명하고 있는 책을 읽고 나서 시작하는 것은 절대 비추입니다!
개인적인 경험에 비춰보면 비전공 신입 사원이나 인문 전공 다른 직군 임직원 중에서도 엑셀에서 함수나 조건문등을 잘 쓰는 것을 넘어서 간단한 프로그래밍을 잘 하는 분들이 있는 반면, 컴퓨터 구조를 이해하는 것에 어려움을 느껴서 간단한 프로그래밍 수업을 듣고도 힘들어하는 사람이 있습니다.
파이썬이 쉽다고 해야 할지, 어렵다고 해야 할지는 파이썬 이전에 그런 감각과 개념을 얼마나 잘 이해하고 있는지가 중요한 것 같습니다.
여기저기서 파이썬이 쉽다고 해서 엑셀이나 파워 포인트처럼 공부해서 직관적으로 뚝딱 사용할 수 있다고 생각하시면 안 됩니다. 파이썬이 아무리 쉬워도 프로그래밍은 복잡한 컴퓨터에게 시킬 일을 구조적으로 작성하는 창조의 과정이고, 프로그래밍이 처음인 분에게는 온통 생소한 개념입니다. 하지만, 초반에 그 개념만 잘 이해하면 컴퓨터를 일꾼으로 사용하는 강력한 힘을 갖게 될 것이니 포기하지 말고 멋진 프로그래머가 되시길 응원합니다.
‘3장 시뮬레이터부터 만들자' 부터 본격적으로 개발을 시작하게 되는데, 개발에 앞서 가장 먼저 하는 것은 요구사항을 정의하는 것입니다. 비전공자가 프로그래밍을 시작할 때 서툰 부분이기도 하고, 프로그래밍에 익숙지 않은 주니어 개발자들이 개발 초기 가장 막막해하는 부분이기도 합니다.
어떤 일이든 목표를 잘 설정해야 순조롭게 진행할 수 있는 것처럼, 소프트웨어 개발도 요구사항을 잘 정의하는 것부터 시작입니다. 위에 소개한 블로그 글에 나온 내용을 모두 알 필요는 없고, 저렇게 자세하고 꼼꼼하게 요구사항을 정리하고 문서화해야 한다는 뜻은 아닙니다. 하지만, 프로그래머 스스로가 요구사항을 분명하게 이해한 후에 프로그래밍을 시작해야 하는 사실은 변함이 없습니다. 책에서 소개한 것처럼 간단하게라도 반드시 요구사항을 먼저 정의하는 것부터 프로그래밍을 시작하세요.
요구사항이 얼마나 구체적이고 작은 범위를 기술하고 있는지 레벨을 설정하는 것도 중요합니다. 우선, 크게 전체 시스템의 요구 사항에 대해서 정리를 합니다. 그리고 큰 기능에 대한 요구사항을 정의합니다. 그리고 모듈 내부의 클래스나 함수의 요구사항을 정의하면서 프로그래밍을 진행하면 됩니다. 처음에는 낯설기도 하고 어떻게 시작해야 할지 막막할 수 있습니다. 인터넷에 떠돌아다니는 코드는 많아도 요구사항까지 정리해서 함께 공개되는 코드는 별로 없고, 정식으로 프로젝트를 진행해 본 경험이 없으면 더욱 어렵게 느껴질 수 있습니다.
‘암호화폐 자동매매 시스템 만들기 with 파이썬' 3장에서 요구사항 정리 및 설계
챕터를 통해서 시스템을 만들 때 가장 먼저 해야 할 일들 배울 수 있습니다. 다른 모듈에서도 꼭 요구사항을 먼저 정의하고 개발을 시작하는 방법으로 설명을 하고 있습니다. 처음엔 힘들 수 있지만, 요구 사항을 정리해 보고 설계부터 시작해야 합니다. 다짜고짜 거래소에서 캔들 정보를 가져오는 코드부터 만들거나, 주문을 넣는 코드를 만드는 것부터 시작하려 했다면 반드시 본인의 프로그래밍 습관에 대해서 다시 생각해 보시길 바랍니다. 제대로 된 준비 없이 코드부터 만드는 경우, 빠르게 코드가 만들어지는 것 같이 보여도 반드시 우왕좌왕 시행착오를 겪게 될 것입니다.
요구사항을 잘 정의한다는 것은 해야 할 일을 명확하게 기술할 수 있다는 것이고, 이것은 AI 시대에도 아주 중요한 능력입니다. chatGPT 등을 잘 활용해서 프로그래밍을 잘하는 사람은 이 능력이 뛰어납니다. 만들어야 할 함수의 기능과 역할에 대해서 잘 설명해 줘야 chatGPT가 좋은 답변을 줄 수 있기 때문입니다.
협업을 위해서도 코드를 만들기 전에 만들 코드를 정확히 설명할 줄 알아야 합니다. 익숙치 않은 분들은 책의 설명과 함께 차근차근 연습해 보시길 바랍니다.
책이 초급자에게 너무 어려운 것이 아니냐는 의견이 있는데, 초급자에게 어려울 수 있는 내용이 분명히 있습니다. 하지만, 초급자는 몰라도 되는 내용은 아닙니다. 몇몇 개념은 초급자가 금방 쉽게 숙달할 수 있는 내용이 아닙니다. 대표적인 것인 테스트 주도 개발 Test Driven Development입니다.
TDD에 대한 소개 영상을 몇 개 찾아봤습니다. 그나마 최근에 한국어 영상도 좀 올라오고 있네요. TDD가 어려울 수 있지만 중급자 이상만 사용하는 고급 스킬이 아닙니다. 오히려 제대로 된 프로그래밍 습관을 갖추기 위해서라도 시작부터 TDD를 제대로 이해하고 적절하게 사용하는 것이 좋습니다.
물론, 반드시 TDD를 사용해야 하는 것은 아닙니다. 그렇게 때문에 책에서도 TDD에 대한 소개를 짧게 하고 있으며, TDD를 모르고도 책과 프로젝트를 이해하는 데에는 아무런 문제가 없습니다. 하지만, 제대로 TDD를 학습하면서 프로그래밍을 배워볼 수 있는 기회는 많지 않습니다. 전문 개발자가 아니라 취미로 프로그래밍을 하는 경우 TDD를 접해 보지 못한 분들도 많이 있습니다. 책에서 소개된 TDD 내용을 잘 이해해서, 프로젝트에 구현된 테스트를 중심으로 TDD까지 배울 수 있다면 정말 얼마나 좋을까요! 책에 나온 내용만으로 TDD가 잘 이해가 되지 않는다면, 일단 책의 내용을 따라 경험을 해보며, 다른 학습 자료를 활용해서라도 꼭 한 번 TDD를 배워보시길 추천드립니다.
앞에서 말씀드린 대로 TDD가 필수 사항은 아닙니다. TDD는 개발 방법론 중 하나이며, 모든 방법론이 그러하듯이 상황에 맞게 적절하게 사용하는 것이 중요합니다. 개인적으로도 TDD는 선택, 테스트는 필수라고 생각합니다. 그런 의미에서 아래 영상을 추가로 하나 더 소개 드립니다.
소개 드린 영상의 내용에 모두 동의하는 것은 아닙니다. 동의하는 부분도 있고, 동의하지 않는 부분도 있습니다. 하지만, 개발자라면 한 번쯤은 스스로 생각해 보고 자신에게 맞는 방법을 선택해서 사용해야 합니다. 어쩌면 테스트와 TDD 모두 책에서 소개하고 있는 암호화폐 자동매매 시스템을 만드는 데 꼭 필요한 것이 아닐 수 있습니다. 어쩌면 책에서 굳이 언급하지 않아도 되었습니다만, 시작부터 제대로 된 프로그래밍을 학습할 기회를 제공하고 싶어서 조금이나마 내용을 담아 보았습니다. 괜히 책만 더 어렵게 만들고, 독자만 혼란스럽게 만든 것은 아닌가 생각도 들지만, 부디 제 뜻이 잘 전달되어 많은 독자분들이 성장할 수 있는 기회가 되길 바라겠습니다.
암호화폐 자동매매 시스템 smtm의 구조를 보면 여러 개의 파일, 모듈로 구성되어 있는 것을 확인할 수 있습니다. 각 모듈은 분명한 역할을 가지고 구분이 되어 있어서 모듈 하나를 따로 이해하기 좋은 구조입니다. 이런 구조를 잘 만드는 것은 전체 프로젝트를 효과적으로 유지 보수하는데 매우 중요합니다.
하지만, 일부 초보 개발자는 모듈과 패키지를 구분하지 않고 하나의 파일에 무분별하게 코드를 작성하기도 합니다. 당장 동작하는 코드를 만들겠다는 생각만 앞서서 코딩에 집중하기 때문입니다. 이런 개발자들은 모듈과 패키지로 구분하는 일이 어렵고, 또 번거로운 일이라고 생각할지도 모르지만 시간이 가면서 프로그램이 복잡해질수록 관리 비용이 급격하게 증가하게 되는 것을 알 수 있습니다.
물론, 코드가 몇 줄 안되거나 꼭 같이 있어야 하는 코드라면, 굳이 일일이 모듈을 나눌 고민을 할 필요는 없습니다. 실용적으로 적절한 시점에 모듈을 분리하는 것이 중요합니다. 그 적절한 시점을 판단하는 것이 어렵게 느껴질 수 있지만, 책을 통해서 smtm 프로젝트를 이해하는 과정에서, 왜 모듈을 이렇게 나눴는지 생각도 해보고 지식과 경험을 늘려가보시길 바랍니다.
smtm는 v1.4.0
버전에서 controller
, data
, strategy
, trader
package를 만들고 동일한 역할의 모듈들을 패키지로 묶었습니다. 프로그램이 점점 더 커지면서 관리해야 할 모듈이 많아짐에 따라 유지 보수를 더욱 쉽게 하기 위해서 수정되었습니다. 이렇게 기능은 변하지 않은 채로 구조나 코드 내용을 변경하는 것을 리팩터리 Refactoring이라고 합니다. 소프트웨어는 꾸준히 리팩터링을 통해서 유지 보수 비용을 낮추고, 성능을 개선하는 작업을 진행하는 것이 중요합니다.
리팩터링 관련해서는 괜찮은 글과 영상을 찾을 수가 없어서 초보자분들에게는 다소 어려울 수 있는 마틴 파울러의 영상과 책을 소개 드리게 되었습니다. 당장 알아야 하는 것은 아니니 시간이 허락한 다면 한 번쯤 알아보는 것을 추천드립니다.
독자분들 중에 그냥 mycode.py
파일 하나에 코드 넣어서 만들고, smtm랑 어떻게 연결해서 사용하는지에 대한 문의를 몇 번 받은 적이 있는데요. 모듈과 패키지의 개념에 대해서 먼저 이해를 해보시고, import
방법도 제대로 이해하는 시간을 가지시길 바랍니다. 당장 기능과 아무런 상관이 없는 것 아니냐고 하실지 모르겠지만 잘 정리되지 않은 채로 작성된 코드는 추후 문제가 발생하거나 기능을 추가할 때 반드시 어려움을 겪게 되고, 다른 사람의 도움을 받거나 협업은 거의 불가능합니다.
mycode.py
하나 작성해서 python mycode.py
를 실행하는 방식은 실습할 때만 사용하시고 가능하면 패키지와 모듈을 잘 구분해서 잘 구조화된 프로그램을 작성하시길 바랍니다.
프로그래밍을 처음 배운 경우 일반적으로 작성한 코드가 순차적으로 실행되는 것에 익숙합니다. 절차 지향 프로그래밍라고도 하는데, 수행하고자 하는 작업을 하나의 절차 procedure로 구분하고 그것을 순차적으로 실행하는 개념입니다.
이 방법은 간단한 작업을 기술하기에 매우 좋습니다. 간단한 아침식사를 준비한다고 했을 때, 우리는 식빵을 꺼내서 토스터에 넣고 빵을 구운 다음 잼을 바르고, 커피를 내리고 빵과 함께 먹습니다. 차근차근 설명하면 어린아이도 쉽게 이해할 수 있습니다.
반면, 4식구의 아침식사를 준비하는 경우는 어떨까요? 토스트 말고, 계란프라이와 베이컨도 굽고 우유와 밀크티도 준비해야 한다면 어떨까요? 동시에 진행해야 할 일도 있고, 어떤 작업은 다른 작업이 수행된 이후에 시작되어야 하는 경우도 있습니다. 계란프라이 같은 경우 타지 않도록 중간중간 확인도 해줘야 합니다. 이처럼 현실의 복잡한 작업을 좀 더 쉽고 생산적으로 프로그래밍하기 위해 고안된 것이 바로 객체지향 프로그래밍입니다.
파이썬은 대화식 모드 Interactive Mode를 지원하고, 데이터 과학자나 인공지능 연구원들이 Jupyter Notebook를 통해 짤막한 파이썬 코드를 실행하여 사용하는 경우가 많습니다. 그러한 영향인지 몰라도 인터넷에 돌아다니는 초보자들의 위한 코드들도 구조화된 프로그램보다는 짤막한 코드들이 많습니다.
하시만 이런 짧은 코드를 모아서 절차 지향 프로그래밍을 통해 프로그램을 만드는 것은 매우 안 좋은 생각입니다. 과학자나 인공지능 연구원들은 파이썬을 이용해서 본인 연구의 결과물을 확인하는 것이지 어떤 프로그램을 작성하는 것이 아닙니다. 잘 만들어진 오픈소스 프로그램의 구조를 확인해 보세요. 예를 들어 플라스크 flask나 장고 django와 같은 프로그램이나 독립적으로 동작하는 애플리케이션의 코드를 확인해 보는 것도 좋습니다.
파이썬으로 이제 막 덧셈 뺄셈하고, 파일 읽어오고, API 호출하는 거 간신히 마쳤는데, 갑자기 객체 뭐시기라니! 당황스러울 수 있습니다. 어렵다고 생각이 들기도 하고, 추가로 무언가를 배워야 한다는 생각에 거부감이 들 수 있습니다. 하지만 생각보다 그렇게 어렵지 않고, 조금만 배워서 사용해도 많은 효과를 볼 수 있습니다.
꼭 객체지향 프로그래밍을 사용하지 않아도 되고, 클래스를 사용하지 않아도 자동매매 시스템 만들 수 있습니다. 하지만, 그게 더 쉽고 장기적으로 더 효율적일 수 있습니다. 반복해서 말하지만, 프로그램은 꾸준히 업데이트가 필요합니다. 우리가 만들 프로그램이 나사나 볼트처럼 그 역할이 아주 단순하고 변경되지 않는 것이 아니기 때문입니다.
당장 주문이 체결되는 동작을 코드로 만드는 것이 중요한 것이 아니라 실질적으로 사용하고, 필요에 따라 계속 업데이트할 수 있는 프로그램을 만드는 것이 우리의 목표입니다.
객체지향 프로그래밍은 객체를 중심으로 객체가 할 일을 잘 정의해서 객체마다 따로 구현을 할 수 있어서, 복잡한 동작도 쉽게 이해할 수 있는 작은 객체로 나눠서 구현할 수 있습니다. smtm에서 각각의 클래스가 하는 일은 굉장히 간단합니다. 그래서 객체를 하나씩 이해하는 것은 결코 어려운 일이 아닙니다. 그 간단한 객체들이 모여서 복잡한 자동매매 시스템을 구성합니다. 정말 멋지지 않나요?😆
처음엔 복잡한 시스템을 어떻게 객체들로 잘 나눌 수 있을지 막막할 수는 있습니다. 그래서 책에서 어떻게 시작하면 좋을지, 어떻게 객체를 나누고 추가해 나갈 수 있을지 설명하고 있습니다. 처음이라서 낯설고, 당장 성과를 위해서 포기하지 마시고 잠깐 시간을 내셔서 객체지향의 핵심을 확인해 보시고 책과 함께 smtm가 완성되어 가는 과정을 통해서 객체지향 프로그래밍까지 함께 익혀보시길 추천드립니다.
객체지향 관련된 몇 가지 글과 영상을 소개 드립니다. 초보자분들은 영상이 더 도움이 되실 것 같습니다. 사실 관련 정보가 워낙 많아서 어떤 것이 좋을지 막막할 수가 있는데, 완벽하게 이해하는 것에 초점을 두지 말고 적당히 개념을 이해하고 smtm를 통해서 차근차근 이해해 보시는 방법을 추천드립니다.
추상화는 책에도 간단하게 설명이 되어 있는데, 중요한 부분, 핵심을 뽑아내는 것입니다. 한자로는 추상이라는 단어가 감이 잘 안 오는데, 영어로 Abstration는 그나마 좀 더 감이 오는 것 같습니다. 둘 다 어렵나요?😅
프로그래밍뿐만 아니라 어떤 일이든지 핵심을 뽑아내는 것은 매우 중요합니다. 공부 잘하는 친구들이 요점 정리 잘하는 것과 비슷합니다. 요점 정리를 잘해서 프로그래밍을 해야지 중복된 코드를 줄일 수 있고, 불필요한 코드를 만들지 않을 수 있고, 불필요한 수정 작업을 피할 수 있습니다.
생활코딩 채널에서 설명이 잘 되어 있는 영상을 소개 드리는데, 영상에 나온 것처럼 객체지향 프로그래밍에 추상화 개념이 많이 딸려나오지만 사실 추상화는 객체지향에 국한되는 개념이 아닙니다. 그리고 추상화라는 것이 단순히 클래스에만 적용되는 것도 아닙니다. 함수나 변수에도 적용될 수 있는 개념인데, 그 부분은 꼭 한번 생각해 보시길 권해드립니다. 추상화를 제대로 이해했는지 확인하기도 좋을 것 같습니다.😀
4장 컨트롤러에서 가장 어려운 개념은 스레드일 것입니다. 스레드 역시 초보 개발자가 진정한 개발자가 되기 위해서 반드시 넘어야 할 산 중에 하나입니다. 스레드와 프로세스를 모르고 프로그래밍을 한다는 것은 컴퓨터의 구조를 모르고 컴퓨터를 동작하게 만드는 프로그램을 만드는 것과 같습니다. 앞서 ‘파이썬은 쉽지만'에서 컴퓨터 구조나 동작원리의 중요성을 강조드렸는데, 같은 맥락입니다.
스레드나 프로세스의 개념을 모르고, 프로그래밍을 하는 프로그래머는 본 적이 없습니다. 하지만, 인터넷 따라 하기 시리즈에는 잘 언급이 안 되는 것이 현실입니다.
스레드는 기초 지식이기 때문에 많은 자료가 있지만, 실제 그것을 어떻게 사용해야 하는지, 주의할 점은 무엇인지 아리송한 질문이 떠오를 때가 있습니다. 그럴 때는 챗gpt를 적절히 활용하시는 것도 좋을 것 같습니다.
4장에는 Worker 모듈도 함께 소개되고 있습니다. 챗gpt도 말하고 있지만 스레드는 그 동작을 잘 알고 제대로 사용하지 않는 경우 오히려 문제를 발생시킬 수 있습니다. 좀 골치 아픈 녀석이라고 생각할 수 있습니다. 그런 스레드를 쉽게 사용할 수 있도록 스레드를 사용한 일꾼을 추상화한 모듈이 바로 Worker 입니다. 추상화의 좋은 예제가 추가되었네요!😀
Worker는 멀티 스레드를 사용해서 주어진 작업을 수행하며 스레드와 관련된 처리를 모두 해주고 있습니다. Worker를 사용하면 스레드에 대해서는 신경 쓰지 않아도 됩니다. 한번 확인해 보세요. smtm 전체에서 스레드를 생성하는 곳은 Worker 한 곳뿐입니다.
이렇게 관련된 기능을 한곳에 모아두면 관리하기도 편하고 사용하기도 편리합니다. 멀티 스레드 환경에서 신경 써야 하는 동시성 문제 등을 한곳에서 처리할 수 있습니다. 그리고 이렇게 잘 추상화되어서 만들어진 모듈은 다른 프로그램에서 재사용하기에도 좋습니다. Worker라는 모듈이 꼭 smtm에서만 사용되어야 하는 것이 아니잖아요. 보통 회사와 같은 전문 조직에서는 이런 코어 모듈들을 잘 만들고 관리하면서 소속 개발자들이 편리하게 사용할 수 있도록 합니다. 재사용을 통해서 효율을 높이는 것이죠. 내부 라이브러리와도 같은 개념인데, 더 일반화되고 일반에 공개되어도 좋겠다고 생각되면 외부에 공개 라이브러리로 발전하기도 합니다.
Worker는 멀티 스레드 환경에서 동시성 문제를 해결하기 위해서 내부에 루프와 큐를 가지고 있습니다. 이러한 구조는 smtm만의 독창적인 발상에서 나왔다기보다는 꽤나 일반적인 구조입니다. 그림은 안드로이드에서 사용되는 handler, message queue, looper의 동작에 대한 그림인데, smtm의 worker도 거의 동일한 원리로 동작하고 있습니다.
관련된 부분이 궁금하신 분은 심화 학습을 통해서 지식의 폭을 확장해 보시는 것도 좋습니다. 갑자기 안드로이드 강의 영상이 추가되어 있는데, 어떻게 사용되는지 예제를 설명하는 것이니 꼭 알아야 하는 것은 아닙니다. 아무래도 안드로이드 앱은 이미 예제가 많고, 사용자 입력을 처리하는 부분이 반드시 필요하기 때문에 smtm가 사용자 입력을 처리하는 Controller에서 Worker를 사용하는 것과 같은 고민에 대한 좋은 예제가 될 수 있습니다.
Controller와 Operator는 참 비슷한데 왜 두 개로 나눠서 구조를 더 복잡하게 만들었는지 모르겠다는 분들을 위해서 짧게나마 둘로 나눈 이유와 함께 소프트웨어 아키텍처에 대한 이야기를 해보려고 합니다.
사실 둘을 하나로 합쳐도 무관합니다. 둘을 합치면 중복되는 코드가 줄어들어서 훨씬 작고 간결한 모듈로 만들 수도 있습니다. 그럼에도 불구하고 둘로 나눈 이유는 분명히 더 좋은 점이 있기 때문입니다. Controller는 흔히 말하는 GUI 역할을 담당하는 모듈입니다. 사용자의 입력을 처리해서 시스템에 이벤트를 전달하는 역할을 담당하고 있습니다. Operator는 핵심 모듈들을 연동하여 사용자의 요청에 따라 시스템을 운영하는 역할을 담당하고 있습니다. 즉, Controller는 사용자를 바라보고 있고, Operator는 핵심 모듈들을 바라보고 있습니다. 그리고 그 둘이 함께 시스템을 동작하게 만드는 것입니다.
이렇게 역할이 분명한 모듈은 분리하는 것에는 여러 가지 장점이 있습니다. 소프트웨어를 개발하기도 편리하고 유지보수도 효율적으로 할 수 있습니다. 바로 확인할 수 있는 예로 Controller는 TelegramController
, JptController
등으로 확장되는 과정에서 시스템에 아무런 영향을 주지 않았습니다. 버그가 발생할 가능성도 적고, 혹시라도 문제가 발생해도 빠르게 대처할 수 있습니다.
이렇게 개발 효율을 높이기 위해 모듈을 분리하고 모듈 사이에 선을 그어서 소프트웨어 아키텍처를 만듭니다. 이 과정을 보통 소프트웨어 설계 단계에서 진행합니다. 일반적으로 요구사항을 도출하고 나서 프로그램을 코딩하기 전에 진행되곤 합니다.
하지만, 많은 경우 소프트웨어 아키텍처를 설계하는 일에 지나치게 많은 리소스가 사용되었고, 결정적으로 설계 내용은 프로젝트가 진행되는 과정에서 필연적으로 수정을 필요로 했기에 설계 프로세스의 효율과 효용에 대한 고민이 많았습니다. 마침 애자일 방법론이 대두되면서 문서보다는 동작하는 코드를 우선시하며 개발하는 경우가 많아졌습니다. 설계 프로세스를 유연하게 적용하게 된 것입니다.
어쩌다 보니 작게 시작한 이야기가 매우 큰 주제로 넘어갔습니다.😅 그만큼 중요한 부분이라고 할 수 있겠습니다. 책에서는 설계부분을 다루지 않거나 아주 간단하게만 설명하고 있습니다. 만약 설계 부분까지 자세히 다뤘다면 정말 프로그래밍의 교과서처럼 되어 버렸을지도 모르겠습니다.
smtm는 아주 큰 규모의 프로그램이 아니지만 그렇다고 해서 소프트웨어 아키텍처에 대한 고민이 필요 없는 것은 아닙니다. 그렇다고 해서, 엄격한 설계 프로세스를 거쳐서 소프트웨어 아키텍처를 구성한 것도 아닙니다. 적절한 수준을 잘 찾아서 효율적으로 좋은 프로그램을 만들기 위해 노력했습니다만, 적절한 수준이 어느 정도일지 한 번 스스로 생각해 보면 좋을 것 같습니다.😀
프로그래밍이 익숙지 않거나 이제 막 시작하는 개발자라면 설계, 아키텍처라는 말 자체가 굉장히 부담스럽고 막막하게 생각될 수 있습니다. 하지만 너무 어렵게 생각할 필요 없이 책에서 소개하는 내용과 smtm를 통해서 소프트웨어 설계와 아키텍처에 대한 감을 익혀보시면 좋을 것 같습니다. 모르고도 동작하는 프로그램을 만들 수는 있지만 좋은 프로그램을 쉽게 만드는 방법을 알고 싶다면 꼭 시간을 투자해 보세요.
smtm 시스템의 아키텍처에 대해서는 smtm 위키 2. 아키텍처에서 보다 많은 정보를 얻을 수 있습니다.
Analyzer 모듈은 주석을 포함해서 800라인 정도 됩니다. 아마 smtm에서 그나마 가장 복잡하고 큰 모듈일 것입니다. 게다가 Pandas나 NumPy, mplfinance등의 외부 라이브러리를 사용하고 있어서 조금 어렵게 느껴지실 수도 있습니다. 하지만 smtm의 다른 모듈들과 의존성이 매우 낯고 독립적으로 구동이 가능하기에 가장 심플한 모듈이기도 합니다. smtm의 구조나 동작에 대해서 잘 몰라도 Analyzer를 이해하고 확장하는데 큰 어려움이 없다는 뜻입니다.
Analyzer는 smtm 시스템의 주요 데이터를 입력받고, 요청에 따라 그래프와 표를 그리는 역할이 전부입니다. 다양한 그래프를 통해서 시각화를 좀 더 개선해 보고 싶다면 Analyzer 모듈만 수정하면 됩니다. smtm에서 사용하는 캔들 데이터와 수익률 정보들을 바탕으로 그리고 싶은 그래프가 있다면 Analyzer를 확장해 보세요.
Pandas와 NumPy, mplfinance 등의 라이브러리를 추가로 학습하는 것이 힘든 분들은 챗gpt를 활용해 보세요. 수많은 파이썬 라이브러리 중에 어떤 것을 공부해야 내가 원하는 그래프를 그릴 수 있는지 몰라도 쉽게 시작할 수 있습니다.
RSI 지수를 계산하는 간단한 코드도 척척 알려줍니다. 심지어 rolling
을 사용해서 지금 구현되어 있는 것보다 깔끔한 코드를 알려주네요.👍 요즘 점점 더 챗gpt와 code pilot을 많이 사용하게 되는 것 같아요. 주의할 점은 틀린 답을 줄 수도 있기 때문에 검증도 함께 해야 한다는 것입니다.
챗gpt의 놀라운 점은 단순히 지식과 정보를 검색하는 것을 넘어서 제안을 받을 수 있다는 것입니다. 이미 편지나 자소서, 과제에 무분별하게 사용되고 있다는 기사들이 나오고 있는데, 적당히 사용하지 않을 이유가 없습니다. 어떤 일을 할 수 있는지 의견을 물어보는 것도 좋습니다.
챗gpt에게 어떻게 그래프를 활용할 수 있는지 물어보았습니다. 물론 이것도 역시나 답변을 확실히 검증해 볼 필요가 있습니다.
smtm에 Analyzer는 현재 기본적인 그래프와 기능들이 구현되어 있지만, 다양한 파이썬 라이브러리를 마음껏 활용하기 적합한 곳입니다. 필요에 맞게 기능을 추가해서 활용도를 높여보기실 바랍니다.
챗gpt 영상을 하나 찾아보긴 했는데, 굳이 영상 없이도 써보면서 활용도를 넓혀가실 수 있을 거에요.😀
스마트 폰이 대중화되고, 이동 통신 기술이 발달하면서부터 사람들의 클라우드 시스템 활용도가 매우 높아졌습니다. 물론, 인터넷은 닷컴 버블 때도 폭발적인 영향력을 발휘했지만 컴퓨터를 통해서 고정된 공간에서 사용했기에 사용하는 사람의 수가 제한적이었습니다. 하지만, 스마트폰으로 고속 데이터 통신을 통해 다수의 사람들이 언제 어디서나 인터넷에 연결되면서 인터넷을 통해 제공되는 서비스들의 사용자는 폭발적으로 증가하였고 다양한 사람들이 여러 서비스에 접속할 수 있게 되면서 시스템 간의 연결이 매우 중요해졌습니다.
카카오톡을 비롯한 다양한 서비스들이 쏟아져 나왔고, 기존 서비스들도 사용자들이 좀 더 쉽게 접근할 수 있도록 인터페이스를 개선하였습니다. 시스템 간의 연결이 무엇보다 중요해졌기 때문입니다. 이때 즈음 강력하게 떠오르는 기술이 있었으니 바로 REST API / RESTful API입니다.
REST API는 사실 새로운 기술이 아닙니다. 기존에 HTTP 통신을 통해서 시스템이 연결되던 방식을 조금 더 잘 사용해 보자고 정의한 소프트웨어 아키텍처이며, 인터페이스입니다. 그러니까 HTTP 통신으로 시스템에 연결하는 것은 동일한데, 좀 더 세련된 방식으로 서로 데이터를 주고받는 방법을 정의한 것이죠.
REST API가 활성화되기 이전에는 특정 인터넷 서비스를 사용하려면 꽤나 번잡한 방법으로 데이터를 받아왔어야 했기에 각 서비스마다 전용 Client 프로그램을 별도로 제공하곤 했습니다. 아니면 라이브러리와 같은 형태로 제공하기도 합니다. 하지만 요즘에는 많은 서비스들이 RESTful API 형태로 사용하기 편리하게 Open API를 제공하고 있습니다.
책에 나온 업비트나 빗섬은 물론이고 세계적인 거래소에서도 대부분 Open API를 제공하고 있으며, 조금만 시간을 투자하면 누구나 쉽게 Open API를 사용해서 관련 서비스를 사용할 수 있습니다.
책에서는 Open API에 대해서 깊게 다루지는 않았지만, 관련 영상을 보고 조금만 시간을 투자하면 어렵지 않게 Open API의 개념을 습득하실 수 있습니다. 또한, 대부분 RESTful API로 비슷한 형식을 갖추고 있기 때문에 한두 번만 사용해 보면 엄청나게 다양한 많은 API들을 자유 자재로 사용하실 수 있으실 겁니다! 😎
업비트 Open API는 문서도 잘 정리가 되어있고, 샘플 코드도 이미 제공하고 있는데도 불구하고 일부 초보 개발자들은 그것조차 알고 싶지 않다고 Wrapper 라이브러리를 사용하는 것 같습니다. 라이브러리를 사용하는 것은 본인의 자유지만, 아주 어렵지도 않고, 한 번만 익혀두면 뉴스나 환율 같은 정보들도 네이버 같은 곳에서 받아올 수 있으니 당장 쉬운 길만 찾지 마시고, 꼭 한 번 시간을 투자해서 RESTful API와 Open API에 대해서 공부해 보시길 바랍니다.
이번에는 기술적인 내용보다 컨트롤러에 대해서 책에 다 적지 못했던 이야기를 해보려고 합니다. smtm 시스템은 크게 3개의 계층으로 구분되는 아키텍처를 가지고 있습니다. 관련된 내용은 smtm 위키 2. 아키텍처에서 보다 많은 정보를 얻을 수 있습니다.
컨트롤러 계층은 시뮬레이터와 컨트롤러, 텔레그램 컨트롤러, 쥬피터 컨트롤러가 있으며 사용자의 필요에 맞게 수정 또는 추가할 수 있는 구조를 가지고 있습니다. 다양한 옵션을 제공하고 있고, 책에서는 각각의 컨트롤러를 만드는 방법에 대해서 간단하게 소개하고 있습니다.
하지만 아마 대부분 텔레그램 컨트롤러와 시뮬레이터만 사용하시지 않을까 생각됩니다. 그만큼 텔레그램 컨트롤러의 사용성이 뛰어난 것이 아닐까 생각되지만, 동시에 그럴 거면 나머지는 왜 만들었나 싶은 마음이 드는 것도 사실입니다.😅 개발 뒷이야기이라는 이름으로 핑계를 대보려고 합니다.😆
우선 기본 컨트롤러는 반드시 필요한 말 그대로 기본 기능입니다. 많은 사용자 프로그램들이 화려한 GUI를 가지고 있지만 대부분 명령어 기반의 인터페이스를 따로 가지고 있습니다. GUI를 개발과 별개로 명령어 기반 CLI 인터페이스로 대부분의 개발을 하고, GUI는 그 중에 일부 기능들을 구현하는 것이 일반적으로 프로그램을 개발하는 과정입니다. 그래서 개발자용 프로그램들의 CLI 프로그램이나 명령어 스트립트들을 따로 제공을 하기도 하지요. 자동화 프로세스를 만들거나 다른 시스템과 연동할 때에는 그래픽 인터페이스는 필요 없기 때문에 아주 유용하게 활용될 수 있습니다.
smtm의 기본 컨트롤러 역시 명령어를 통해서 간단하게 시스템을 운영하거나 시스템 테스트를 수행해야 할 때 유용하게 사용할 수 있습니다. 뭐, 자주 사용되지는 않겠지만, 그래도 기본 기능은 기본적으로 제공하는 것이 좋지요. 그리고, 개발을 해보면 알겠지만 대부분의 기능은 CLI로 개발하는 것이 편합니다. GUI는 GUI대로 독립적으로 개발하는 것이 서로 부딪히지 않고 빠르게 개발할 수 있는 방법이지요. 심지어 혼자 개발하더라도 따로 분리해서 개발하는 것이 효과적입니다!
주피터 노트북은 파이썬을 애용하는 과학자들이 많이 사용하는 웹 프로그램입니다. 파이썬 코드의 실행과 관리를 담당하는 서버와 사용자 인터페이스를 담당하는 웹 어플리케이션으로 구성되어 있습니다. 간결하고 빠르게 파이썬 코드를 실행해 볼 수 있다는 점은 매우 매력적이며, 웹을 사용했다는 점에서 공동작업이나 세션 관리 등의 웹의 장점을 십분 활용할 수 있습니다.
파이썬 사용할 때 종종 사용하고, 구글 코랩과 같은 서비스를 통해서도 원격으로 많이 사용하고 있었기에 smtm와 같은 프로그램의 컨트롤러로 적절하게 사용할 수 있지 않을까 생각했습니다. 그런데 막상 만들고, 원격으로 사용하다보니 꽤나 불편함이 있었습니다. 직접 서버를 호스팅하다보니 보안도 많이 신경쓰였고, 무엇보다 모바일 GUI의 사용성이 처참했습니다. PC를 통해서 원격으로 접속해서 사용할 때에는 몰랐는데, smtm는 모바일을 통해서 잠깐 잠깐 사용하는 일이 많다보니 모바일 GUI 사용성이 중요하다는 것을 알게 되었습니다.
그럼에도 불구하고 주피터 노트북를 강력히 선호하는 사람들이 있기에 주피터 컨트롤러를 만들고, 만드는 방법에 대해서 소개하는 내용을 추가하였습니다. 많은 분량은 아니지만 해당 내용을 통해서 PC와 모바일의 사용성 차이, 호스팅 방법에 대한 고민 등을 해볼 수 있는 좋은 경험이 될 수 있을 것입니다.
요즘 보니 텔레그램 챗봇을 활용한 자동매매 트레이딩 시스템이 여러 개 나와있는 것 같은데, 아마 텔레그램 챗봇을 사용한 것은 smtm가 처음인 것 같습니다. 텔레그램 챗봇을 처음 사용해 보고 좋아서 사용법을 블로그에 공유(텔레그램telegram 봇bot 사용법 소개 및 후기)했던 것이 2015년이었습니다. smtm 컨트롤러를 추가하다가 모바일 사용성을 위해서 앱이 필요하다는 생각이 들었는데, 파이썬으로 자동매매 프로그램 만드는 데 앱까지 개발할 수는 없어 고민하던 찰나에 텔레그램 챗봇이 생각났습니다.
텔레그램 챗봇은 그 자체로 사용성과 개발 편의성이 매우 뛰어나고, 비용 또한 들지 않는 참으로 고마운 서비스입니다. 간단하게 텔레그램 챗봇의 사용법과 개발 방법을 소개할 수 있을 정도로 개발 편의성이 높고, API들이 설계가 잘 되어 있습니다.
텔레그램 API 역시 앞서 설명서 REST API와 비슷하게 http 연결을 통해서 사용하면 되는데, 안타깝게도 이 API 자체를 잘 설명해 준 영상이나 자료를 찾기 힘들었습니다. 이미 공식 API 자체가 매우 간결하고 편리하게 구성되어 있음에도 불구하고 telepot
과 같은 패키지를 사용해서 봇을 만드는 방법들이 소개되어 있네요. 그런 패키지를 사용해서 챗봇을 만들어도 되지만, smtm에서는 순수하게 requests
만으로도 텔레그램 챗봇을 간단하게 만들 수 있는 방법을 소개하고 있습니다.
별다른 추가 패키지 없이 텔레그램 챗봇을 활용해서 smtm를 컨트롤할 수 있는 텔레그램 컨트롤러의 코드가 500줄 가량 됩니다. 결코 어려운 내용이 없으니, 가능하면 추가 패키지를 사용하지 않고 직접 텔레그램 챗봇의 동작을 이해해서 만들어보세요. 테스트 챗봇 계정 만들어서, 주피터 노트북 등을 이용해서 직접 동작해시켜보면 이해에 많은 도움이 될 것입니다.
텔레그램 챗봇은 파이썬으로 만든 다른 프로그램에서도 유용하게 사용할 수 있습니다. 웹 크롤러나 자동화 프로그램 등의 원격 컨트롤에도 접목할 수 있으니 한 번 잘 익혀두면 다양하게 활용하여 많은 도움을 받을 수 있으니 꼭 시간을 투자해서 마스터해 보시길 추천드립니다.
이번 장의 내용은 마땅히 관련된 영상이나 자료가 많이 없네요. 어디서 돈 받고 가르쳐 주는 것은 아니지만 실무에서는 아주 유용하게, 또는 너무 당연하게 사용될 수 있는 내용에 대해서 추가로 설명을 드렸습니다. 어쩌면 과도한 친절일 수도 있겠지만, 책이 프로그램을 개발하는 과정을 A부터 Z까지 보여드리는 것을 목적으로 하다 보니 컨트롤러부터 개발하고 차근차근 기능을 확장하는 부분을 모두 담게 되었습니다.😎
주피터 노트북이나 텔레그램 챗봇 관련된 내용 등을 포함해서 다양한 내용을 소개하는 것이 빠르고 쉬운 지름길을 알려준 것은 아니지만, 결코 돌아가는 길을 알려드린 것이 아닙니다. 장담하건대, 제대로 배울 수 있는 기회가 될 것임을 확신합니다.
smtm에서 시뮬레이션을 할 때 사용할 과거 거래 데이터를 저장하기 위해서 SQLite를 사용하고 있습니다. 그리고 Repository Pattern을 사용해서 Database와 비즈니스 로직을 분리하였습니다. 초보자가 쉽게 이해할 수 있는 내용은 아니지만 책에서 자세히 다루기에는 조금 지엽적인 내용이기도 하고, 책의 분량과 주제를 고려할 때 자세하게 설명할 수 없었습니다.
이 자리를 빌려서, 관련 부분을 왜 그렇게 구현하였는지에 대한 설명과 함께 학습 자료를 소개해 드립니다.😀
SQLite를 논하기 전에 기본적으로 SQL에 대해서 먼저 정리를 하고 넘어가야 합니다. SW 전공이나 공학 계열 전공자 또는 프로그래밍에 조금이라도 관심이 있으신 분이라면 SQL은 대부분 알고 계실만큼 데이터 베이스에서 독보적인 존재입니다.
SQL은 Structured Query Language의 약어이며, 데이터베이스 시스템에서 자료를 처리하는 용도로 사용되는 구조적 데이터 질의 언어입니다. 구조적 데이터 질의 언어라는 말 자체가 되게 어렵게 느껴질 수 있는데요. 데이터베이스에서 데이터를 조회하기 위해서 정해진 구조를 갖는 명령어 정도로 이해하고 넘어가셔도 좋을 것 같습니다.
SQL은 명령어이고, 그 명령어를 처리하는 데이터베이스는 여러 종류가 있습니다. 오픈 소스인 MySQL부터, 상업용 MS SQL, 오라클 등이 있으며 관계형 데이터 베이스 서버라고 합니다. relational database management system (RDBMS)라고 하며, 다양한 종류가 있습니다.
RDBMS는 말 그대로 독립적인 시스템이며, 흔히 데이터 베이스라고 말하는 서버라고 생각하셔도 됩니다. 반면, SQLite는 많은 곳에서 사용되는 로컬 데이터 베이스 라이브러리입니다. 그러니까 독립적인 시스템이 아니라, 앱이나 프로그램 내부에서 SQL 언어를 사용해서 데이터를 저장하고 조회할 수 있는 라이브러리라고 이해하시면 됩니다.
"SQLite is a database engine written in the C programming language. It is not a standalone app; rather, it is a library that software developers embed in their apps."
RDBMS는 여러 개의 파일을 이용할 뿐만 아니라 규모도 큰 시스템이지만, SQLite는 보통 하나의 파일에 SQL 언어를 사용해서 데이터를 효과적으로 저장, 조회합니다. SQLite에 대해서는 아래 영상에서 잘 소개하고 있는데, SQL 언어를 사용해서 가볍게 사용할 수 있는 라이브러리이며, 파이썬도 표준 라이브러리를 제공하고 있습니다.
SQL과 RDBMS, SQLite의 관계를 제대로 이해하였다며, 이제 어떤 것을 검색해서 내가 원하는 것을 만들어야 할지, 프로그램 내에서 어떻게 동작하는 것인지 감이 좀 잡히실 것입니다. SQL 문법은 MySQL이나 SQLite 등 데이터 베이스 엔진마다 조금씩 차이가 있으므로, 사용하는 데이터 베이스에 맞게 명령어를 수정해서 사용해야 합니다.
데이터의 저장과 조회는 시스템에서 중요한 부분으로, SQL 문법이나 데이터 베이스 최적화가 전체 시스템에 큰 영향을 줄 수 있으며 전문가의 영역이 존재합니다. 하지만 smtm은 데이터 베이스 성능이 중요한 시스템이 아니므로, 모든 문법을 처음부터 외우려고 하지 말고, 필요에 맞는 구분을 검색해서 사용하시는 것을 추천드립니다. 검색이 잘 안되면 chatGPT를 적절히 활용하시는 것도 좋은 방법입니다.😆
smtm에서 database는 SQLite 하나뿐이므로 Repository와 Database가 하나의 모듈로 구현되어도 아무런 문제가 없습니다. 하지만 분명히 역할이 다르고, 관련된 부분을 함께 모아 둠으로써 복잡도가 오히려 줄어드는 효과가 있습니다. 또한, 관련 코드를 유지 보수하거나 확장하는 데에 있어서도 월등히 유리하기 때문에 Database와 Repository를 분리하여 구현하였습니다.
이처럼 비즈니스 로직과 데이터 로직을 분리하기 위해서 Repository 모듈을 만들어서 구현하는 것을 Repository Pattern이라고 합니다. SW에서 자주 사용되는 패턴이라는 의미로 디자인 패턴으로 불립니다. 더 좋은 SW를 만들기 위해서 디자인 패턴을 학습하는 것도 의미가 있지만, 패턴을 알아야만 좋은 SW를 만들 수 있는 것은 아니므로 기회가 될 때 학습해 보시는 것을 추천드립니다.
Repository 패턴 같은 경우는 안드로이드에서 기본적으로 사용이 권장되는 패턴이기도 합니다. 안드로이드 앱을 만들 때도 로컬 저장소로 SQLite를 많이 사용하고 동시에 원격으로 데이터 베이스 서버에 접속하기도 합니다.
smtm에서는 Repository 모듈에서 시뮬레이션을 위한 업비트 거래 데이터를 가져오는 역할을 담당하고, Database에서는 순수하게 SQLite를 사용해서 데이터를 저장하고 조회하는 역할을 담당하고 있습니다.
스레드와 프로세스의 차이를 정확하게 알고 계시나요? 몰라도 개발하는데 문제없다고 생각하실지 모르겠지만, 개발자라면 반드시 정확하게 알고 있어야 합니다. 스레드와 프로세스에 대해서 모르고 프로그램을 만드는 것은, 차량의 엔진 구조를 모르고 관련 부분을 설계하는 것과 비슷하다고 볼 수도 있을 것 같습니다. 동작하는 프로그램은 만들 수 있겠지만, 잘 알아야 제대로 된 프로그램을 설계하고 만들 수 있습니다.
암호화폐 자동매매 프로그램을 만드는데, 스레드와 멀티 프로세스에 대한 설명이 전혀 없는 책이나 강좌들이 있더라구요. 어려워서 뺀 건지 간단하게 동작하기만 하면 된다고 생각하는 것인지 의문입니다. 제 책에는 스레드와 프로세스가 둘 다 사용되고, 간단하게 설명하고 있는데 덕분에 어렵다는 후기만 늘어난 것 같습니다.😭
스레드는 네트워크와 같이 I/O 장치의 대기 시간 동안 동시성을 확보하기 위해서 사용되었고, 멀티 프로세싱은 동시에 여러 개의 파이썬 프로그램을 구동해서 대량의 시뮬레이션을 빠르게 처리하기 위해서 사용하였습니다. 컴퓨터의 구조에 대한 이해가 바탕이 되어야 하기에 초보자에게 조금 어려운 내용일 수도 있지만, 스레드와 프로세스를 잘 다루는 것은 프로그래밍의 핵심을 깨우치는 것과 같으니 조금만 힘을 내서 반드시 체득하시기를 바랍니다.
우선 프로세스에 대해서 간단하게 설명해 보겠습니다. 프로세스는 동작하는 프로그램 그 자체라고 보시면 됩니다. 저희가 프로그램을 만드는 것은 텍스트로 이루어져 있는 코드입니다. 이 코드가 메모리에 올라가서 동작하기 전에는 그냥 파일에 저장되어 있는 데이터에 불과합니다. 사용자가 OS를 통해서 파이썬 프로그램을 실행시키면 그때 우리가 만든 프로그램이 메모리에 탑재되고, CPU 코어를 사용해서 동작하게 됩니다. 이때 단순히 프로그램만 메모리에 탑재되는 것이 아니고, 프로그램이 사용하는 메모리와 자원들, 프로그램 정보 등이 프로세스라는 이름으로 생성이 되는 것입니다.
지금 이 글을 브라우저를 통해서 보고 계실 텐데, 브라우저도 프로세스이며, 파일 탐색기도 카카오톡도 모두 각각의 프로세스입니다. 아, 그리고 같은 코드로도 여러 개의 프로그램을 실행시키면 독립적인 프로세스가 됩니다. 브라우저도 여러 개 실행시킬 수 있고, 파일 탐색기도 여러 개 실행시키면 모두 각각 독립적인 프로세스로 동작합니다. 이 부분이 매우 중요한데, 프로세스는 독립적으로 동작하기 때문에 당연히 CPU 코어를 포함해서 메모리, 네트워크 등의 컴퓨터 자원을 모두 따로 사용합니다. 그렇기 때문에 프로그램을 두 개 실행시키면 이론적으로는 두 개의 프로그램이 함께 동작해서 두 배의 작업 결과를 얻을 수 있습니다.
스레드는 책에서도 조금, 그리고 앞에서도 조금 설명을 하였는데, 완전히 이해하기 위해서는 컴퓨터 구조에 대해서 간단하게라도 이해하는 것이 좋습니다. CPU의 코어는 한 번에 하나의 연산을 수행합니다. 우리가 작성하는 프로그램은 이 코어에게 일을 시키는 것이라고 볼 수 있는데요. 문제는 CPU가 일하다가 기다려야 하는 순간이 생기는 것입니다. 대표적인 것이 네트워크 사용인데요. 자동매매 프로그램이 업비트에서 거래 정보를 가져오는 동안 막연히 기다리고 있으면 사용자의 입력을 처리할 수 없기 때문에 스레드라는 별도의 작업 흐름을 추가하였습니다. 스레드가 추가됨으로써 하나의 스레드는 사용자의 입력을 처리하는 작업을, 다른 스레드는 네트워크를 통해 데이터를 가져오는 작업을 하나의 코어를 사용해서 처리할 수 있습니다. 막연히 기다려야 하는 시간 동안 다른 일을 처리할 수 있게 되었으므로, CPU 코어의 효율이 획기적으로 증가하게 된 것이며, 이것이 스레드의 기본 개념입니다.
이쯤에서 당연히 생겨야 하는 의문이 "프로세스를 두 개 사용하면 굳이 스레드를 만들지 않아도 되는 것이 아닌가?"입니다. 맞습니다. 프로세스는 독립적으로 수행되기 때문에 스레드보다 더 쉽게 두 개의 작업을 따로 수행할 수 있습니다. 하지만, 독립적으로 수행되기 때문에 두 개의 프로세스를 함께 동작하게 하려면 꽤나 복잡하고 많은 비용이 들어갑니다. 프로그램을 두 개 실행시키는 것과 같은데, 비유하자만 프로세스는 두 명의 하나의 자원을 사용하는 것이고, 스레드는 두 개의 팔로 하나의 자원을 사용하는 것과 비슷합니다. 스레드는 같은 프로세스 내에서 생성되기 때문에 자원을 일부 공유하고 있어서 프로세스보다 훨씬 가볍게 생성할 수 있습니다.
스레드와 프로세스에 대해서는 컴퓨터 구조와 프로그램의 동작 원리를 이해하시면 자연스럽게 이해가 되기도 하니, 관련 부분을 재미로라도 한 번 쭈욱 살펴보시길 추천드립니다.
동시성(Concurrency)과 병렬성(Parallelism)의 멀티 스레드와 멀티 프로세싱을 구성하기 전에 반드시 이해해야 하는 개념입니다. 그래서 관련된 설명도 엄청 많은데, 아주 간단하게 설명하자면 병렬성이 실제로 두 개를 동시에 진행하는 것이고, 동시성은 마치 두 개가 동시에 되는 것과 같은 효과를 보는 것입니다. 역시 간단하게 설명하려니 더 어렵네요.ㅋ
그림을 보시면 바로 이해가 되실 겁니다. 위에 병렬성은 실제로 두 개의 스레드가 코어 두 개를 사용해서 두 개의 작업하는 것이고, 아래 동시성은 스레드 두 개가 순차적으로 코어 하나를 사용해서 역시 두 개의 작업을 하고 있습니다. 좀 더 많은 예제와 설명은 아래 글을 참고하시면 좋을 것 같습니다.
동시성과 병렬성을 설명하는 글은 많은데, 왜 그런지 연계해서 설명하는 글이 별로 없어서 아쉽네요. 중요한 것은 빼먹고 설명하고 있는 것 같아요. 그것 역시 컴퓨터 구조와 관련이 있습니다. CPU는 컴퓨터에서 가장 빠른 부품입니다. 자연히 다른 부품들과 동작 속도 차이로 인해서 불필요한 대기시간이 발생합니다. 위에서 설명한 네트워크가 대표적이지만, 하드디스크의 파일에 접근하거나 USB, 블루투스, 그래픽 등등 거의 모든 장치와 함께 일할 때마다 대기시간이 발생합니다. 대부분의 장치들은 I/O라는 인터페이스를 통해서 연결이 되어 있습니다. 이렇게 I/O 대기 시간 동안 CPU가 다른 일을 처리해서 마치 두 개 이상의 일을 동시에 처리하는 것처럼 동작하면 CPU 코어 개수가 늘어난 효과를 볼 수 있습니다. 그것이 동시성의 핵심입니다.
반면, 엄청나게 많은 연산을 하는 작업 같은 경우 I/O 인터페이스를 사용하는 것이 아니라 CPU 코어 혼자 많은 일을 해야 하는 경우일 수 있습니다. 이럴 때는 동시성이 의미가 없습니다. 오히려 컨텍스트 스위칭을 하느라 더 성능이 떨어집니다. 혼자 해야 할 일을 누가 와서 거들어 주겠다고 하면 더 오래 걸리는 경우 있잖아요. 딱 그런 경우죠. 온전히 혼자 집중해서 하는 경우 혼자 하거나 아니면 분신술을 사용해서 또 다른 나를 만들면 됩니다. 그것이 바로 병렬성입니다.
스레드와 프로세스만 해도 이해하기 벅찬데, 이와 중에 하나 더 고려해야 할 것이 있습니다. 바로 파이썬의 Global Interpretor Lock 입니다. GIL로 제대로 파고 들어가면 복잡할 수 있으니 간단하게 설명드리겠습니다. 구현상의 이유로, 파이썬은 하나의 프로세서에서 한 번에 하나의 파이썬 코드만 실행되도록 제한되어 있으며, 그것을 GIL이라고 합니다.
파이썬 코드는 우리가 텍스트로 작성하면 해석하는 모듈에 의해서 해석되어서 CPU 코어를 통해서 실행이 되는데, 이 해석기가 Interpreter이며 동시에 여러 개가 실행되지 않도록 잠근다는 의미로 Lock이라고 합니다. 더 자세한 내용은 위의 글을 통해서 학습해 보세요.
GIL 때문에 대량 시뮬레이션을 할 때 우리는 멀티 프로세싱을 이용해야 합니다. 여러 개의 Simulator를 Worker를 사용해서 실행시킬 수도 있지만, 그렇게 할 경우 어차피 GIL 때문에 한 번에 하나씩 차례대로 수행될 수밖에 없습니다. 즉, GIL 때문에 동시성만 제공되는 상황인데, 여러개의 Simluator를 사용하는 것은 I/O를 사용하는 것이 아니라 병렬성이 필요한 상황이기 때문에 효과가 없습니다. 그러한 이유로 대량 시뮬레이션과 같이 여러 개의 파이썬 코드를 동시에 실행시켜야 하는 경우 파이썬에서는 멀티 프로세싱이 필수인 것입니다.
휴...이제 거의 다 설명드린 것 같습니다. 네트워크 I/O 작업을 효율적으로 처리하기 위해서 스레드를 쉽게 사용하기 위해서 Worker를 만들었고, 대량의 파이썬 프로그램을 수행하기 위해서 멀티 프로세싱을 사용한 이유를 제대로 이해하셨다면, 좋은 프로그래머로서 충분한 기본 자격을 갖추셨다고 생각합니다. 이제 그동안 학습한 내용을 바탕으로 직접 프로그램을 설계하고 수정해 보면서 실력을 쌓아보시길 바랍니다.
smtm 프로젝트는 제가 직접 사용하기 위해서 만들었고, 지금도 잘 사용하고 있습니다. smtm을 통해서 좋은 소프트웨어를 제대로 만드는 방법을 소개하기 위해서 책을 출간했습니다. 하지만, 어렵다는 의견도 많이 접했고, 파이썬이라면 어떤 프로그램이나 쉽게 뚝딱 만들 수 있다는 오해가 많다는 것을 알았습니다.
파이썬은 확실히 누구나 프로그래밍을 할 수 있을 만큼 쉽습니다. 그러나 파이썬으로 좋은 프로그램을 잘 만드는 것은 다른 이야기입니다. 좋은 프로그램이란 어려운 기술을 사용한 복잡한 프로그램이 아니고, 이해하기 쉽고, 관리하기 쉽고, 새로운 기능을 추가하기 쉬운 프로그램입니다. 당장 동작하는 프로그램을 빨리 만드는 것 이상으로 중요한 것이 바로 좋은 프로그램을 만드는 것입니다.
파이썬은 쉽지만 좋은 프로그램을 만드는 것은 쉽지 않은 것은, 한글이 배우기 쉽지만 한글로 소설이나 연설문을 잘 쓰는 것은 결코 쉬운 것이 아닌 것과 같습니다. 한글로 소설이나 연설문을 잘 쓰려면 한글도 잘 알아야 하지만 소설과 연설문에 대해서도 공부와 연습이 필요합니다.
이제 막 파이썬으로 간단한 프로그래밍을 해보며 프로그래밍에 재미를 들인 초보 개발자분들께 조금은 송구스럽지만, 조금만 힘을 내서 소프트웨어의 세계로 한걸음 더 들어와 주시길 바랍니다. 조금 더 학습하고 실습하면서 원하는 프로그램을 더 쉽고 잘 만들 수 있게 되길 응원하겠습니다.