hyun.lawyer
Personal thoughs of hyun

[코딩하는 변호사] 파이썬 시작하기

저는 “문송”입니다. 철학과 정치학과 법학을 했죠. 대충 업무에서 다 써먹는 것 같지만, 결국 법으로 먹고 사는거죠.

저는 “문송”이라고 생각해 본 적이 없습니다. 개인적으로 “문송”할 필요는 없다고 생각합니다. 예를 들어 보죠. 지금 은퇴하신, 70 넘으신 변호사님들께 물어 보면, 옛날 로펌에 가장 많이 고용한 사람은 변호사도 사무장도 비서도 아닌 타이피스트였다고 합니다. 변호사들이 원고지에 만년필로 한자 한자 꾹꾹 써서 넘기면, 비서들이 타이피스트에게 이걸 가져다 주면, 타이피스트가 타자기로 쳐서 가져다 주었다는거죠. 어디 취직할 때 이력서에 운전면허증과 워드프로세서 자격증같은 것을 적어 내던 시절이었죠. 요즘은 그런 거 다 할 줄 안다고 가정합니다. 십년, 아니 오년만 지나도 파이썬같은 정도는 그냥 다 안다고 가정하는 시절이 올겁니다. 그런 시절이 오면 “문송”할 이유가 없어지는거죠.

딱히 제가 “문송”할 이유가 없었던 이유도 따지고 보면 저는 대체로 코딩을 많이 하는 편이었죠. 믿거나말거나 계약서도 코딩했으니까요. 다른 사람보다 업무 효율은 높다고 자신합니다. 그게 아직도 제가 먹고 사는 이유죠. 시간당으로 돈을 받는 업계에서 남들 열시간 걸릴 일을 일곱–여덟시간에 해 낸다는 것은 나름 경쟁력인거죠.

갑자기 주식투자를 시작해 보았습니다. 팔십 내지는 백살까지 살거라고 생각하면, 인생에 대해서 뭔가 다른 전략이 필요하겠죠. HTS라는 것을 써야 돼서 갑자기 윈도를 설치해서 아들이 두고 간 옛날 컴퓨터를 징발했죠. i3 칩이 깔려 있는 LG 일체형 컴퓨터인데, 무지 느려서 일단 4G 램을 8G 두 개를 사서 꽂아서 16G로 업데이트했습니다. 내친 김에 SSD도 하나 사서 꽂았습니다. 제법 빠르더군요. 고백하자면, 아직까지 윈도 컴퓨터를 제대로 사용해 본 적이 없었습니다. 주력으로 사용하던 것이 3–4년 주기로 맥과 리눅스를 왔다갔다했죠. 한국에서는 윈도 컴퓨터를 꼭 써야 합니다. 저도 세금 계산하는 때가 오면 썼었죠. 그렇지만, 그건 일년에 한 번 5월에 있는 일이고, 일년에 한 번 정도야 그냥 아무 컴퓨터나 써도 됐었죠. 주식투자하려면 진짜로 꼭 필요합니다. 좀 윈도와 친해져 보려구요.

내친 김에 코딩에 대해서도 조금 정리해 보려고 합니다.

필요한 것이 파이썬을 깔아야 합니다. 두 가지 방법이 있는데, 하나는 WSL을 이용하는 것이고, 두번째는 Anaconda라는 것을 설치하는 것입니다. 두 번째를 선택하겠다면, WSL 설치에 대한 것은 그냥 넘어가도 됩니다.

일단 요즘 윈도에는 WSL이라는 것이 있습니다. “Windows Subsystem for Linux”라고 해서 윈도에서 리눅스를 돌리는 완전히 새로운 방법입니다. 일단 이걸 설치합니다. 이유는 코딩하려면 온갖 개발도구가 필요한데, 이게 WSL이 있으면 무지 편합니다. 일단 PowerShell이라는 것을 관리자로 시작하고, 터미널에서 다음을 입력합니다.

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

이러면 윈도가 재부팅합니다. 그 다음에 윈도 스토어에 가서 원하는 것을 선택해서 설치합니다. 무료입니다. 보통 Ubuntu를 선택하죠. 잘 모르겠으면, Ubuntu로 선택해서 설치하세요. 맨 마지막에 사용자명과 패스워드를 선택해서 입력합니다. 그 다음에는 Ubuntu의 패키지 관리 프로그램을 이용해서 프로그램을 설치합니다. 파이썬을 사용하려면 다음과 같이 합니다.

$ sudo apt update 
$ sudo apt upgrade
$ sudo apt install python3 python3-pip

아니면, 아나콘다 홈페이지에 가서 다운로드받아 설치합니다.윈도용 설치페이지에서 받아서 설치하면 되는데, 주의할 점은 혹시 이걸로 증권사의 API를 이용하려면 반드시 32-Bit를 골라서 설치해야 한다는 겁니다. 아니면 64-Bit를 설치하면 됩니다. 숫자가 높을 수록 조금 더 좋다고 보면 됩니다.

일단 어떻게든 파이썬을 설치했다면, 다음에는 코딩용 편집기를 골라서 설치합니다. 저는 마이크로소프트에서 나온 (옛날에는 마이크로소프트에서 나온 것은 대체로 싫어했는데, 요즘은 아주 달라 졌습니다) VS Code를 선택했습니다. 아니면, atom을 써도 좋습니다. 옛날에는 sublime text를 쓰기도 했었는데, 요즘은 앞의 두 개 가운데 하나를 쓰면 됩니다.

만약 WSL을 설치하지 않았다면, 이 단계는 건너뛰어도 됩니다. WSL을 설치했다면, 이게 어떻게 작동하는지도 알겸, WSL에서 직접 VS Code를 띄우는 방법으로 다음의 설정을 해 보죠. 리눅스를 사용하는 사람은 사실상 bash라는 셸을 사용하는 겁니다. 여기에서 윈도에 설치된 VS Code를 띄우는 방법입니다. 일단 WSL을 띄운 상태에서 vinano 등을 이용하여 .bashrc라는 파일을 편집합니다. 맨 아래에 다음과 같이 입력합니다.

alias code="/mnt/c/Users/hyun/AppData/Local/Programs/Microsoft\ VS\ Code/Code.exe /c 'code'"

이걸 편집한 다음에는 WSL 터미널을 껐다가 다시 켜든지, 아니면 다음의 명령을 실행합니다.

$ source .bashrc

설명하자면, 리눅스의 alias 명령은 명령어의 가명을 지정해서 그걸 치면 연결된 프로그램이 실행되는 것입니다. 흥미로운 것은 WSL은 리눅스지만, 이렇게 윈도 프로그램을 연결하여 사용할 수 있다는거죠. 이제 code라고 치면 자동으로 윈도용 VS Code가 실행되는거죠. 아톰을 설치했다면, 아톰으로 하면 됩니다. 한 가지 더 해 보죠. 좀 다른 걸로… 좀 다른 방식으로… 요즘은 네이버에서 나온 웨일이라는 브라우저를 사용하기도 합니다. 예를 들어, 윈도에서 이걸 설치했다면, 이걸 리눅스에서 실행하려면, 앞의 .bashrc에 다음과 같이 추가하면 됩니다.

export DISPLAY=:0
export BROWSER=/mnt/c/Program\ Files\ \(x86\)/Naver/Naver\ Whale/Application/whale.exe

이게 중요한 이유는 리눅스 파이썬에서 웹브라우저를 띄울 때 어떤 웹 브라우저를 띄울지 지정하는거죠. 어떤 브라우저라도 됩니다. 구글 크롬이건 마이크로소프트 엣지이건… 만약 이렇게 했다면, 다음의 파이썬 프로그램을 만들어 보죠. 간단하게 VS Code를 열고 다음과 같이 입력해 봅니다.

#!/usr/bin/python3
import webbrowser
url = "https://finance.naver.com"
webbrowser.open_new(url)

그 다음에는 아무 이름이나 지어서 저장합니다. 반드시 .py로 끝나야 합니다. 예를 들어 whale.py같이 저장하는거죠. 그리고, 다음과 같이 실행합니다.

$ chmod +x whale.py
$ ./whale

이 프로그램은 간단히 웹브라우저를 열고 (앞에서 export 명령으로 설정한 웹브라우저를 열고), 지정한 URL로 가는거죠. 지금까지 따라 했다면, 브라우저가 열렸을 겁니다. 이게 안된다면, webbrowser 모듈을 설치해야 할 수도 있습니다. 다음과 같이 합니다.

$ pip3 install webbrowser

우리는 네이버 금융 홈페이지를 넣었으니, 거기로 가겠죠. 아주 간단하죠? 아주 간단한 이유는 우리는 어차피 남이 만들어 놓은 프로그램을 이용하는 것이기 때문이죠. 우리같은 “문송”들에게 공대생이 가르쳐주지 않는 가장 큰 비밀은 바로 공대생들이 코딩을 할 때 90%는 사실상 남이 만들어 놓은 프로그램을 그냥 활용한다는 겁니다. 좀 유식하게 “거인의 어깨 위에서” 어쩌고 하지만, 막말로 하자면, 남들이 다 차려 놓은 상에 숟가락 하나 얹는거죠.

위 프로그램을 조금 더 자세히 보겠습니다. 첫줄 — 보통 “시방”이라고 합니다. 욕이 아니라 영어로 shebang이라고 하는 겁니다 — 파일은 여기 적힌 프로그램을 이용해서 자기를 실행하라는 뜻입니다. 만약 이것 없이 이 프로그램을 실행하는 방식은 다음의 첫줄입니다. 아래 두 줄은 같은 일을 합니다. 둘째줄은 앞에서 우리가 이미 써 먹었던 것인데, 비교해 보면 아주 간단해졌죠. 다 ‘시방’ 덕분입니다.

$ /usr/bin/python3 whale.py
$ ./whale

두번째 줄에서는 다른 사람이 만들어 놓은 프로그램 — 그것도 파이썬 안에서 돌아가는 프로그램, 모듈이라고 하죠 — 을 사용하겠다고 선언하는 겁니다. 바로 이 부분이죠. import webbrowser

그리고, 그 다음 줄은 변수를 지정하는 줄입니다. url = "https://finance.naver.com" 변수 지정이라 하면, 뭔가 좀 프로그래밍쪽에서 쓰는 심오한 말 같지만, 맞습니다. 등호 그러니까 = 앞의 것과 뒤의 것은 같은 것으로 취급하라는 뜻입니다. 즉, 이 프로그램에서 내가 url이라고 말하면, https://finance.naver.com과 같은 것이라고 알아 들으라는 뜻입니다.

맨 마지막 줄에서는 웹브라우저를 엽니다. webbrowser.open_new(url)

여기에서 괄호 속에 있는 url은 웹브라우저를 열고, 가야 하는 주소죠. 이것은 우리가 사용하는 어깨 (그러니까 거인의 어깨)가 그렇게 정해 놓은거죠. 마침표 앞의 webbrowser라는 것은 앞의 줄에서 임포트한 webbrowser라는 모듈을 사용하라는 뜻이고, 마침표 다음에 있는 것은 그 모듈에서 정해 놓은 open_new라는 명령을 사용하라는 뜻입니다. 프로그래밍쪽에서는 메써드라고 합니다. 영어로 method죠. 그리고, 열 때 내가 앞에서 url이라고 하면 알아 먹으라고 해 놓은 네이버 금융 페이지로 가라는거죠. 즉, 이 줄은 다음과 같이 써도 무방합니다.

webbrowser.open_new('https://finance.naver.com')

그럼 왜 굳이 이걸 두 줄로 나눴을까요? 답은 그냥 일을 좀 더 쉽게 하기 위해서입니다. 지금 이 수준에서는 별로 차이도 없죠. 프로그램을 약간만 고쳐 보죠. 예를 들어, 내가 네이버 주식을 가지고 있고, 사실 원하는 것은 네이버 주식을 확인하는 것이라고 치면, 두 가지 방법이 있습니다. 앞의 url = 다음의 내요을 바꾸는 방법이 있고, 아니면, webbrowser.open_new()의 괄호 안을 바꾸는 방법이 있죠. 예를 들어, 네이버 금융 창에서 네이버라고 입력해 보면 다음의 주소로 갑니다. https://finance.naver.com/item/main.nhn?code=035420

약간 바뀌었죠. 두번째 방법을 써도 됩니다. 그런데, 앞의 방법을 쓰려면 다음과 같이 고치면 됩니다.

url = "https://finance.naver.com/item/main.nhn?code=035420"

주소를 조금 자세히 들여다보면, 맨 뒤에 035420으로 끝납니다. 이게 코스피에서 사용하는 고유번호인거죠. 티커라고 합니다. 카카오로 가 보죠. 주소가 이렇게 바뀌었죠. https://finance.naver.com/item/main.nhn?code=035720 맨 뒷자리 번호만 바뀌었습니다. 네이버는 035420 그리고 카카오는 035720

자 그러면, 이제 이 두 개의 주식을 확인하고자 한다면, 어떻게 할까요? 이게 이제 프로그래밍의 묘미입니다. 그냥 네이버 금융 페이지로 가거나 네이버 주가 페이지로 가거나 하는 일은 굳이 파이썬을 안써도 상관 없죠. 그런데, 두 개를 같이 확인하고자 한다면, 어떻게 하죠?

한 번 해 보죠. 파이썬 프로그램을 이렇게 바꿔 보죠.

#!/usr/bin/python3
import webbrowser
all = ('035420', '035720')
for a in all:
    url = "https://finance.naver.com/item/main.nhn?code=" + a
    webbrowser.open_new(url)

웹페이지 두 개가 동시에 열렸죠? 이제 새로운 세상이 열린 겁니다. 내가 가진 주식 내지는 확인하고 싶은 주식의 티커 번호만 위의 all 다음의 괄호에 넣으면 (반드시 콤마로 구분합니다) 원하는 만큼 브라우저를 열 수 있습니다.

방법을 조금 바꿔 보죠. 내가 원하는 것을 매번 바꾸고 싶다면, 그걸 키보드로 타이프하고 싶다면, 이렇게 하면 됩니다.

#!/usr/bin/python3
import webbrowser
import sys

for a in sys.argv:
    url = "https://finance.naver.com/item/main.nhn?code=" + a
    webbrowser.open_new(url)

그 다음에는, 이렇게 해 보죠.

$ ./whale.py 035420 035720

위에서는 all이라는 것을 지정하는 대신 키보드에서 내가 직접 번호를 입력하면, 입력하는 숫자 대로 다 받아서 원하는 만큼 브라우저를 띄워 주는 프로그램을 만든 겁니다.

마지막으로 한 가지 주의할 것을 말씀드리고 오늘 이야기는 이만… 위에서 for라는 문장을 쓰고 나서는 다음에 이어지는 내용은 모두 네 칸씩 스페이스를 입력한 다음에 문장을 시작했습니다. 그것은 네 칸씩 들어가서 입력한 내용은 위의 내용 즉 for a in sys.argv:에 이어지는, 그러니까 연결되는, 그러니까 for 문의 일부라는 뜻입니다. 그것은 for로 시작한 문장의 안에서만 의미있다는 이야기인거죠.

앞에서도 비슷한 문장을 썼었죠. for a in all: 이것과 for a in sys.argv: 이것은 비슷하죠. 다만 첫번째의 경우에는 앞에서 all = ... 문장을 통해서 all이 무엇인지를 정의했던 것이구요. 두번째의 경우는 import를 두 번 했었죠. 두번째는 import sys를 했구요. 여기서 syswebbrowser와 비슷한데, 시스템에서 기본적으로 제공하는 명령어가 포함된 패키지, 그러니까 앞에서 모듈이라고 한 거죠. 여기에 포함된 것 가운데 하나가 argv입니다. argv는 명령어 창에서, 그러니까 터미널에서 명령어를 칠 때 뒤에 같이 넣은 것들이구요. 이것들 각각을 리스트에 받아 둔 것입니다. 예를 들어 다음과 같이 프로그램을 수정해 보죠.

#!/usr/bin/python3
import webbrowser
import sys

print(sys.argv)
for a in sys.argv:
    url = "https://finance.naver.com/item/main.nhn?code=" + a
    webbrowser.open_new(url)

만일 저처럼 파일명을 whale.py라고 정했다면, 그리고 위에서처럼 명령을 주었다면, 다음과 같은 출력이 나왔을 겁니다.

./whale.py
['./whale.py', '035420', '035720']

내가 스페이스로 구문하여 입력한 것들 각각이 나오는거죠. 눈이 밝은 사람이라면, 한 가지 묘한 동작을 확인했을 겁니다. 그건 바로 명령어 다음에 두 개만 입력했는데, 브라우저가 세 개가 뜬 거죠. 세번째는 또 뜬금 없이 네이버 금융 첫페이지가 나왔을 겁니다. 그건 파이썬의 특징이 아니고 네이버 홈페이지 특징입니다. 아니, 엄밀히 말하면, 파이썬의 특징과 네이버 홈페이지의 특징이 엮여서 묘한 결과를 만들어 낸 거죠. 코드를 좀 더 자세히 살펴 보죠.

sys.argv는 내가 명령어 창에 입력한 것을 모두 묶어서 하나의 리스트로 정리해 두는 겁니다. 그러니, 앞에서 print(sys.argv)와 같이 하면, 세 개가 포함된 목록이 나오는거죠. 모두에 대해서 for 구문이 실행된 겁니다. 이걸 좀 더 자세히 보면,

for a in sys.argv:

이 말은 sys.argv로 받아서 리스트로 묶은 것들을 말하는 겁니다. 이 리스트에 포함된 요소 각각을 a라고 치고, 이들 각각에 대하여 콜론 : 다음에 나오는 문장을 모두 실행하라는 명령이 for인 것입니다. 전체를 다 보죠.

for a in sys.argv:
    url = "https://finance.naver.com/item/main.nhn?code=" + a
    webbrowser.open_new(url)

이제 이해가 되죠? sys.argv로 받아서 저장한 리스트에 포함된 요소 각각에 대하여, 이것들 각각을 a라고 치고, urla 즉 요소 내용을 더해서 url이라고 치고, 이것에 대해서 브라우저를 열라는 거죠. 그러니, 목록이 파이썬 스크립트 이름까지 포함해서 세 개가 되니 브라우저를 열 url도 세 개가 되는거고, 브라우저 세 개가 열린 거죠. 다만 세 번째 url은 “https://finance.naver.com/item/main.nhn?code=whale.py”와 같이 되는데, 이것은 네이버가 이해를 못하는 거죠. 그러니, 네이버는 네이버 금융 홈페이지를 연 겁니다.

프로그래밍에서는 이렇게 의도하지 않았던 결과를 버그라고 합니다. 벌레라고도 하죠. 이 경우에는 그냥 내버려둬도 됩니다. 네이버 금융 홈페이지도 같이 열려도 뭐 상관 없다면요. 만약 원하지 않는다면? 리스트에 대해서 조금 더 공부해야 합니다. 조금 더 공부하고 실행되는 내용을 좀 더 세련되게 하는 것을 디버깅이라고 하죠. 벌레잡기라고도 합니다.

딱히 더 나은 일도 없으니, 한 번 해 보죠. sys.argv는 리스트라는 것에 입력받은 것을 모두 저장해 둔다고 했습니다. 이것들 각각을 접근하려면 어떻게 해야 할까요? 리스트에 있는 것에 접근할 때는 이렇게 합니다. 여기서는 세 개가 저장되어 있는데, 각각의 이름은 sys.argv[0], sys.argv[1], sys.argv[2] 입니다. 그러니까, 0부터 세기 시작하는거죠. 그리고, 리스트는 요소가 저장된 자리를 안다면, 그 자리에 해당하는 자리수를 0에서 시작하여 [0]과 같이 꺾쇠괄호에 넣어서 호출할 수 있네요. 만약 세 번째 창이 열리는 것을 원하지 않는다면 첫번째 것은 빼고, 나머지 모두에 대해서라고 하면 되겠죠? 다음과 같이 하면 됩니다.

for a in sys.argv[1:]:
    url = "https://finance.naver.com/item/main.nhn?code=" + a
    webbrowser.open_new(url)

[0]에 있는 것은 무시하고 그 다음것부터 맨 끝까지라는 뜻으로 sys.argv[1:]과 같이 한거죠. 이제는 리스트에 대해서도 대충 이해했네요. 오늘은 이만…