블로그 이미지
자유로운설탕

calendar

1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

Notice

2017. 2. 23. 21:33 프로그래밍

  이번 시간에는 3교시때 얘기한 암복호화 하는 샘플을 찾아서 이용해 보려고 한다.

 

[목차]

0. 왜 파이썬 공부에 구글을 이용하는게 좋은가?

1. 언어를 바라보는 방법. 파이썬을 어떻게 바라봐야 할까?

2. 파이썬 설치와 환경, 버전 선택 하기의 이유.

3. 만들고자 하는 기능을 모르는 조각으로 나눠 조사해 보기

4. 데이터 베이스에서 내용 가져와 출력하기

5. 암호화 모듈을 이용해 암복호화 해보기

6. 퍼즐 조각들을 합쳐보기

7. 엑셀 파일 사용해 보기 -> 부록 : fuction 을 이용해서, 코드 정리해 보기

8. 정규표현식을 왜 사용해야 할까? 언어속의 미니 언어 정규표현식 살펴보기

9. 입력과 결과를 GUI 화면과 연결해 보기

10. Whois API 이용해 보기

11. 웹페이지 호출해 내용 파싱 하기(BeautifulSoup 그리고 한계)

12. 자동화 - 웹 자동화(with Selenium)

13. 자동화 - 윈도우즈 GUI 자동화(with pywinauto)

14. 자동화 - 작업 자동화

15. 수학 라이브러리 살펴보기

16. 그래픽 라이브러리 살펴보기

17. 머신러닝에서의 파이썬의 역활

18. 웹 프로그래밍 - Legacy Web

19. 웹 프로그래밍 - Flask 살펴보기(feat. d3.js)

20. 웹 프로그래밍 - Django 살펴보기

21. 정리 - 이런저런 이야기

 

 

 

 

[들어가면서]

  3교시 때 아래까지 얘기를 했었다. 그림의 회색 부분을 위한 코드 샘플을 찾는 중이다. 

 

  "2 번째로, aes256으로 암, 복호화 하기 위한 모듈을 찾아보자. 구글에서 'python 3 aes256' 로 찾으면 처음에 스택오버플로우 글이 나오고, 두번째로 우리나라 분이 정리한 문서가 하나 나온다.

http://blog.dokenzy.com/archives/1997"

 

 

 

 

[암호화 모듈 설치]

  해당 샘플을 이용하기 위해 pycrypto 모듈을 아래와 같이 일단 pip 로 설치하려고 해본다. cmd 창에 아래 명령어로 pycrypto 를 설치한다.  

c:\Python\code>pip install pycrypto

 

  그런데 아래와 같은 에러가 발생한다. 아마도 pycrypto 가 더 이상 유지 보수가 안되거나 해서, 파이썬 공식 저장소에 pycypto 가 빌드된 파일이 없어서 빌드를 하려다가, 빌드에 쓸 적절한 컴파일러가 컴퓨터 내에 없어서 에러가 나는 것 같다. 

 error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

 

  에러에 표시된 해당 페이지로 가면, 아래와 같이 Visual C++ 2015 Build Tools 링크가 나온다.

 

 

  막상 설치하려니 궁금한게 하나 생긴다. 에러에서는 Visual C++ 14.0 버전을 설치하라고 하는데, 2015 버전이 14.0 이 맞을까? 구글에서 'visual studio 2015 version number' 찾아 아래 위키의 내용을 보면 14.0 이 2015가 맞는다고 한다. 그럼 고민 하지 말고, 링크를 클릭해서, Visual C++ Build Tool 을 다운 받아 설치 한다.

https://en.wikipedia.org/wiki/Microsoft_Visual_Studio

 

  설치가 잘 완료된 후 다시 pip 설치 명령을 돌리면 아래와 같이 정상적으로 설치된다.

c:\Python\code>pip install pycrypto
Collecting pycrypto
  Using cached pycrypto-2.6.1.tar.gz
Installing collected packages: pycrypto
  Running setup.py install for pycrypto ... done
Successfully installed pycrypto-2.6.1

 

 

  이쯤 와서 정리해 보면 파이썬에서 모듈을 설치하는 방법은 3가지쯤 있어 보이는데, 첫번째는 pip 를 이용해서 패키지 이름을 지정해 공식적인 저장소에서 다운 받아 가져오는 것, 2번째는 다른 사람들이 빌드해 설치본으로 만들어 놓은 exe 형태의 인스톨 버전을 웹에서 다운받아 설치하는 방법, 세번째는 pip 명령어 뒤에 github 같은 웹경로나 로컬 경로를 지정해 wheel 이라는 확장자의 파일을 이용해 설치한다. wheel이 뭔지 궁금해 구글을 찾아보니 zip 파일의 확장자를 wheel 이라고 바꾸어 저장하는 것으로 아마 그 안엔 이미 컴파일된 모듈이 들어 있어 파이썬이 다운 받아 단지 압축을 풀어 모듈 폴더로 복사 함으로써 모듈이 설치되는 원리 같다. 설치 장소는 c:\Python\Lib\site-packages\ 안이다. 아래 링크의 글을 참고...

https://pypi.python.org/pypi/wheel

 

  ※ 뭔가 환경이 바뀌었는진 모르겠는데, 처음 pycrypto 를 설치 했을때는 비슷한 종류의 에러긴 한지만, 명확히 뭐를 설치하라고는 안나오고, "Unable to find vcvarsall.bat..." 요런 식으로만 나와서 구글에서 'python3 install crypto Unable to find vcvarsall.bat' 게 찾아서, 아래 페이지로 가서 wheel 파일을 설치해 해결했었다. 근데 컴파일러 설치가 정석인 것은 같다.

http://stackoverflow.com/questions/32800336/pycrypto-on-python-3-5

 

[64비트]

pip install --use-wheel --no-index --find-links=https://github.com/sfbahr/PyCrypto-Wheels/raw/master/pycrypto-2.6.1-cp35-none-win_amd64.whl pycrypto
[32비트]

pip install --use-wheel --no-index --find-links=https://github.com/sfbahr/PyCrypto-Wheels/raw/master/pycrypto-2.6.1-cp35-none-win32.whl pycrypto 

 

 

 

[암호화 소스 실행]

  그럼 아래 블로그의 소스를 가져와 보자. 테스트 결과 실행이 잘 되니 내용은 바꿀 필요는 없고, 주석만 조금 제거하고 설명을 추가하도록 하겠다. http://blog.dokenzy.com/archives/1997

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#-*- coding: utf-8 -*-
 
# Python 3.4
# author: http://blog.dokenzy.com/
# date: 2015. 4. 8
 
import base64
import hashlib
from Crypto import Random
from Crypto.Cipher import AES
 
# 아마 특정한 블록 사이즈를 채우기 위해서 입력된 값을 임의의 값으로 패딩(채워주기) 하는 코드 인 듯...
BS = 16
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS).encode()
unpad = lambda s: s[:-ord(s[len(s)-1:])]
 
# 초기화 코드 인듯
def iv():
    """
    The initialization vector to use for encryption or decryption.
    It is ignored for MODE_ECB and MODE_CTR.
    """
    return chr(0* 16
 
# 2교시때 설명했 듯이 클래스는 구조를 잘 잡아주는 껍데기 이다.
class AESCipher(object):
    """
    https://github.com/dlitz/pycrypto
    """
 
    def __init__(self, key):
        self.key = key
        #self.key = hashlib.sha256(key.encode()).digest()
 
    # 메시지를 암호화 하는 함수 
    def encrypt(self, message):
        """
        It is assumed that you use Python 3.0+
        , so plaintext's type must be str type(== unicode).
        """
        message = message.encode()
        raw = pad(message)
        cipher = AES.new(self.key, AES.MODE_CBC, iv())
        enc = cipher.encrypt(raw)
        return base64.b64encode(enc).decode('utf-8')
    
    # 메시지를 복호화 하는 함수
    def decrypt(self, enc):
        enc = base64.b64decode(enc)
        cipher = AES.new(self.key, AES.MODE_CBC, iv())
        dec = cipher.decrypt(enc)
        return unpad(dec).decode('utf-8')
 
# 암호화 키 
key = 'abcdefghijklmnopqrstuvwxyz123456'
 
# 테스트 용 문자열
message = '한글을 테스트 합니다.'
 
# 테스트 용 문자열이 암호화 됬을 때 만들어 지는 값
_enc = 'gOXlygE+qxS+69zN5qC6eKJvMiEoDQtdoJb3zjT8f/E='
 
# 테스트용 문자열을 암호화 하고, 미리 암호화 된 값을 복호화 하기  
enc = AESCipher(key).encrypt(message)
dec = AESCipher(key).decrypt(_enc)
 
# 암호화 복호화 한 값이 서로 같음을 비교해 증명 true, true 가 나오면 같다고 증명된다.
print(_enc == enc)
print(message == dec)
cs

 

  그럼 위의 파일을 aes_example_in_python.py 로 저장하고 실행 한다. 저장하고 실행하는 방법이 기억이 안나면 2교시 때 자세히 설명한 부분을 다시 보고 오면 된다.

c:\Python\code>python aes_example_in_python.py
ImportError: No module named 'winrandom'

 

 

  실행을 했는데 또 다른 에러가 난다. 에러를 찾아보기 위해 구글에서 'python 3.5 winrandom' 이라고 찾아본다.  
https://stackoverflow.com/questions/24804829/another-one-about-pycrypto-and-paramiko

 

  아래와 같이 설치된 파일에서 nt.py 파일을 찾아서, 아래 문장을 수정해 저장하라고 그런다.
Problem is solved by editing string in crypto\Random\OSRNG\nt.py:

import winrandom -> from . import winrandom

 

  아래 파일을 열어서 내용을 수정해 준다. import winrandom 이 들어간 내용을 수정해 준다. 

  c:\Python\Lib\site-packages\Crypto\Random\OSRNG\nt.py

 

  다시 실행해 본다. 그럼 아래와 같이 True, True 라고 정상적으로 실행되어 결과가 나온다.

c:\Python\code>python aes_example_in_python.py
True
True

 

 

  ※ 수정한 문장에서 . 이 궁금하면 아래 링크들을 본다. 아마도 pycryto 가 2.x 대 버전만 공식적으로 지원 해서 3.x 대와 문법이 안맞아 그런거 같다고는 하는데 확실하진 않다. (2014년 6월이 최종 업데이트 날짜다)

  http://stackoverflow.com/questions/7279810/what-does-a-in-an-import-statement-in-python-mean

  https://wikidocs.net/1418

 

  ※ 새로운 암호화 모듈을 찾아보기 위해 구글에서 'python 3.6 pycrpto' 를 찾아보니, pycryptodome 이라는 모듈이 대체 되었다고 한다. 실제 프로젝트를 할때는 이와 같이 최신으로 유지보수 되는 많이 쓰는 라이브러리를 쓰는게 맞을 듯 싶다.

http://stackoverflow.com/questions/41813030/problems-with-installation-pycrypto-in-python-3-6

https://dzone.com/articles/an-intro-to-encryption-in-python-3

 

 

  그럼 5교시를 마치고, 6교시때는 4교시때 사용했던 MSSQL 와 함께, 5교시때의 암호화를 같이 머지해서, 만들려 그랬던 기능을 만들어 보도록 한다.

 

 

[추가]

파이썬 3.7의 경우는 본문에 있는 한글 에러 문제가 해결되어, pip install pycryptodome 으로 설치해 사용하면 됩니다^^

 

위의 3.5용 소스는 밑에 댓글 달아주신 것 같이 pycryptodome 사용하면 에러가 나서 아래 코드를 참조하세요. 

https://github.com/bjpublic/python_study/blob/master/%EC%98%88%EC%A0%9C%20%EC%86%8C%EC%8A%A4%20%EC%BD%94%EB%93%9C/05%EA%B5%90%EC%8B%9C/pycrypto_aes256_sample.py

 

 

1
2017.2.24 by 자유로운설탕
cs
posted by 자유로운설탕
2017. 2. 18. 19:22 프로그래밍

  4번째 시간이다. 이번 시간에는 지난 시간에 구현을 위해 나눈 기능 중 DB 와의 연결 부분을 구현하기 위해 MSSQL Express DB 서버를 설치하고, 어플리케이션 용으로 이런 저런 세팅 후, 쿼리를 날려서 테이블 내의 값을 가져오려 한다. 아래의 3교시 그림을 기준으로 하면 회색 박스로 표시되 있는 MSSQL Database 항목이다.  MSSQL 설치 및 원격 연결 설정, DB 생성 및 사용자 생성 부분은 이미 아시거나 설치되어 있다면 건너뛰고 보면 되겠다. 풀버전으로만 설치해 보셨던 분들은 express 버전은 조금 다른 듯 하니 설정 부분만 보셔도 될듯 싶다.

 

 

[목차]

0. 왜 파이썬 공부에 구글을 이용하는게 좋은가?

1. 언어를 바라보는 방법. 파이썬을 어떻게 바라봐야 할까?

2. 파이썬 설치와 환경, 버전 선택 하기의 이유.

3. 만들고자 하는 기능을 모르는 조각으로 나눠 조사해 보기

4. 데이터 베이스에서 내용 가져와 출력하기

5. 암호화 모듈을 이용해 암복호화 해보기

6. 퍼즐 조각들을 합쳐보기

7. 엑셀 파일 사용해 보기 -> 부록 : fuction 을 이용해서, 코드 정리해 보기

8. 정규표현식을 왜 사용해야 할까? 언어속의 미니 언어 정규표현식 살펴보기

9. 입력과 결과를 GUI 화면과 연결해 보기

10. Whois API 이용해 보기

11. 웹페이지 호출해 내용 파싱 하기(BeautifulSoup 그리고 한계)

12. 자동화 - 웹 자동화(with Selenium)

13. 자동화 - 윈도우즈 GUI 자동화(with pywinauto)

14. 자동화 - 작업 자동화

15. 수학 라이브러리 살펴보기

16. 그래픽 라이브러리 살펴보기

17. 머신러닝에서의 파이썬의 역활

18. 웹 프로그래밍 - Legacy Web

19. 웹 프로그래밍 - Flask 살펴보기(feat. d3.js)

20. 웹 프로그래밍 - Django 살펴보기

21. 정리 - 이런저런 이야기

 

 

 

 

[들어가면서] 

  개인적인 의견이지만 파이썬을 사용하기 전에 perl(펄) 이라는 언어를 조금 사용하고 있었는데, 파이썬은 perl 이 현대적 스타일을 지니고 다시 태어난 듯한 느낌이 든다. perl 은 리눅스 쉘 환경을 언어로 축약해 놓은 것 같은 재밌는 느낌도 있고, 30년의 오랜 역사를 통해(파이썬도 25년이 됬다고 해서 놀랐다) 방대하게 축적된 라이브러리와 참고 가능한 코드들이 구글에 많아 필요한 기능을 만들기 편하다고 생각했는데(물론 파이썬 보다 축약적 표현을 많이 써서 코드 가독성은 은근 암호문 같아서 확실히 떨어지는 것 같긴 하다), 파이썬을 경험해 보고 비슷하지만 무척 현대적으로 깔끔하다는 느낌을 받았다. 또 파이썬은 프로그래밍 하는 사람의 스타일에 따라 perl 같은 라이트하게 만들어 유틸성으로 사용하는 스크립트형 코딩도 가능하고, java 나 c# 같은 구조적인 언어가 가진 객체 지향이나, 웹의 mvc 같은 구조의 방식을 취할 수도 있어 스타일을 선택해 사용이 가능하도록 스펙트럼을 넓혀 놓은 것 같다. 기회가 닿는 다면 파이썬과 비슷한 느낌이지만 고전성과 정규식의 미가 있는 펄(perl) 이라는 언어도 한번 사용해 보길 추천한다.

 

 

  그럼 잡담은 그만하고(야매지만 할말은 많다 - -;) mssql 을 설치하고 python 으로 필요한 모듈을 설치하고, 샘플 코드를 만들어 보도록 해보자. 참고로 순서는 아래와 같으니 무엇을 하려고 진행하는 건지 의식적으로 생각하면서 따라해 보자

  1) MSSQL 설치

  2) 서비스 설정

  3) 실습용 DB 및 사용자 설정

  4) 테이블 생성과 데이터 입력

  5) python 으로 조회해 보기

 

 

 

 

1) MSSQL 설치

 

  먼저 구글에서 다음과 같이 다운로드 가능한 링크를 찾는다 'mssql 2016 express download' 두 번째로 나오는 아래의 링크에서 SQL Server 2016 express SP1 을 다운로드 한다.

  https://www.microsoft.com/ko-kr/sql-server/sql-server-editions-express

 

 

  설치 파일을 클릭해 설치를 클릭하고, 아래와 같은 화면에서 기본 설정을 선택 한다. 라이선스를 수락하고(요건 간단해서 스크린샷 생략), 기본 설치 위치로 설치한다(스크린샷 생략). 400 메가 정도의 다운로드가 시작되며 설치가 된다(설치가 예전에 비해 간략해진 듯 하다)

 

 

  그럼 아래와 같이 설치가 완료되었다는 화면이 나온다. 그냥 닫지 말고 아래의 SSMS 설치 버튼을 클릭한다(SSMS 는 SQL Server Management Studio의 약자로 SQL 서버 접속용 클라이언트 이다 - 오라클로 따지면 Oracle Developer 나 오렌지, 토드 같은 툴이다. 앞으로 우리는 SSMS 에서 테이블 등을 만들거나 조회해 준비와 검증을 해보고, 이후 파이썬으로 개발을 할 예정이다).

 

 

  아래 페이지로 이동되면, SQL Server Management Studio 16.5.1 을 다운받아 설치 한다. (900 메가 정도 된다. 배보다 배꼽이 더 크다더니...)

  https://msdn.microsoft.com/ko-kr/library/mt238290.aspx

 

 

  다운 받은 파일을 실행하고 아래와 같이 설치를 시작한다.

  자 이렇게 되면 MSSQL 설치는 무사히 완료됬다.

 

 

 

 

2) 서비스 설정

 

  그럼 서비스 설정을 해보자. 원래 개인적으로 이런저런게 막혀서(특히 원격에서 연결이 안되서 좀 헤멨다) 구글을 찾아 해결 했지만, 해당 부분은 파이썬 공부와 좀 거리가 멀기 때문에 선택과 집중을 위해 헤멧던 검색 과정은 생략하도록 하겠다. 설치된 프로그램에서 SQL Server Management studio 를 실행 하자.

 

 

  SSMS 가 뜨면서 "서버에 연결" 하기 창이 나오면, 서버 이름이 비어 있기 때문에(예전엔 디폴트로 표시됬는데...), 드랍박스를 열어서 "더 찾아보기"를 선택한다. 이후에 서버 찾아보기의 로컬 서버 탭에서 내가 설치한 데이터 베이스를 선택 한다.    

 

 

  이제 서버 이름이 나오고 인증을 Windows 인증 상태에서"연결" 버튼을 눌러 연결한다. (SQL Server는 인증 방식이 두 가지가 있는데, 1번째로는 SQL 설치된 서버에서는 Windows 인증으로 id/pass 없이 관리자 계정으로 들어갈 수 있고, 2번째로는 사용자를 생성하거나 SA(System Administrator) 계정을 활성화 시켜서 id/pass 를 넣어서 들어갈 수 있다)

 

 

  그럼 아래와 같이 개체 탐색기 창이 나타난다. MSSQL 을 처음 설치하면 Windows 인증으로만 로그인이 가능하다(아직 활성화되거나 만들어진 사용자가 없기 때문에). 그런데 우리가 만들 파이썬 프로그램은 id/pass 를 넣어서 SQL Server에서 연결해 사용할 것이므로, 해당 id/pass로 로그인 가능한 옵션을 켜줘야 한다. SQL 서버 이름을 선택하고 마우스 오른쪽 버튼을 눌러서 컨택스트 메뉴를 띄운 후 맨 아래 보이는 "속성" 메뉴를 클릭한다.

 

 

  그럼 "서버 속성" 창이 뜬다. 왼쪽 트리에서 보안 항목을 선택하면 서버 인증 옵션이 보이는데, 디폴트는 아래와 같이 Windows 인증 모드가 체크되어 있는데, "SQL Server 및 Windows 인증모드"를 선택 후 "확인" 버튼을 눌러 적용한다. 그럼 SQL 서버를 다시 시작해야 된다는 Alert 이 뜨며 적용이 된다.

 

 

  SQL 서버 재시작은 cmd 명령어로 하거나, 컴퓨터를 재부팅 해도 되긴 하겠지만 시작 > 모든 프로그램에서 Microsoft SQL Server 2016 > 구성도구 > "SQL Server 2016 구성 관리자" 를 실행 한다. 

 

 

 그럼 아래와 같은 "SQL Server Configuration Manager" 창이 뜨는데, 일단 서비스 재시작을 하기 전에 할 일이 하나 추가되었다. 현재 세팅 상태로만 운영하게 되면 SSMS 에서는 id/pass 로 잘 접속이 되는데, python 이나 telnet 으로는 접속이 안되는 일이 발생했다. 구글을 찾아보니 아래와 같은 안내가 있어 추가 적인 세팅을 한 후 서비스 재시작을 하려 한다. 

http://stackoverflow.com/questions/12774827/cant-connect-to-localhost-on-sql-server-express-2012-2016

 

 

  먼저 TCP/IP 를 enable 시킨다. 왼쪽에서 "SQL Server 네트워크 구성" > "SQLEXPRESS에 대한 프로토콜" 을 선택하고, 오른쪽에서 TCP/IP 항목을 더블 클릭 한다. "프로토콜" 탭에서 Enabled 를 "예"로 바꾸어 준다.

 

 

  그리고 동일한 화면의 IP 주소 탭으로 이동해서 맨아래의 "IPALL" 파트에서 "TCP Dynamic Ports" 항목을 지우고, "TCP Port" 항목에 MSSQL 디폴트 port 인 "1433" 을 넣은 후 확인 버튼을 누른다. 그럼 앞서와 마찬가지로 서비스를 재시작 해야된다는 메시지가 나온다.   

 

 

  서비스 재시작을 위해서, 다시 왼쪽에서 "SQL Server 서비스"를 선택하고, 오른 쪽에서 "SQL Server (SQLEXPRESS)" 항목을 클릭 후 마우스 오른 쪽 버튼으로 컨텍스트 메뉴를 띄워서, "다시 시작" 클릭 해, 서비스를 종료했다 다시 시작한다.

 

  자 이렇게 하면 원격 서비스 설정이 완료이다. 이제 부터는 MSSQL 을 사용하기 위해 세팅하는 부분을 진행한다.

 

※ 파이썬을 돌리기 전에 간단히 서버 연결을 확인 하려면, telnet 서비스를 설치하고 cmd 창에서 'telnet localhost 1433' 으로 정상적으로 연결되는지 보면 된다. 텔넷은 아래 링크에서...

  https://opentutorials.org/module/2160/12506

 

 

 

 

3) 실습용 DB 및 사용자 설정

 

  개체 탐색기에서 "데이터베이스" 항목을 선택 후 컨택스트 메뉴를 띄워(이제 마우스 오른쪽 버튼 누르라는 얘기는 생략한다--;), "새 데이터베이스" 항목을 선택한다.

 

 

  데이터베이스 이름을 "mytest" 라고 입력하고(여러분이 좋아하는 다른 이름을 입력해도 되지만, 그러면 앞으로 제공할 소스에서 디비 이름 항목을 여러분 걸로 수정해 주어야 한다). 확인을 누른다.

 

 

 

 그럼 아래와 같이 별로 한것도 없는데, mytest 란 방금 만든 DB가 보이게 된다.

 

 

 

  자 이제 파이썬 프로그램에서 사용할 사용자를 만들어 보자. "보안" > "로그인" 항목을 선택하고, 컨텍스트 메뉴를 띄워 "새 로그인" 항목을 실행한다.

 

 

  "로그인 - 신규" 창이 뜨면, 왼쪽에서 "일반"을 선택 하고, 로그인 이름 "pyuser"(이것도 역시 원하면 취향대로 이름 만드시고, 나중 소스에서 수정!), "SQL Server 인증" 라디오 버튼을 클릭하고, 암호에 "test1234", 암호 확인에 "test1234" 를 넣는다. 공부하는 건데 암호가 만료되면 귀찮으므로(실제 운영시는 정책을 설정해 패스워드를 주기적으로 바꿔 주는게 보안 적으로 맞다) 아래와 같이 "암호 정책 강제 적용" 체크 박스를 끈다.

 

 

  이후 왼쪽에서 "서버역활" 항목을 클릭하고 sysadmin 을 클릭한다.(요 부분도 사실 admin 권한이므로 실제 웹어플리케이션 등 운영시는 권한을 제한하여 사용해야 한다).

 

 

  마지막으로 "사용자 매핑"을 선택하고, 오른쪽에서 "master" 데이터베이스를 선택하여 하단에서 "db_owner" 권한을 체크하고(이것도 "디비의 주인" 역활이기 때문에 운영에서는 과도한 권한임, master 데이터 베이스는 시스템의 여러 설정 값이나, 디비 스키마(디비구조 설계도) 등이 들어 있는데, 나중에 테이블 컬럼명을 얻어오는 코드에서 사용할 예정이다), 또 우리가 만든 "mytest" 데이터베이스를 선택하여 동일하게 "db_owner" 권한을 체크한다.  그리고 하단의 "확인" 버튼을 눌러 사용자 생성을 완료한다. 이렇게 되면 master db와 , mytest db 에 db_owner 권한을 가진, sysadmin 역할을 지닌 pyuser 사용자가 생성된다

 

 

  이후 SSMS 상단의 "파일" > "개체 탐색기 연결" 메뉴를 띄워 인증 부분을 "SQL Server 인증" 으로 바꾸고 우리가 생성한 id/pass 를 입력한다. 이후 "연결" 버튼을 누른다. 

 

 

  이제 개체 탐색기를 보면 2개의 똑같은 연결 항목이 있을 것이다. 항목 제목을 보면 위쪽은 첨에 우리가 Windows 인증으로 연결한 항목이고, 아래쪽은 지금 pyuser 로 연결한 항목이다.

 

 

  자 그러면 초보자들은 헷깔릴수 있으니, 위의 항목을 선택 후 컨택스트 메뉴를 띄워 "연결 끊기" 를 클릭한다.

 

 

  연결이 끊긴 후 개체 탐색기 메뉴를 보면 우리가 2번째 만든 pyuser 에 대한 항목만 하나 남게 된다. 이제 "mytest" DB 항목을 선택 하고, 컨텍스트 메뉴에서 "새 쿼리" 를 선택 한다.

 

 

  그럼 오른 쪽에 쿼리 창이 열리면서 커서가 빤짝빤짝 거린다. 쿼리창 상단에 마우스를 오버해 올려보면, mytest (pyuser (56)) 이라고 현재 사용하는 DB와 사용자 정보가 나온다.

 

 

  마지막으로 쿼리창에 "select SYSTEM_USER" 라고 입력후, 마우스로 드래그해 선택한다. 그리고 F5키 를 누른다(이것은 SSMS 상단 메뉴에서 "쿼리 > 실행" 을 누르는 것과 동일하다). 해당 명령은 등록된 사용자를 보여주는 명령어로 하단 결과 창에 우리가 등록한 "pyuser"가 보인다. (참고로 마우스로 드래그하여 선택하지 않으면 F5를 눌렀을때, 쿼리 창에 있는 모든 쿼리가 다 실행된다.)

 

  이제 MSSQL 을 파이썬에서 이용하기 위한 모든 준비가 끝났다(개인 적으로 관련 스크린샷 만드는 게 은근 힘들었어서, 큰 산을 넘은 듯하다 --;)

 

 

 

 

4) 테이블 생성과 데이터 입력

 

  이제 그러면 DB 에 테이블을 하나 만들어 보자. 구글에서 "mssql table create sample" 라고 검색해 보자. MSDN 설명은 보통 모든 옵션을 다 나열해서 장황하니 아래와 같이 좀 간략한 샘플을 제공하는 페이지를 참고한다.

  https://www.techonthenet.com/sql_server/tables/create_table.php

 

 

  간략히 설명하면 아래와 같다.

1
2
3
4
create table 소유자.테이블이름 (
   "컬럼이름1" " 담을 데이터형태" "각종제약조건(null 여부, primary, default, check 등)"
   "컬럼이름2" .... 
)
cs

 

 

  소유자를 안넣게 되면 현재 사용자의 테이블이 생성되기 때문에 현재 환경에서는 pyuser 가 dbowner 권한 이기 때문에, dbo(db owner)가 무조건 붙게 된다. 담을 데이터 형태는 파이썬과 마찬가지로 int, char, float 등등으로 컬럼에 담을 데이터의 형을 지정하게 된다. 제약 조건은 null, not null, primary, constraint, identity, foreign key, default value 등 여러가지 항목들이 있으나 해당 부분은 MSSQL 뿐만 아니라 표준 SQL 전반에 대한 공통된 내용이므로 "헤드퍼스트 SQL" 이나 잘 정리되 있는 블로그들을 참조한다(차후 개발 보안 관련 글들을 올릴때 SQL 의 전반적인 내용에 대해서 간단히 다룰 예정이긴 하다). 여기서는 null, not null 만 보자. null 은 해당 컬럼에 값을 넣지 않아도 관계없다는 거고, not null 은 꼭 어떤 값이 들어가야 한다는 얘기다.

 

  예를 들어 test 테이블에 no, name, card 라는 컬럼이 있고, card 라는 항목이 nullable 이라면 "1", "홍길동" 이런 식으로 3번째 card 값을 생략하고 한 행을 만들 수 있다(카드가 없는 사람도 있을 수 있기 때문에, 해당 card 라는 컬럼에 데이터가 비어 있는걸 가능하게 하는 것이다). 또 null 이라는 개념은 join 등에서도 해당 되는 대상이 없는 부분을 판단할때 같은 때도 사용하지만, 테이블 만의 개념을 설명하면 위와 같이 단순히 이해하면 된다. 또 데이터형 뒤에 null, not null 을 안 써준 경우 mssql은 기본적으로 null 형태라고 판단하긴 하는데, null 을 명시적으로 쓰는게 명확한 것 같긴하다. null 에 대한 고찰은 구글에서 'null 개념' 이라고 검색하여 아래와 같은 글들을 참고해 본다.

  http://slowalk.tistory.com/2181

 

 

  그럼 위의 지식을 기반으로 우리 실습에 사용할 supermarket 이란 테이블을 만들어 본다.

1
2
3
4
5
6
7
CREATE TABLE [dbo].[supermarket](
    [Itemno] [int] NULL,
    [Category] [char](20) NULL,
    [FoodName] [char](30) NULL,
    [Company] [char](20) NULL,
    [Price] [int] NULL
)
cs

 

 

  자 테이블의 내용을 보면 주인은 DBO(DB Owner = pyuser)이고, 컬럼은 아이템번호(itemno), 종류(category), 과자이름(foodname), 제조사(company), price(가격이다), 모두 비어 있을 수 있는 null 을 지정했고, 아이템번호와, 가격은 int 로 지정했다. 나머지 값들은 20, 30개의 문자로 이루어진 문자열 이다(mssql 은 대소문자 안가린다). 그럼 위의 소스를 긁어서 아까 실행해 놓은 쿼리 창에 붙여 넣고 내용 전체를 선택 후 F5키를 누른다. 하단 결과 창에 명령이 완료되었다고 뜨며, 왼쪽에 우리가 만든 supermarket 테이블이 보이게 된다

 

 

  이후 우리가 만든 테이블을 한번 내용을 조회해 보자. 아래의 소스에서 첫번째 줄인 "select ~ (nolock)" 부분을 복사해서 쿼리 창에 붙여 넣는다. '--' 로 시작되는 줄들은 주석 표시로, 쿼리가 처음 인 분을 위한 설명을 위해 넣었다

1
2
3
select * from supermarket(nolock)
-- 슈퍼마켓 테이블(supermarket) 로부터(from) 모든걸(*) 가져와봐(select) 
-- 다른거랑 부딛치지 말구(nolock)
cs
 

 

  근데 아래와 같이 컬럼 이름만 표시되고 빈 내용만 있다.

 

 

  우리가 아직 테이블만 만들고 데이터는 넣지 않았으니 당연하다. 그럼 데이터를 넣는 방법을 찾아보기 위해서 구글에서 "mssql insert sample"로 검색한다. 아까와 똑같은 techonthenet 사이트의 내용을 참고한다.

  https://www.techonthenet.com/sql_server/insert.php

1
2
3
4
INSERT INTO 테이블
(컬럼1, 컬럼2, 컬럼3)
VALUES
(넣을값1, 넣을값2, 넣을값3);
cs

 

 

  해당 방식을 이용해서 supermarket 에 넣을 쿼리를 만들면 아래와 같다. 역시 아래 소스를 긁어서 쿼리 분석기에 넣고 선택 후 F5키를 누른다(이제 요 긁어서~F5 설명도 익숙해 지셨을 테니 슬슬 생략 하고 "쿼리를 실행한다" 라고 표현한다.) 아래와 같은 4개 메시지가 결과 창에 나오면 성공한 것이다(4개의 데이터 건이 각각 들어갔으므로, 4개 행이 영향을 받았다고 나온다)
  (1개 행이 영향을 받음)
  (1개 행이 영향을 받음)
  (1개 행이 영향을 받음)
  (1개 행이 영향을 받음)
 

1
2
3
4
5
6
7
8
9
10
11
12
insert into supermarket
values (1,'과자', '초코파이', '오리온', 3000)
-- 슈퍼마켓 테이블(supermarket)안에(into) 값들(1,'과자', '초코파이', '오리온')을 넣어줘(insert)
 
insert into supermarket
values (2, '음료수', '크라운 커피', '크라운', 1000)
 
insert into supermarket
values (3, '음료수', '오리온 식혜', '오리온', 1300)
 
insert into supermarket
values (4, '과자', '크라운 산도', '크라운', 500)
cs

 

 

  그럼 아래 쿼리를 다시 실행해 본다.

1
select * from supermarket(nolock)
cs

 

 

  이제 화면과 같이 결과가 잘 나오게 된다. 

 

 

  참고로 아래와 같은 쿼리들도 추가로 돌려서 sql select 문의 여러가지 면들을 느껴보자.

1
2
3
4
5
6
7
8
9
10
11
-- 과자만 보고 싶어(category = '과자')
select * from supermarket(nolock) where category = '과자'
 
-- 1000원 이하(price <= 1000) 상품만 보고 싶어
select * from supermarket(nolock) where price <= 1000
 
-- 결과 중에 상품이름과, 회사만 보고 싶어
select FoodName, Company from supermarket(nolock) 
 
-- 과자이름 가나다 순으로 보고 싶어
select * from supermarket(nolock) order by FoodName
cs

 

  그럼 테이블 생성 및 샘플 데이터 입력 파트가 끝나게 되었다

 

 

 

 

5) python 으로 조회해 보기

 

  여기까지 오기전까지 MSSQL 설치 및, 세팅, 테이블 생성과 데이터 입력 후 조회를 해봤다. 무척 번거롭고 긴 과정이라고 느꼈을 수도 있겠지만, 앞 시간에서 얘기했듯이 4교시 앞 부분의 모든 과정은 python 하고 직접적인 관계가 없다. 어찌보면 일반적인 프로그래밍 요소에 대한 설명을 한 서비스 챕터 개념이다. 반대로 얘기하면 여기서 얻은 mssql(그리고 겪어봄 알겠지만 많이 비슷한 SQL 표준을 따르는 oracle, mysql 같은 관계형 DB 들, 하둡베이스의 hive 등)에 대한 지식들은 다른 언어를 할때도 역시 적절히 응용해 사용할 수 있다. 아마 나중에 lua, java 같은 다른 언어를 할 때도, 지금 알게된 이 지식 때문에, SQL을 호출하는 부분이 좀 더 수월하게 느껴지게 될 것이다. 프로그래밍은 코딩 작업이 아니다. 자기가 아는 구체적인 지식들을 코드라는 수단을 이용해 표현하는 것일 뿐이다. 구현할 주제와 관련된 모든 것을 잘 파악하고 있다면 구현은 비교적 간단해 진다. 그래서 같은 회사안에서도 바쁜척 하면서 설렁설렁 살아가는 프로그래머들도 있다. 요즘 많이 얘기되는 폴리글랏 프로그래밍도 어떤 측면에서는 같은 맥락인 듯 싶다. 새로운 언어를 빨리 배우는 능력은 언어와 연결된 배경을 잘 아는데서 기인할 수도 있다.

 

 

  우선 python 에서 mssql 을 호출하려면 어떻게 해야되는지 알기위해 구글을 검색해 보자. 구글에 "python 3 mssql" 로 검색한다. 맨위에 아래의 링크가 나오게 된다.

  http://www.c-sharpcorner.com/blogs/connect-ms-sql-server-2012-with-python-35

 

 

  내용을 참고해 보면 c# 언어에 대한 가이드긴 하지만 pymssql 이라는 모듈을 사용하고 아래의 명령으로 설치하라고 한다. cmd 창으로 가서 아래 명령어를 복사해 사용한다.

1
pip install pymssql  
cs

 

c:\>pip install pymssql
Collecting pymssql
  Using cached pymssql-2.1.3-cp35-cp35m-win_amd64.whl
Installing collected packages: pymssql
Successfully installed pymssql-2.1.3

 

  정상적으로 설치가 되었다고 문구가 나온다. 그럼 이제는 프로그램 소스에 이용할 관련 샘플을 찾아보자. "pymssql python sample" 이라고 찾으면 제일 위에 공식 홈에서 나온 설명 페이지가 나온다.

  http://pymssql.org/en/latest/pymssql_examples.html

 

 

  해당 페이지의 코드 중에, Basic Features 부분에서 테이블 생성과, 인서트 부분을 제외하고 셀렉트 코드 기준으로 적당히 편집해 가져오면 아래와 같다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
import pymssql
conn = pymssql.connect(server, user, password, "tempdb")
cursor = conn.cursor()
 
cursor.execute('SELECT * FROM persons WHERE salesrep=%s''John Doe')
row = cursor.fetchone()
while row:
    print("ID=%d, Name=%s" % (row[0], row[1]))
    row = cursor.fetchone()
 
conn.close()
 
 
cs

 

 

  샘플 코드의 동작을 확인 하기 위해 일단 다른 코드를 더 추가하지 말고, 해당 코드 그대로 현재 환경과 맟추어서 값을 조정해 넣어본다. where 조건은 없으므로, cursor.execute 의 뒷부분은(Jone Doe) 빼도 될듯 하다. 지금 만든 환경에 맞추면 아래와 같다. 맨위의 uft-8 이 부분은 한글 주석을 위해서 에러가 안 나도록 추가했다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# -*- coding: utf-8 -*-
# 모듈 호출
import pymssql
# DB에 연결함
conn = pymssql.connect(server='localhost', user='pyuser', password='test1234', database='mytest')
# 커서를 만듬
cursor = conn.cursor()
# 커서에 쿼리를 얻어서 실행 시킴
cursor.execute('SELECT Itemno, Category, FoodName, Company, Price FROM supermarket(nolock);')
# 한 행을 가져옴
row = cursor.fetchone()
# 행이 존재할 때까지, 하나씩 행을 증가시키면서 1번째 컬럼을 숫자 2째번 컬럼을 문자로 출력함
while row:
    print("ID=%d, Name=%s" % (row[0], row[1]))
    row = cursor.fetchone()
#연결을 닫음
conn.close()
cs

 

    c:\python\code 디렉토리에 sql_sample.py 이름으로 저장후 실행 시키면 아래와 같은 결과가 나온다. (저장하고 실행하는 부분을 잘 모르겠으면 2교시 때 스크린샷과 함께 자세히 설명했었던 부분들을 다시 참고 한다)

c:\Python\code>python sql_sample.py
ID=1, Name=과자
ID=2, Name=음료수
ID=3, Name=음료수
ID=4, Name=과자

 

 

  그럼 c와 같이 % 로 타입을 지정해 출력하는게 조금 귀찮은 듯해서 소스에서 아래 print 부분만 조금 바꾸어 + 기호를 이용해 결합해 전체 컬럼을 스페이스로 구분된 문자열로 출력해 보자.

1
print (row[0+ " " + row[1+ " " + row[2+ " "  + row[3+ " " + row[4])
cs

 

  근데 실행을 해보니 아래와 같이 에러가 난다. 에러 내용을 보니 첫 번째 itemno 컬럼은 숫자인 int 이고 Category 컬럼은 문자열 이라서, 숫자와 문자열을 합치려고 한다고 에러가 난다.

c:\Python\code>python sql_sample.py
Traceback (most recent call last):
  File "sql_sample.py", line 14, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'

 

 

  아래와 같이 결과 컬럼을 str() 함수로 명시적으로 문자열 타입으로 변경하게 하면 에러가 나지 않는다. (구글에서 'python int to string' 이렇게 입력해 방법을 찾았다)

1
2
3
4
5
6
7
8
9
10
11
12
13
import pymssql
 
conn = pymssql.connect(server='localhost', user='pyuser', password='test1234', database='mytest')
 
cursor = conn.cursor()
cursor.execute('SELECT Itemno, Category, FoodName, Company, Price FROM supermarket(nolock);')
 
row = cursor.fetchone()
while row:
    print (str(row[0]) + " " + str(row[1]) + " " + str(row[2]) + " "  + str(row[3]) + " " + str(row[4]))
    row = cursor.fetchone()
 
conn.close()
cs

 

  다시 실행을 해보면 아래와 같이 최종 결과가 정상적으로 나온다.

 

 

  그럼 위의 코드를 나중에 전체 프로그램을 만들때 다시 사용하기 위해 킾해두고 파이썬에서 DB 호출을 해보는 4교시 시간을 마치려 한다. 다음 시간에는 2번째 요소인 암호화 모듈을 사용해 대상을 암복호화 하는 샘플을 만들어 보려한다. 여러 SQL 종류에 대해서 간단히 얘기하기로 했었는데 너무 글이 길어진 듯해서 6교시 퍼즐 조각들을 합쳐보기에서 언급 하려한다. (별로 깊이는 없으니 많은 기대는 하지 마시고...)

 

 

 

 

2017.2.19 by 자유로운설탕
cs

 

 

 

posted by 자유로운설탕
2017. 2. 13. 20:19 프로그래밍

 3 번째 시간이다. 이제 부터 전에 얘기했던 몇 개의 외부 환경을 사용하는 간단한 파이썬 프로그램들을 만들면서 구글을 통해 문제를 해결하는 예를 보이려고 한다. 이번 예제는 "DB에 암호화 할 평문 값 하나를 넣어놓고, 그 값을 불러와서 암호화 후 다시 복호화를 하고, 해당 값 들을 DB 로 다시 저장 후, 전체 값들을 가져와 화면에 표시"하려 한다. 이러한 부분을 나누어 해결하기(Divide and conquer) 방법을 사용하여 만들어 보자.

 

[목차]

0. 왜 파이썬 공부에 구글을 이용하는게 좋은가?

1. 언어를 바라보는 방법. 파이썬을 어떻게 바라봐야 할까?

2. 파이썬 설치와 환경, 버전 선택 하기의 이유.

3. 만들고자 하는 기능을 모르는 조각으로 나눠 조사해 보기

4. 데이터 베이스에서 내용 가져와 출력하기

5. 암호화 모듈을 이용해 암복호화 해보기

6. 퍼즐 조각들을 합쳐보기

7. 엑셀 파일 사용해 보기 -> 부록 : fuction 을 이용해서, 코드 정리해 보기

8. 정규표현식을 왜 사용해야 할까? 언어속의 미니 언어 정규표현식 살펴보기

9. 입력과 결과를 GUI 화면과 연결해 보기

10. Whois API 이용해 보기

11. 웹페이지 호출해 내용 파싱 하기(BeautifulSoup 그리고 한계)

12. 자동화 - 웹 자동화(with Selenium)

13. 자동화 - 윈도우즈 GUI 자동화(with pywinauto)

14. 자동화 - 작업 자동화

15. 수학 라이브러리 살펴보기

16. 그래픽 라이브러리 살펴보기

17. 머신러닝에서의 파이썬의 역활

18. 웹 프로그래밍 - Legacy Web

19. 웹 프로그래밍 - Flask 살펴보기(feat. d3.js)

20. 웹 프로그래밍 - Django 살펴보기

21. 정리 - 이런저런 이야기

 

 

 

  위에서 하려는 내용을 그림으로 표시하면 아래와 같다.

 

 

 

[문제 나누기]

  그럼 해당 문제를 풀려면 어떻게 해야 할까? 일단 자신이 모르는게 뭔지 정리해야 한다. 해당 문제를 구현하려면 아래와 같은 부분들이 필요하다.

1) 우선 SQL 에서 데이터를 불러오고 저장하는(정확하게 여기서는 업데이트 하는) 방법을 알아야 한다. (적절한 Database 를 설치해야 하고, 해당 Database 에 맞는 SQL 문을 만들어야 한다.)

2) AES256 방식을 사용해 불러온 값을 암, 복호화 해야 하다.

3) 최종으로 디비에 저장된 값 들을 가져와 cmd 화면에 출력해야 한다.

 

 

  일단 SQL 에서 데이터를 불러오고 저장하는 방법을 알아보자. 일반적으로 리눅스에서 돌아가는 MySQL 이 예제로 많이 사용되지만, 윈도우와 제일 친숙하고, 개인적으로 제일 익숙한 MSSQL 을 기준으로 구현을 하도록 하려한다. 나중에 해당 코드를 MySQL 과 Oracle 로 어떻게 변환 할수 있느냐에 대한 예제도 다루어 보려고 한다. MSSQL 은 유료 Database 가 아니냐고 얘기할 수도 있지만, MS 도 많이 개방 적이 되어서 소규모로는 기능제한이 거의 없는 express 버전을 제공한다(이 부분은 오라클도 마찬가지다). 그럼 MSSQL 연결을 지원하는 모듈을 찾기위해 구글에서 'python 3 mssql' 이라고 검색해 본다. 스택 오버플로우 글을 보면 pyodbc 와 pymssql 을 사용하라는 2개의 제안이 보인다.

http://stackoverflow.com/questions/17411362/connecting-python-3-3-to-microsoft-sql-server-2008

http://stackoverflow.com/questions/33326023/python-3-5-using-pymssql

 

  ODBC(Open DataBase Connectivity) 란 mssql, mysql, oracle 등 여러 db 에 대한 호출을, 각 databse 회사에서 윈도우에 지원하는 공통된 드라이버(뭐 API 가 정확한 표현이겠지만)을 통해서, 사용하는 개념이다. 비디오 카드 종류가 틀리더라도, 윈도우 드라이버가 잡히면 프로그램은 비디오 카드 종류만 세팅하면, 공통된 코드로 해당 비디오 카드들을 사용할 수 있는 것과 같은 개념이다. 전문 적인 설명은 아래의 링크를 참고한다.

http://dumaclub.tistory.com/entry/ODBC%EB%9E%80

 

 

  근데 ODBC 로 구현하게 되면, 아래와 같이 ODBC 세팅하는 방법도 소개해야 하고, 그럼 코드와 DB에 연결하는 계정 문자열이 분리되게 되어서, 설명하기가 더 어려워 지기 때문에, ODBC 방식이 아닌 직접 연결을 하는 라이브러리로 설명하려 한다. (사실 연결 방식은 ODBC 든 아니든 연결 계정이 노출된다는 면에서는 보안적으로는 바람직하진 못하다) 그래서 pymssql 모듈을 사용하기로 결정 한다. odbc 를 사용해 본적 없는 심심하신 분은 나중에 pyodbc 모듈을 이용해 구현해 보심 좋을듯 하다.

http://blog.danggun.net/1003

 

 

  2 번째로, aes256으로 암, 복호화 하기 위한 모듈을 찾아보자. 구글에서 'python 3 aes256' 로 찾으면 처음에 스택오버플로우 글이 나오고, 두번째로 우리나라 분이 정리한 문서가 하나 나온다.

http://blog.dokenzy.com/archives/1997

 

  읽어보니 파이썬 3.4에서 돌아간다고 하고, 스택오퍼플로우 글들을 참고해서 만든 코드를 테스트 하는 코드까지 추가되어 자세히 만들어져 있기 때문에 가져다 사용하기 적절해 보인다. 물론 실제로 필요한 프로그램을 만들때는 암호화 라이브러리 같은 경우, 샘플 코드가 인자 값들을 적절하게 세팅하여 사용했는지를 따져보고, 해당 라이브러리가 취약점이 없고 계속 유지보수 되고 있는 지를 따져봐야 할 거이다. 하지만 지금은 학습을 위해 프로그램을 만들고 있는 중이기 때문에, 특별한 문제는 없다고 가정하고 가져와 사용하기로 한다.

 

 

  3 번째는 가져온 내용을 프린트 하는 부분으로 문법 문제와 같지만 DB 에서 가져온 내용을 프린트 하는 부분이므로, DB 조회 샘플을 찾다보면 자연 스럽게 같이 해결 날것 같다.

 

 

 

[여담 - 문법 공부하기]

  여담이지만 개인적인 의견인데, 어떤 언어를 퀵하게 참조해서 사용해야 할때는(예전에 상용 자동화 솔루션을 사용하기 위해 공부 할 때 그랬었다), 메뉴얼이 어느정도 잘 정리되어 있다면 목차위주로 훝으면서 보게되면 언어가 지원하는 기능의 범위를 대충 알수 있게 된다. 예를 들어 파이썬 문법을 훝어 보기 위해서 구글에 'python 3 manual' 을 쳐서 나온 아래의 tutorial 을 한번 관심 있는 항목을 하나씩 예문 위주로 보는 것도 나쁘지 않다. 혹시 지금의 진행이 너무 구현위주로 빠져있어서 중요한 문법 요소들을 놓치는 기분이 들어 불안한 경우 아래 튜토리얼은 꼼꼼히, 나머지 레퍼런스는 대충 함 보셔도 괜찮을 듯하다. (절대 자세히 읽으라는 말은 아니고, 전체적인 흐름 파악 측면에서 보았음 한다.)

https://docs.python.org/3/tutorial/

https://docs.python.org/3/library/index.html

https://docs.python.org/3/reference/index.html

 

 

  그럼 여기서 글을 마무리 하고, 다음 시간에는 mssql 을 설치해서 계정, 테이블 등을 세팅 하고, pymssql 을 사용해서 DB를 조회하는 내용을 다루려고 한다. 그러면서 database 간의 차이에 대한 짧은 지식도 교양 차원에서 얘기하려 한다.

 

 

2017.2.13 by 자유로운설탕
cs

 

 

posted by 자유로운설탕
2017. 2. 8. 21:54 프로그래밍

  두번째 시간이다. 이번엔 파이썬 버전을 선택하는 문제에 대해서 얘기를 해보고 해당 파이썬 버전 및, 실습 환경을 선택한 이유에 대해서 설명 후, 실제 파이썬을 설치하고, 1교시에 나왔던 각 언어요소별 샘플 파일들을 실행해 결과를 보려한다.

 

목차

0. 왜 파이썬 공부에 구글을 이용하는게 좋은가?

1. 언어를 바라보는 방법. 파이썬을 어떻게 바라봐야 할까?

2. 파이썬 설치와 환경, 버전 선택 하기의 이유.

3. 만들고자 하는 기능을 모르는 조각으로 나눠 조사해 보기

4. 데이터 베이스에서 내용 가져와 출력하기

5. 암호화 모듈을 이용해 암복호화 해보기

6. 퍼즐 조각들을 합쳐보기

7. 엑셀 파일 사용해 보기 -> 부록 : fuction 을 이용해서, 코드 정리해 보기

8. 정규표현식을 왜 사용해야 할까? 언어속의 미니 언어 정규표현식 살펴보기

9. 입력과 결과를 GUI 화면과 연결해 보기

10. Whois API 이용해 보기

11. 웹페이지 호출해 내용 파싱 하기(BeautifulSoup 그리고 한계)

12. 자동화 - 웹 자동화(with Selenium)

13. 자동화 - 윈도우즈 GUI 자동화(with pywinauto)

14. 자동화 - 작업 자동화

15. 수학 라이브러리 살펴보기

16. 그래픽 라이브러리 살펴보기

17. 머신러닝에서의 파이썬의 역활

18. 웹 프로그래밍 - Legacy Web

19. 웹 프로그래밍 - Flask 살펴보기(feat. d3.js)

20. 웹 프로그래밍 - Django 살펴보기

21. 정리 - 이런저런 이야기

 

 

 

 

[들어가면서]

  우선 시작에 앞서 처음 프로그램 언어 공부하는게 왜 어려울까에 대한 얘기를 잠시하려 한다. 

 

  "A씨는 php 로 웹 프로그래밍 공부를 시작한다. 책에 나온 문법을 열심히 따라하는데 갑자기 html 이라는 조금 아는 언어가 끼어든다. 테이블을 출력하고, form 을 던지고 하더니, 조금 더 나아가니 db(database) 라는 녀석이 출현을 해서 php 에서 데이터를 저장하고 조회하고 한다. db를 잘 이용하려면 SQL 이라는 언어를 잘 알아야 한다고 한다. 뭔가 동적으로 움직이는 페이지를 만드려면 자바스크립트 라는 또 다르게 생긴 언어도 필요하단다. referer 얘기가 나오면서 http 헤더 얘기도 나오고, get, post 등등이 나오며 점점 내용이 복잡해 진다. html 과 비슷하게 생긴 xml 이라는 언어는 왜 또 책 뒷부분에 찜찜하게 스쳐가듯 언급되는지... 샘플을 그대로 보고 입력해서 실행하는데 에러는 계속 나고, 에러메시지는 이해가 잘 안가서 어떻게 해결하는지도 잘 모르겠다. php 는 참 어려운 언어같다. 남들은 웹프로그램이 제일 쉽다고 하던데 언어하나 배우는게 왜 이렇게 어려운가 싶다."

 

  위의 경험은 처음에 이런저런 언어를 공부한다고 책을 이것저것 잡히는 대로 볼때 마찬가지로 경험했던 현상이다. 첨엔 뭔가 잘 알것 같은 분위기 였는데, 진행하면 할수록 오리무중에 빠져버린다. 그런데 찬찬히 따져보면, 우리가 어려워 하는건 php 언어가 아니다. 언어는 한 측면에서 보면 껍데기에 불과할 수도 있다. php 를 배우면서 평생 처음 보는(또는 불완전하게 아는) db 에 쿼리를 던지는 것은, 말을 막 배우기 시작한 애들이 철학을 논하는 거랑 비슷한 상황이 된다. 중요한 것은 말을 배우는게 어려운게 아니라는 거다. 철학을 이해하지도 못하면서 그 말로 표현하려는게 문제지 말이다. (물론 말 배우는 건 어렵긴 하다;)

 

  프로그래밍 언어는 혼자서 움직이는게 아니라 미리 만들어졌거나 근간이 되는 여러 다른 언어와 시스템 들을 사용한다. 컴퓨터 화면(GUI), 디렉토리, 파일, database, http protocol, javascript, css, ajax, json, xml, 정규식, ftp, webserver, 메모리, 레지스터, 이미지 등등, 게다가 수학 및 물리학 같은 여러 도메인 지식을 포함한 그 밖의 많은 것과 함께 말이다. 그러다 보니 첨에 프로그래밍을 공부하다보면 언어의 본질적인 어려움이 아닌 언어가 접근하고자 하는 대상을 이해 못해 막힐수 밖에 없다. 그렇다고 문법만 공부하면 영원히 현실적인 주제들과 유리되어 버리고, 너무 현실적인 예제로 공부하게 되면, 기초 지식의 부족으로 쉽게 진도가 안나가고 지치게 되버린다. 아님 어찌어찌하게 따라가 마무리를 했더라도 조금 지나게 되면 뭘 했는지도 기억이 가물가물한 허무한 상태가 된다.(물론 형상화 되진 않았지만 작은 경험치가 쌓이긴 한다) 

 

  결과적으로는 적절한 문법 난이도와, 위에 언급한 한 두가지의 외부 접점을 연결시켜 공부하는게 바람직한 방법 같다고 생각한다. 그 배경하에서 왜 해당 언어의 각 문법 요소들이 굳이 언어에 존재해야만 하는지에 대한 필요성을 차근히 느낀다면 단지 외우는 프로그래밍이 아닌 인지하는 프로그래밍이 될 듯하다. 어떤 분야건 중요한건 스스로 마음속에 배우려는 대상에 대해 어떤 모델을 구축해 이해하느냐 이다. 어떤 측면에선 문법은 상세히 몰라도 괜찮다. 구글을 통해서 얼마든 문법은 찾아 이해해 적용하면 된다. 요는 문법 보다는 why? 이다. 책을 고를때도 그런 책을 잘 골라보는 게 좋다. 반대로 얘기하면 한 언어에 국한되더라도 저런 연결된 주제들을 적절한 깊이로 잘 이해한다면 다른 언어에 접근할 때 이미 아는 주제를 어떻게 이용하는가에만 집중할 수 있어 편하게 된다. 어차피 이용하는 방식은 고급언어로 갈수록 비슷해지니까 말이다. 마지막으로 막다른 길에 다달았을때 해당 부분에 대해서 힌트를 제공해 줄수 있는 사람이 있다면 더 좋을 건 없을 듯하다.

 

  사실 이 부분은 프로그래밍 뿐만 아니라 보안이나 테스팅 등 다른 분야를 공부할 때도 마찬가지인 부분 같다. 또 다른 예를 들자면 하둡 같은 빅데이터관련 시스템이나, 머신런닝을 배우고 싶어하는 분들이 리눅스의 기본적인 개념들에 대해서 모르고 있다면 아마 리눅스 서버에 프로그램 세팅하는 순간 부터 이해 안가는 개념들(사용자별 권한, ssh 설정, 환경변수, 모듈 설치, 서버간 동기화, 각종 디렉토리 파일 관련 명령어) 때문에 헤메느라 정작 실제 원했던 하둡 운영에 대해서는 쉽게 다가가지 못하게 될 가능성이 높을 것이다.

 

 

 

[파이썬 2.x vs 3.x 사이의 선택]

  파이썬 공부를 시작하면서 제일 먼저 고민한 부분은 버전 선택이다. 구글에서 "python download" 로 검색해서, 들어가는 파이썬 홈 페이지에서 제일 먼저 보는것이 2.x 대 버전과, 3.x 대 버전의 두개의 다운로드 링크 이다. 현재 기준으로 3.6과 2.7.13 버전이 나타난다.

https://www.python.org/downloads/

 

 밑에 박스 친 링크를 보면 어떤 버전을 선택할지 모르는 사람들을 위해서, 두 개의 버전을 비교한 링크가 있다. 앞으로 적은 부분에 대해 스스로 객관적인 판단을 하기위해 위의 링크의 비교 글을 한번은 살짝 읽어보길 바라며, "파이썬 2 3 선택" 으로 찾은 2개의 한글 페이지들을 소개해 본다.

https://b.ssut.me/python%ec%9d%98-%eb%af%b8%eb%9e%98-python-3%ec%9c%bc%eb%a1%9c-%eb%84%98%ec%96%b4%ea%b0%80%ea%b8%b0/

https://kldp.org/node/129183 

 

  우선 파이썬 2를 옹호하는 사람들은 현재 많은 회사에서 파이썬 2 기준으로 프로그램들이 개발되어 있어 실제 일을 할때 현실적인 버전이고, 외부 모듈들도 대부분 2 는 완벽히 지원하지만, 3 는 지원 안하거나 미지원 되는 모듈들이 많고(이 부분은 정확히 얘기하면 2를 지원하는 모듈들이 더 이상 3를 미지원 하는 문제일 것이다. 코드를 변경할 수고만 감당한다면 같은 기능을 가진 파이썬 3용 새로운 모듈들로 대체될수 있는 가능성도 있다고 본다), 성능 측면이나, 개발과 관련된 기술 문서를 웹에서 찾는데 불리하다는 얘기이다. 파이썬 3를 옹호하는 사람은 파이썬 2는 2020년에 지원이 만료된다는 예정이 있고, 2에서 구조적으로 개선된 여러 언어기능이 파이썬 3에는 있지만, 2는 앞으로 유지보수 정도 수준으로만 개선될 예정이기 때문에 3로 가는게 맞다는 것이다.(아마 파이썬 3의 모듈 호환 문제 같은 경우는 점점 개선될 거 같긴 하다)

 

  저도 원래 시작은 2.7로 시작했다. 근데 mssql db 에서 한글로 된 내용을 가져와 cmd 화면에 표현하려 했는데, 아래와 같이 한글 출력 부분에서 유니코드 변환 에러가 났다.

  구글링을 해서 아래 utf-8 관련 코드를 상단에 추가해서 위의 인코딩 에러는 안났는데, 이후엔 아래와 같이 한글이 깨져보인다.

# -*- coding: utf-8 -*-
import sys
reload(sys)

sys.setdefaultencoding('utf-8')

 

  또 구글링을 해보니 한글 윈도우 cmd 창의 디폴트 코드 페이지가 cp949 라서 그렇다고 해서 아래 명령어를 통해서 cmd 창의 코드 페이지를 utf-8로 변경해 봤다.

>> chcp 65001

 

  이후 다시 샘플을 실행해 보면 아래와 같이 정상적으로 나오긴 한다.

  이렇게 한바탕 헤메며 진을 빼고나서 보니 mssql 등 db와 연동 했을때 파이썬 2 버전의 한글 처리에 대해서 명확하게 구글에 정리된 자료는 없는 듯도 하다.(물론 잘 정리되어 있는데 유니코드 및 한글 인코딩 구조에 대해 까막눈이라서 못 찾았을 수도 있다--;) 그런데 이런 인코딩 오류 부분은 서양 언어가 아닌 동양 언어 국가의 비애인데, 대부분의 프로그래밍 언어나 라이브러리, 유틸리티들이 처음 시작 될때는, 한글, 한자 같이 2byte 언어를 고려한 유니코드 대응 설계를 하지 않는다는 것이다.  많이 유명해지고, 2byte 권 사용자들이 개발자에게 불만을 계속 토해내게 되야, 겨우 유니코드 반영이 되긴 하는데 이 시점이 보통 상당히 늦고, 그나마 불완전하게 땜빵 설계로 되는 경우도 종종 있는 듯 하다. 물론 데이터를 모두 영문으로만 쓰면 괜찮겠지만, 세상일이 어찌될지도 모르고 이렇게 한글이 나올때마다 처리에 신경 써야 되는 부분은 귀찮은 건 사실이다. 좀더 전문적인 파이썬 2.x 의 한글 처리에 대해서는 아래 글을 참고하자.

http://ifyourfriendishacker.tistory.com/5

 

  그래서, 3.x 대 버전을 설치 후 동일한 코드를 돌려봤는데(print 문법 차이 땜에 조금 바꾸긴 했다), 해피하게도 기본적으로 유니코드를 잘 지원해서 위에 언급된 유니코드 관련 코드들을 안 넣어도 한글이 정상적으로 cmd 창이나 엑셀 파일 등에 잘 출력된다. 그래서 주저 없이 파이썬 3를 사용해 학습하는 것을 선택하게 되었다.    

 

 

 

[산 넘어 산 - 학습을 위한 3.x 버전 선택]

  일단 3버전으로 하기로 한 후에도 다시 고민이 생기게 되었다. 최신 버전을 사용하느냐 약간 이전 버전으로 사용하느냐에 대한 문제 였다. 마이너 버전 끼리의 기능 차이는 별로 없을 가능성이 높은 상태에서 최신 버전의 가장 큰 문제는, 모듈 호환성 관련 문제 발생시 아무래도 구글에 참조할 만한 글들이 많지 않을 가능성이 높다. 또 모듈 설치시 편한 pip 명령어를 사용하려면 최신버전은 아무래도 모듈 호환성 업데이트가 안되있을 수 있어 좀 불리하다. 처음 시작하던 때에는 3.5.3 이 최신 이여서 이것저것 막히는 걸 해결하면서 왔는데, 현재는 3.6이 2016년 12월 중순에 나와있긴 했다. 그래도 최신으로 해야 되지 않을까 해서 몇 가지 모듈 테스트를 한 결과 3.5.3에서 잘 설치되는 모듈이 3.6에는 빌드에러가 나서 설치가 안되는 일이 발생했고, 구글에도 딱히 가이드 삼을 문서가 없어서 현 블로그에서 설명은 3.5.3 기준으로 진행하려 한다. 물론 2.x 과의 선택에서도 마찬가지 였지만, 지금 일어나는 호환성 문제는 세월이 지나면 모듈들이 업데이트 되면서 자연스럽게 해결 날 수도 있다.

 

 

 

[파이썬 3.5.3 설치]

  설치에 오기까지 잡담이 많이 길었지만 실제 선택하기 위해 고민한 과정을 보여주고 싶어 그런 것이라고 이해했으면 하고, 이제 버전도 정했으니 설치로 들어간다. 개인 환경은 윈도우즈 10 Home, 64비트 이다. 윈도우즈 7도 호환성은 거의 비슷한 것 같다.

 

  먼저 다운 로드를 받기 위해서 상단 다운로드 그림의 Python for windows 링크를 클릭 하거나, 구글에서 'python 3.5.3 download' 라고 쳐서 젤 처음인 아래 링크를 들어간다.

https://www.python.org/downloads/release/python-353/

  windows x86이 32비트 OS용이고, x86-64가 64비트 용이다. executable installer 가 우리가 보통 생각하는 exe 형태의 설치 파일이다. 저 같은 경우는 64비트이니 아래 파일을 다운 받았다.

Windows x86-64 executable installer

 

다운받은 다음에 실행해 보자

  'Add Python 3.5 to PATH' 를 체크하고, 설치 디렉토리를 정하기 위해서 'Customize installation' 을 클릭하자. path를 추가하는 이유는 어떤 경로에서든 python 명령어가 실행되게 하기 위해서 이다. 설치 디렉토리를 변경하는 이유는 cmd 창에서 다단계의 복잡한 디렉토리 경로로 찾아 들어가기 싫어서 이다^^; 혹 path 개념을 잘 모르신다면 아래의 링크를 참고하자.

http://dvjin.tistory.com/4

 

 

  두 번째 화면은 어차피 다 체크되 있으니 Next 를 그냥 누른다. 앞으로 우리가 자주 보게될 pip 를 설치하는 옵션이 있다.

 

 

  마지막으로 모든 사용자가 사용하도록 체크하고(어차피 혼자쓰는 컴퓨터일 테니), 경로를 c:\python 이라고 간단한게 바꿔주자(디렉토리가 없을테니 Browse 버튼 누르지 말고, 걍 텍스트 박스에서 수정하자). Install 버튼을 누르면 파이썬이 설치 완료될 것이다.

 

 

  그럼 실행을 해보기 전에, 메모장과 cmd창(도스창)에서 실행을 하라고 얘기하는게 왠지 구닥다리 방식 같아서, 구글로 'python ide' 라고 검색해 보니, visual studio 를 이용하는 방법, eclipse 를 이용하는 방법, 그리고 현재는 pycharm 이라는 툴이 많이 쓰이는 거 같다.(프리, 상용) 하지만 IDE 로 설명하게 되면 왠지 조금 더 복잡하게 될거 같기도 하고, 또 처음에는 IDE 를 사용 안하고 cmd 창에서 live 하게 실행해 보는 것도 구조 이해에 도움도 될거 같고(리눅스에서 실행하면 어차피 이런 모드기도 하다), 저도 현재는 텍스트 에디터에 cmd 화면을 이용해 사용하고 있는 형편이고 코드도 클래스니 구조화니 그런건 없어서 파일 하나면 되기 때문에, 예쁜 IDE 사용여부는 아래의 링크를 참고하고, 다른 블로그에도 많긴 하지만 나중 시간에 pycharm 이나 설치하고 사용하는 예를 들까 싶다. 

http://yaraba.tistory.com/173

http://cksl.tistory.com/31

http://noeticforce.com/best-python-ide-for-programmers-windows-and-mac

 

 

  그럼 윈도우즈 10에서 명령 프롬프트(관리자)를 실행 한다. (혹시 더 초보셔서 윈도우즈 10에서 명령 프롬프트 실행을 모르시면, 아래 링크를 참고 한다-좀 10이 이리저리 숨겨놓긴 한듯 하다;) http://slic.tistory.com/410 

  ※ 팁으로 만약 윈도우즈 10 UI 가 넘 화려해서 싫은 저 같은 분은 classic shell 이라는 프리웨어를 설치하시면 익숙한 7 스타일로 시작 메뉴 등을 사용할 수 있다. http://windwaker.net/2096

 

 cmd 창이 뜨면 python 이라고 친다. 아래 같은 특이한 프롬프트의 창이 뜨면 정상적으로 설치한 것이다.

ctrl+z 키를 누른 후 enter 키를 눌러서 원래의 도스창으로 돌아온다.

 

 

 

[샘플들 실행해 보기]

자 그럼 1교시 때 언급한 샘플 파일들을 하나씩 실행해 보자. 

먼저 변수 얘기할 때 만들었었던 친구들의 빵 갯수 더하기 코드를 보자

1
2
3
4
5
breadfriend = [23456]
 
breadfriend_sum = sum(breadfriend, 0.0)
 
print(breadfriend_sum);
cs

 

위의 내용을 복사하여 메모장에 붙여 넣어보자.  c:\python 폴더 밑에 코드들을 저장할 code 라는 디렉토리를 만들자. 메모장 내용을 저장 하면서 파일형식을 '모든 파일'(그래야 원하는 확장자로 저장된다), 이름을 breadcount.py 라고 만들어 놓은 code 라는 폴더에 저장한다. (첨 실행이라서 혹시나 해서 몰라서 아래 스크린샷을 추가한다. 담부터는 힘들어서 말로만 --;)

 

 

  이후 cmd 창에서 c:\python\code 창으로 이동한다. 이 부분도  첨이니까 기초부터 설명하고 스크린샷을 첨부한다. 

이동하는 방법은 처음 cmd 창이 뜨면 c:\windows\system32 폴더일 것이다. 여기서

1) cd / 후 enter(c:\ 로 가게된다)

2) cd python\code 후 enter 하게 되면 프롬프트가 c:\python\code 로 되어 있을 것이다.

(이 부분도 첨이자 마지막 스크린샷)

 

  자 첫코드가 실행되어서 다섯개의 빵의 합인 20이 나오게 되었다. 다시 한번 얘기하지만 지금 이 메모장과 도스창으로 하는 작업이 익숙하지 않다면, 프로그래밍 자체가 아닌 연결되어 있는 배경지식이 필요한 경우이다. 이 경우 가능한 바로 IDE 를 사용하지 말고 지금 하는 구식 방법을 조금 사용해 보는 것도 추천 한다. 헤메면서 얻은 지식은 잊혀지지 않기 때문이다.(단 코드가 복잡해지면 메모장은 한계가 있기 때문에 위의 링크에 추천한 IDE 나 문법을 칼라로 표시해 주는 선호하는 편집기를 쓰는게 낫다.)

 

 

  두번째 부터의 실행 코드 예제는 언어구조 개념에서 설명했던 예들의 코드들을 가져와 보자

 

  두번째 객체 예를 보이는 writefile.py 의 샘플은 아래와 같다.

 

1
2
= open('test.txt''w')
f.write("This is a test")
cs

 

  2줄인 엄청 간단한 코드로, 다른 언어를 하나라도 공부해 본 분들은 한번 쯤 파일 작업 할때 봤던 비슷한 코드 일 거다.(물론 옛날 언어에서는 조금 더 장황하게 써야했다). 코드를 설명하자면 test.txt 라는 이름을 가진 파일 객체를 write(w: 쓰기) 모드로 열어서, 그 안에 "This is a test" 라고 내용을 적는다. 저 open 이라는 명령이 파일 test.txt 라는 이름을 가진 파일 객체를 만든다는 모습을 보여주는 코드라고 생각해 6)번 샘플로 만들어 봤다.

 

  실행은 똑같이 메모장에 붙인 후 c:\python\code 테이블에 writefile.py 라고 저장 후, cmd 창의 해당 폴더에서 python writefile.py 입력 후 폴더안을 보면 "This is a test" 내용이 적힌 test.txt 파일이 생성되어 있을 거다.

 

 

  세번째는 함수 예를 보여주는 function_sample.py 이다.

1
2
3
4
5
6
7
8
def myfn(x):
    if x > 100:
        print("over 100")
    else:
        print("under 100")
        
myfn(120)
myfn(90)
cs

 

  자 파이썬 문법에 대해 공부한건 별로 없지만, 대충 보면 def myfn(x) : 부분으로 함수가 시작되고, 다른 언어에서 { ( 등으로 구분되던 부분은 아무래도 스페이스나 공백으로 구분 되는 듯 하다. 위의 예는 tab 으로 함수 안의 빈 공간을 채워놨다.

 

  예를 들어 밑에 처럼 앞의 if x > 100; 앞의 tab을 2개로 해서 else 와 tab 수를 다르게 한다면 아래와 같은 문법 에러가 난다. 번거로운 경계 문자들을 없앤 대신 만드는 사람이 로직에 맞게 들여쓰기(indentation)를 명확히 맞춰줘야 한다. 

 

1
2
3
4
5
6
7
8
def myfn(x):
        if x > 100:
        print("over 100")
    else:
        print("under 100")
        
myfn(120)
myfn(90)
cs

TabError: inconsistent use of tabs and spaces in indentation

 

위의 첫번째 정상 코드를 실행 하면, 정의한 함수 myfn 에 120 과 90의 값이 넘어가서, 각각 결과가 나오게 된다.  

C:\Python\code>python function_sample.py
over 100
under 100

 

 

  네번째 예는 클래스 내의 method 를 보여주는 upper_method.py 이다.

1
2
3
input = "This is a sample"
result = input.upper()
print(result)
cs

 

  고급언어로 갈수록 string 같이 단순한 문자열을 담는 기본 변수들도 클래스로 정의되어, 해당 변수에 담겨있는 데이터에 대해 클래스에 내장된 유용한 메쏘드를 사용할수 있게 한다. 위의 예에서 고전 언어 같은 경우는 upper 라는 따로 만든 함수에 input 문자열을 넘겨줬어야 했었을 테지만, 파이썬은 input 변수 자체가 upper 라는 메쏘드를 소유하고 있어 스스로 바로 변환을 한다.  

C:\Python\code>python upper_method.py
THIS IS A SAMPLE

 

 

  다섯번째 예는 내부 라이브러리(파이썬의 경우 모듈)을 사용하는 library_sample.py 예이다.

1
2
3
4
import statistics
 
data = [3746]
print (statistics.mean(data))
cs

 

  기본적으로 파이썬 기본 기능에서는 배열의 평균을 한번에 구할 수는 없다. 위에선 import 명령어를 이용하여 기본 통계(statistics) 모듈을 가져온 후, 통계 모듈안에 있는 mean 기능을 이용하여(statistics.mean(data)) 배열의 평균을 구해서 출력 한다. 실행 결과는 아래와 같다.

C:\Python\code>python library_sample.py
5

 

 

  마지막 예는 우리가 이제 것 cmd 창 화면으로만 사용했던 파이썬 기능을 우리가 쓰는 윈도우 창과 같은 GUI 화면에 표시해 주는 예이다. 실제 구현 예는 차후 보겠지만, 맛보기 샘플을 위해서 해야될 일도 적지는 않다. 우선 구글에서 어떤 gui 모듈을 사용할지를 판단해야 한다.

  구글에서 'python gui' 라고 검색을 하고 보다가, 아래의 글을 보게 되었다. 2015년도니 기간도 적당하고, 참고할만 한듯 하다.  

http://insights.dice.com/2014/11/26/5-top-python-guis-for-2015/

 

  이외에도 구글 상위순으로 이런 저런 글들을 보다 보면 제일 많이 나오는게 pyqt 와 wxpython 인거 같다. (너무 과거의 문서가 상위에 나오면 도구 옵션에서 날짜를 1년 정도로 제한하는 것도 좋다) 

 

  그럼 다시 구글에서 'wxpython vs pyqt' 라고 검색을 해보자. 나름 기술 적으로 활발한 토론이 이루어 지는 듯한 reddit.com(클리앙에서 아이폰 탈옥 관련할때 자주 언급되는 곳이다)의 2015년도 글을 하나 보자

https://www.reddit.com/r/learnpython/comments/3pif4k/tkinter_vs_pyqt_vs_wxpython/

 

  대충 보면 파이썬에서 기본제공하는 Tkinter 라는 기능은 배우긴 쉬운데 기능이 넘 단순하고 수동으로 해야되는 일이 많고, pyqt 는 제일 기능은 편하지만, 상업적으로 사용하기엔 라이센스 관계가 복잡하다고 한다(아니라는 댓글도 같이 달려 있다). wxpython 은 어중간 한 위치인가 보다. 일단 저는 어중간한 wxpython 을 선택하게 됬다. 어차피 gui 라이브러라는게 비슷비슷하기 때문에 하나를 감을 잡으면 다른 것들은 적당히 적응할 수 있을 것이라고 생각하고 말이다.(개인적으로 예전에 matlab이라는 언어에서 gui 라이브러리를 좋아해 이런저런 걸 만들었어서 조금은 더 익숙 할 것은 같다)

 

  그럼 python 에서 pip 를 이용해 wxpython 을 설치해 보도록 해보자. pip 는 윈도우의 프로그램 추가 삭제를 cmd 창으로 옮겨놓은 버전이라고 봐도 될듯하다. 리눅스의 apt-get, yum 같이 특정 프로그램을 해당 명령어를 이용해 설치하겠다고 정의하면 (아마) 의존성 까지 고려해서 한번에 설치하거나 삭제해 주는 프로그램 이다. 설치된 패키지는 python 폴더내의 tools 폴더안에 들어가게 된다.  https://ko.wikipedia.org/wiki/Pip

 

  일단 파이썬 3를 wxpython 이 지원할지 안할지 모르는 상태니, 구글에서 'python3 wxpython pip' 이라고 쳐보자. 그런데 첫번째 글을 읽어보니, wxpython 은 2.x 대만 지원하고 3.x 를 지원하기 위해서, wxpython Phoenix 이란거로 모듈이 분리되었다고 한다.

  http://stackoverflow.com/questions/28029760/wxpython-in-python-3-4-1

 

  스택오퍼플로어에 가이드 된데로 cmd 창에서 아래 명령어를 실행시킨다.

pip install -U --pre -f https://wxpython.org/Phoenix/snapshot-builds/ wxPython_Phoenix

 

 뭔가 한참 진행되더니 성공적으로 설치되었다고 뜬다. happy case 다.

Installing collected packages: six, wxPython-Phoenix
Successfully installed six-1.10.0 wxPython-Phoenix-3.0.3.dev2812+b3485d4

 

  그럼 이제 GUI 창을 맛보기로 띄워주는 wx_sample.py 내용을 보자

1
2
3
4
5
6
7
8
9
import wx
 
app = wx.App()
 
window = wx.Frame(None, title = "wxPython Frame", size = (300,200)) 
panel = wx.Panel(window) 
label = wx.StaticText(panel, label = "Hello World", pos = (100,50)) 
window.Show(True) 
app.MainLoop()
cs

 

  얘는 어쩔 수 없이 코드가 조금 길다. 간단히 설명하면 저 복잡한 구조는 우리가 매일 쓰는 윈도우 어플리케이션의 구조와 연관되어 있다. 설치한 wxPython 라이브러리를 가져오고(import wx )-> 어플리케이션 객체를 하나 만든다(ws.App)-> 어플리케이션 객체안에 작은 윈도우를 하나 만들고(wx.Frame)-> 윈도우 창에 넣을 판데기 공간(패널)을 하나 만든다(wx.Panel)->  패널안에 넣을 Hello World 텍스트를 하나 넣고(wx.StaticText)-> 윈도우를 우리한테 보여준다(window.show)-> 이후 이벤트를 수령해 사용자 동작에 반응한다(app.MainLoop).

<google: 'wxpython app mainloop' 참고>

 

  실행을 하면 아래와 같이 Hello World 가 가운데 있는 작은 윈도우 창을 보여준다.

C:\Python\code>python wx_sample.py

 

 

  이렇게 해서 또 생각보다 길어진 2교시가 끝났다. 다음 시간에는 만들어 보고자 하는 기능을 하나 정하고 어떻게 구글을 이용해 해당 기능을 나누어 조사하여 원하는 기능을 만들지에 대한 부분을 진행할 예정이다.

 

 

[추가]

파이썬 3.7의 경우는 pip install wxpython 으로 설치하면 됩니다^^

 

 

2017.2.12 by 자유로운설탕
cs

 

 

posted by 자유로운설탕
2017. 1. 30. 19:06 프로그래밍

  파이썬이라는 언어에 대해 공부해야지 하면서 차일 피일 미루던 중, 우연한 기회에 파이썬을 공부하고 싶어하는 지인에게 주기적으로 정리해서 알려주게 되었다. 해당 공부를 진행을 하면서, 정리한 내용들을 블로그에 올리려고 한다. 물론 인터넷에 잘 정리되 있는 좋은 강의는 많지만, 대부분이 이미 글 쓴 분의 잘 정리된 지식을 따라가는 것이기 때문에, 과거 경험에 따르면 시간이 지나면 유효하지 않아서 따라하기 힘든 경우도 있고, 강의를 따라하거나, 확장된 시도를 해보다가 이해되지 않는 에러를 만나서 '망연자실' 상태에서, 공부를 포기하는 경우도 많을 듯하다.

 

  프로그래밍 공부에서 꼭 필요한 건 막다른 상황을 만나 이곳 저곳을 헤메면서 문제를 해결하면서 배우는 시행착오 과정이라고 본다. 그 과정에서 겪게된 문제 해결을 위한 여러가지의 시행착오는 나중에 비슷한 문제를 만났을 때, 부드럽게 문제를 해결하게 해주는 내적인 패턴이 된다.

 

  그래서 많은 파이썬 관련 강의가 있겠지만, 체계적인 문법이나, 좋은 유지보수를 위한 구조같은 측면은 제외하고, 처음 시작부터 구글을 찾아 헤메며 시행 착오를 거치며 원하는 기능을 만들게 되는 과정을 보여주려고 한다. 스스로가 프로그래밍를 잘 한다고 하긴 힘든 실력이라고 생각하지만, 오히려 전문 프로그래머 보다는 필요에 의해 기능의 구현에만 포커스를 두고 언어들을 사용하는 입장이기 때문에 좀 더 초보자 입장에서 설명하기 쉽지 않을까 생각해 본다. 얘기를 해나가면서 가능한 해당 방식이나 코드를 선택하게된 연유를 설명하면서 진행하려 한다.

 

 

0. 왜 파이썬 공부에 구글을 이용하는게 좋은가?

1. 언어를 바라보는 방법. 파이썬을 어떻게 바라봐야 할까?

2. 파이썬 설치와 환경, 버전 선택 하기의 이유.

3. 만들고자 하는 기능을 모르는 조각으로 나눠 조사해 보기

4. 데이터 베이스에서 내용 가져와 출력하기

5. 암호화 모듈을 이용해 암복호화 해보기

6. 퍼즐 조각들을 합쳐보기

7. 엑셀 파일 사용해 보기 -> 부록 : fuction 을 이용해서, 코드 정리해 보기

8. 정규표현식을 왜 사용해야 할까? 언어속의 미니 언어 정규표현식 살펴보기

9. 입력과 결과를 GUI 화면과 연결해 보기

10. Whois API 이용해 보기

11. 웹페이지 호출해 내용 파싱 하기(BeautifulSoup 그리고 한계)

12. 자동화 - 웹 자동화(with Selenium)

13. 자동화 - 윈도우즈 GUI 자동화(with pywinauto)

14. 자동화 - 작업 자동화

15. 수학 라이브러리 살펴보기

16. 그래픽 라이브러리 살펴보기

17. 머신러닝에서의 파이썬의 역활

18. 웹 프로그래밍 - Legacy Web

19. 웹 프로그래밍 - Flask 살펴보기(feat. d3.js)

20. 웹 프로그래밍 - Django 살펴보기

21. 정리 - 이런저런 이야기

 

 

 

 

0. 왜 파이썬 공부에 구글을 이용하는게 좋은가?

 

  일단 구글에서 파이썬에 대해서 검색했을때, 한국 자료와 영문 자료의 비율을 한번 봐보도록 해보자.

1) http://www.google.co.kr/ 로 이동해서 검색어에 '파이썬' 이라고 치고 검색 버튼을 누른다.

--> 약 92만건 정도가 나온다.

 

2) 한국에서 누군가 영문으로 누군가 적을 수도 있다고 가정하고, python 으로 검색하고 오른쪽의 '도구'을 눌러서, 한국어 페이지만 선택해 본다.

--> 47만건 정도가 나온다. 두개를 합치면, 140만 건 정도가 나온다고 보면 된다.

 

3) 그럼 최종으로 영문 페이지에서 검색하게 되면 어떨까. 영문 페이지만 검색하는 방법은 아래 블로그에 있듯이 주소창에서, &lr=lang_en 인자를 추가해 검색하면 된다. (검색인자 조작은 여기선 주제와 별 상관 있는 부분이 아니니 궁금하면 아래 페이지를 보심 된다) 

http://channelofchaos.tistory.com/60

--> 1억 1천만건 정도가 나온다. (러프하게 보면 한글 페이지의 99배 정도이며 하나의 페이지에 파이썬, python 두 가지가 모두 있을 수도 있으니 1.2% 라고 해도 100배 정도라고 가정할 수 있을 듯 하다.) --> 아 근데 이러고 보니 python 이 비단뱀이라는 뜻도 가지고 있다. python program 이라고 찾으면 3천 1백만건 정도 나온다. python snake 는 1천 3백만건 된다. 비단뱀도 무시할 수 없으니 대충 비율대로 8천 만건 정도라고 하자 --;

 

  물론 페이지의 양이 컨텐츠의 질을 보장한다고 할순 없겠지만, 파이썬에 대해 한글로 정리된 페이지만을 찾아보는 것은 수많은 자료 중 약 1~5%만을 살펴보는 것이다. 또 대부분의 기술적 지식은 외국에서 시작되서 국내의 엔지니어 들이 한글로 풀어 소개하기 전까지는 어느정도 텀이 있는 부분도 고려해야 한다. 그래서 찾으려는 검색 결과가 제대로 안나온다면 반드시 적절한 영문으로 변환하여 검색하여 내용을 찾아봐야 한다. 그래서 프로그래밍을 하고 싶어하는 사람은 영어는 열심히 해서 원하는 내용은 훝어서 읽어 볼 수 있는 정도가 되는게 좋다. 그리고 요즘은 유튜브 같은 동영상으로 기술적인 부분을 안내하는 사람도 많기 때문에 듣기도 포함해서 기술적인 부분을 익힐 때 필요한 언어가 되는거 같다. 저도 듣는건 잘 못해서 매번 아쉽다.

 

  또 구글의 장점 중 하나는 사람들이 가장 많이 링크한 자료가 맨 첫 페이지에 나올 가능성이 높다는 거다. 그래서 적절한 검색어로 찾는다면 특히 파이썬 같이 유명한 프로그래밍 분야에서는 1, 2 페이지에서 원하는 힌트를 찾아낼 수 있다. 해당 부분은 추후 실제 예제를 진행 해가면서 느껴 보기로 하자.

 

 

 

1. 언어를 바라보는 방법. 파이썬을 어떻게 바라봐야 할까?

 

  프로그래밍 언어라는 것은 복잡하게 보면 한 없이 복잡하지만, 복잡하지 않게 보면 한없이 단순한 구조이기도 하다.

 

 

  위의 그림을 보자. (각 영역에 보면 사이사이에 확장자가 .py 라는 파이썬 샘플로 만든 파일이 표시되어 있는데, 해당 부분은 2교시 때 실제로 파이썬을 설치해 본다음에 하나씩 실제로 실행해 보도록 하는 시간을 가지려고 한다.)

 

  먼저 입력을 나타내는 1)번 영역을 보자 . GUI, DOS, FILE, Packet... 이 보인다. 프로그램에서 입력이라는 것은 다양한 형태로 이루어진다. 우리가 지금 블로그를 보고 있는 브라우저도 하나의 프로그램이고, 구글의 창에 'python' 이라는 검색어를 넣고, '검색' 버튼을 누른 것도 구글이라는 프로그램에 python 이라는 인자를(물론 다른 여러가지 인자들도 있겠지만) 전달한 것이다. 이렇게 입력이라는 것은 우리가 쓰는 윈도우즈 응용 프로그램 처럼 비주얼한 인터페이스를 제공할 수도 있고(GUI - Graphic User Interface), 도스 화면에서 수행하는 프로그램에 인자를 전달해 줄수도 있고, 새로운 워드 문서를 열듯 워드 문서 파일을 선택할 수도 있고, 카카오톡 같은 프로그램 들도 결국은 우리가 입력한 문장이나, 사진 등이, 통신 패킷에 들어가 프로그램 사이를 돌아다니는 입력으로 된다고 볼수도 있다.

 

 

  2)번 영역은 변수이다. 예를 들어 우리가 머리속에서 덧셈을 하는 과정을 생각해보자. 2+3 을 더한다고 하자. 물론 과정이 너무 빠르게 지나갈 수 있으므로, 우리가 좀더 덧셈을 못하는 다섯살 짜리 아이라고 상상해 보자. 먼저 2라는 글자가 머리에 떠오른다 + 기호가 생각나고 3 이라는 숫자가 생각난다. '두개를 더함 5네' 라고 생각 한다. 우리가 숫자를 생각한 순간에 뭐라고 설명할 순 없지만 머리속의 칠판에 2라는 숫자가 형상화 된다. 컴퓨터는 그런 형상화를 메모리(램, 하드디스크, 레지스터)라는 기억 공간안에 한다. 자 그럼 프로그램 언어에서도 2+3= 이라고 적을 수도 있다. 자 그런데 단순한 숫자의 연산보다는 친구가 빵을 2개 가지고 있고, 내가 3개 가지고 있는 부분을 프로그램에 표시하고 싶다. 어 근데 친구와 내 빵이란 것을 구분하고 싶은데 어떻게 해야 할까. bread_friend 를 친구가 가진빵이라고 하고, bread_me 를 내가 가진 빵이라고 표시하고 거기에다 수량을 넣는 방법이 있다. 그게 프로그램에서 얘기하는 변수라는 개념이다. 친구가 빵을 2개 가지고 있을땐 bread_friend 에 2를 넣음 되고, 3개 가지고 있으면, bread_friend 에 3개를 넣음 된다. 프로그램 언어로 형상화 하면 아래와 같다.

1
2
3
4
5
6
7
bread_friend = 2  (친구가 가진 빵 2개)
 
bread_me = 3  (내가 가진 빵 3개)
 
bread_we = bread_friend + bread_me (우리 빵 = 친구가 가진빵 + 내가 가진 빵)
 
화면에 출력 => bread_we 
cs

 

  약간 억지 상상이 끼었지만 별로 틀리진 않다. 프로그래밍 언어는 항상 사람의 생각을 자연스럽게 기술해 표현하고(다만 영문권에서 주로 만드니 영어 기준으로), 그 표현을 좀더 효율적인 구조로 나타내기 위해서 계속 노력하며 변하고 있기 때문이다. 자 그럼 3)번 데이터 영역도 자연스럽게 설명된다. 프로그램의 어느 공간안에 변수라는 개념을 형상화 시킨 방을 만들고, 그 안에  데이터(숫자, 글자 등등 우리가 프로그램에 넣어 이용하고 싶어하는 값들..)를 넣게 된다. 그리고 그 값들을 '+' 같은 도구 장치(사실 + 기호는 '연산자'라고 공식적인 용어로 얘기하긴 한다) 들을 이용하여, 이리저리 굴려 가공한다.

 

 

  4) 자료구조는 이렇게 생각해 보자, 단순하게 하나의 값을 넣는 변수들을 이리저리 정교하게 조합하다 보면 꽤 귀찮은 상황도 생길수 있다. 예를 들어 아래의 더하기 상황에서 친구가 10명이라고 가정하자. 그럼 변수를 bread_friend1, bread_friend2,... bread_friend10로 10개를 만들어야 할까? 좀더 편하게 많은 친구들을 표시할수 있는 방법이 있음 어떨까? '배열(array)이라는 자료구조가 그런걸 해결하기 위해 옛날에 만들어 졌다(정확하게 여기에서는 리스트-list 이다). bread_friend 라는 공통 인자를 가지고 그 뒤에 (괄호로 쌓여진)숫자로 구분할 수 있게 되었다.

1
2
3
4
bread_friend[1= 2
bread_friend[2= 3
...
bread_friend[10= 4
cs

 

  근데  이것도 10줄이 되어 귀찮으니 조금 더 간단한게 값을 넣을 수 있을까?

1
bread_friend = [23, ....., 4
cs

  위와 같이 하면 알아서 프로그램이 bread_friend[1], bread_friend[2], ... 순으로 알아서 넣어주기도 한다.

 

  그럼 조금 더 나아가 리스트를 더 할때도 bread_friend1 + bread_friend2 +... 하지말고,

'빵 값을 더해라 (친구 빵 리스트)' 이런 식으로 명령을 보낼 수도 있을까? ㅇㅇ 당연히 가능하다. 아래 그러한 예제를 설명한 글에서 실제 구현 예를 참조하자.

http://mwultong.blogspot.com/2007/02/python-list-array-sum-average-mean.html

 

  자 그럼 여짓것 설명한 내용을 총괄해서 5명의 친구의 빵을 더해 화면에 출력하는 프로그램은 아래와 같다. (2교시 때 파이썬 설치하고 실행하는 법을 알게 되면, 예제 내용을 bread.py 파일로 만들어 실행해 5개의 값을 더한 결과인 20이 출력되는 것을 보려한다)

1
2
3
4
5
breadfriend = [23456]
 
breadfriend_sum = sum(breadfriend, 0.0)
 
print(breadfriend_sum);
cs

 

  어 근데 가운데 줄의 코드가 왠지 받아들이기 어색하다. 굳이 sum 이라는 기능안에 넣는 식으로 하지 말고, breadfriend.sum() 이렇게 하면 계산해 주면 좀 더 직관적이지 않을까? 라고 생각이 든다. 구글을 찾아보니, 파이썬 자체는 그런 문법 방식을 지원하지 않는거 같지만, 나중에 아마 머신러닝쪽 얘기할때 살짝 언급하게될 numpy 라는 수학 모듈(모듈은 나중에 10번 영역 에서 설명한다)을 사용하면 그렇게  호출할 수도 있는거 같다. 밑의 블로그를 참고하자~

http://yceffort.com/archives/298

 

  자 그럼 단순한 변수에서 자료구조가 필요한 이유를 대충은 정당화 한 것 같으니, 아래 링크의 글을 한번 훝어 읽으라고 소개하는 것으로 자료구조 파트 설명은 마친다. 파이썬의 자료구조는 어떤 것이 있는지만 알고 필요할때 가져다 써야 머리가 덜 아플듯 하다. (단 문법은 대충 넘어가도 어떤 경우 사용하는게 좋은지에 대한 개념은 확실히 짚는게 구조적인 기억력에 도움이 된다,)

http://felixblog.tistory.com/54

 

 

  5) 프로그래밍 언어책을 보다보면 뭔가 약간 확 와닿지 않는 복잡함을 주는 요소들이 있다.  클래스, 인터페이스, 델리게이트(위임)... 이런걸 막 섞어서 효율적인 구조라고 소개하는 디자인 패턴이라고 하는 주제를 설명하는 책도 있고 말이다. 그 중의 가장 주범인 5) 클래스 - 객체 지향 언어라는 말을 만들어 내게 된 가장 중심적인 개념이다. 유투브의 디자인 패턴 설명하던 분은 설계도라고 설명 했는데, 약간 설계도보단 좀더 덜 적합한거 같지만, DNA 구조 라고 보면 어떨까 싶다. 사람이나 생물들이 해당 모양으로 성장하는데에 대한 정보는 DNA 구조에 담겨있고, 그 정보들이 구현되고 나면 사람(뭐 프로그램에서 말하는 인스턴스나, 객체)이 된다고 봐도 될듯하다. RPG 게임을 하면서 마법사를 선택한 순간, 내가 선택한 "설탕" 캐릭은 마법사 클래스의 DNA를 물려받아, 체력이 약하고, 마나 재생속도는 빵빵하고, 스킬 트리는 전격 스킬 쪽을 밟게되는 특성을 지닌 객체(캐릭터)로 만들어 지는 거라고 생각해보자. 이런 부분을 상상하게 되면 6)번 객체(Object) 까지 슬쩍 끼워 설명하게 된 듯하고, 유투브에서 아래의 강의나 '클래스 객체 인스턴스' 라고 검색해서 열심히 설명해 놓은 동영상 강의들을 보자. 고백하지만 명확히 잘 모르기도 하고 요 부분은 이번 강의에서는 곁가지 요소들이다. 

https://www.youtube.com/watch?v=8B2Wxks5Sig

 

  9)번 메쏘드는 마법사로 얘기하면 버프를 걸거나, 파이어볼 스킬을 쏘거나 하는 액션이 구현된 부분이고, 나중에 설명한 7) 함수(function) 가 객체 내부에 구현된 버전이라고 봐도 될듯 하다. 이 부분은 별로 자신없는 부분이니 언젠가 객체 지향과 패턴 개념에 대해 쉽게 정리해 전달 할수 있는 수준이 되길 기대하며 요 정도로 얼버무리려 한다.

 

 

  7) 번은 함수(fuction) 또는 서브루틴(sub-routine)이라고 하는 부분이다(언어마다 표현하는 말이 좀 다르다) 한글로 해석하면 각각 '기능', '루틴의 밑(또는 부수적으로)에 있는 로직' 이정도 이다. '루틴'이라는 것은 route 에서 나온 말로  '특정한 길을 따라 가는 행위' 같은 것이라고 볼수 있을 거다. 이 두 가지의 용어가 비슷한 개념을 설명하기 위해서 만들어 낸 말이라는 것을 이해해보자. (뭐 서브루틴은 인자가 없고, 함수는 인자가 있다고 구분 될 수도 있지만 그것은 무시하자). 함수를 얘기할때 붙어다니는 용어들은 '재사용', '중복코드 제거' 라는 말이다. 

 

  아까 여러명의 친구를 간단히 표시하기 위해 배열을 사용했 듯이, 코드 중에 자꾸 반복되어 나오는 부분을 묶어서 다른 구역 에다 격리해 옮겨놓고, 메인 코드에서 반복하여 호출해서 사용하는 개념이다. 회사로 얘기하면 각 팀에 복사기를 하나씩 놓았던 회사가 하나의 복사기만 OA 공간에 놓고 사람들이 같이 사용하게 하는 것도 일종의 함수개념 일 수 있다. 게임회사에서 개발자 풀을 만들어 놓고 각 게임별 그룹이 그때 그때 요청해서 원하는 리소스를 얻을 수 있게 하는 것도 개발자 풀이라는 함수를 재사용 하는 거라고 볼수 있다. 복사기 문제로 돌아가서 그렇게 되면 각 팀별 복사기 수십개를 신경 쓰지 않아도 되고, 최신형 복사기로 변경하고 싶을 때에도 공용인 1개의 복사기만 변경시키면 되기 때문에 유지보수가 쉬워진다. 대신 많이 써서 고장이 자주 나지 않겠냐고 할수도 있겠지만, 그건 현실의 사물 얘기고 코드상의 로직은 일반적으로 많이 호출해 쓴다고 고장이 나진 않을테니 괜찮다. 그래서 이런 공용 기능인 함수는 요청하는 쪽에서 요청을 하면서 (복사하길 원하는 자료 등)원하는 부분들을 얘기해야 하고(요것이 함수의 입력 인자이다), 자료가 복사되면 나온 결과물을 찾아가야 한다. 물론 복합기에서 팩스 보내기 같은걸 하는 경우는 실제 찾아갈 결과물은 없을 수 있다. 요게 함수의 리턴값으로 마찬가지로 값이 있을 수도 없을 수도 있다).

 

 

  8) 제어 로직은 변수나 자료구조, 함수등에 모두 적용할 수 있는 요소다. 영어의 단어 뜻과 사용법이 거의 일치 한다.

for (리스트의 첫번째~마지막 까지 인자를 찾는 동안),

while(리스트의 마지막 인자가 될때 까지),

case(리스트의 인자가 내가 지정한 조건들에 맞을 경우),

if(리스트의 세번째 인자가 10일 경우)와 같이 적용되거나,

또는 함수에 적용되어 if(함수의 리턴값이 1일 경우) 같이 원하는 조건을 넣는 것이라고 보면 될 듯 하다.

 

 

  10) 라이브러리, 모듈은 남이 미리 만들어 놓은 기능을 사용하는 것이라고 본다. 일반적인 사람들이 만드는 프로그래밍 이라는 것은 어찌보면 결국은 남이 만들어 놓은 기능 등을 추상적으로 꾸미는 일이라고 볼수도 있을 것 같다. 파이썬에도 GUI, 엑셀, web, 통계, 머신러닝, 이미지. text 처리 등등 세계의 수많은 프로그래머 들이 만들어 놓은 모듈이 있다.

 

  예를 들어 엑셀을 다루는 기능을 만든다고 하자. 만약 우리가 엑셀 파일의 구조까지 분석하여, 하나하나 다 약속된 구조대로 값을 불러오거나 저장하는 로직을 만든다고 하면 아마 시간도 오래 걸리겠지만, 엑셀 구조를 분석할 능력이 없어 구현 자체를 못할 수도 있다. 그런데 공개된 엑셀 모듈을 사용하면 아래와 같이 간단하게 엑셀파일을 만들수 있다.

1
2
3
4
5
6
7
엑셀 모듈을 가져온다.
 
엑셀 모듈안에 있는 클래스를 이용해서 엑셀 객체를 하나 만든다.  
 
엑셀 객체 안에 시트를 만들고, A1 열에 'hello' 라고 넣는다.
 
메모리의 엑셀 객체를 test.xls 라는 문서로 디스크에 저장한다.
cs

(해당 코드의 대한 시연은 7교시때 진행 예정이다.)

 

  근데 왜 굳이 라이브러리나 모듈을 굳이 프로그램에 import(가져오기) 시켜야 할까? 모든 기능을 다 한꺼번에 가져오면 프로그래밍 편집 및 실행 환경이 아주 무거워 지기 때문에, 필요한 순간에만 명시적으로 포함 시켜 만들면 선택한 라이브러리들만 내가 만든 프로그램과 같이 메모리로 올라가 실행되어 효율적으로 메모리 공간들을 사용할 수 있기 때문이다(뭔가 다른 숨은 설계적 이유도 많을 듯해서 별로 설명에 자신은 없긴하다^^).

 

  여튼 특히 파이썬 같은 사람들이 많이 사용하는 프로그램 언어를 사용할때 필요한 기능이 있다면, 구글을 잘 찾아보자. 사람들이 많이 사용하는 기능이라면, 이미 모듈로 존재하고 있을 것이다.(게다가 소스까지 공개해서 무료로...) 물론 해당 모듈을 그대로 사용하거나, 소스를 수정해서 좀더 좋게 개선해 사용하거나, 내 프로그램에는 적합하지 않아 새로 만들어 사용하는 것은 개발하는 사람 맘이긴 하지만, 일반적으로 유지보수가 계속 되고, 검증된 모듈이 있다면 그 것을 사용하는 것이 현명한 듯 싶다.

 

  요즘은 프로그래밍 환경도 SNS 처럼 연결 지향적인 환경이 되어가고 있는 듯하다. 좋은 연결고리를 많이 찾는 센스를 가진 사람이 쉽게 문제의 해결방법을 찾을 수 있는 것 같다. 또 다른 측면으로 얘기하면 결국 자신의 똑똑해 보이는 결과물들의 많은 부분이 수많은 사람들이 만든 기존 코드들의 도움으로 지지된 다는 것을 인지함으로서, 거인의 어깨위에 편하게 서 있는 자신을 느끼게 되어, 스스로에 대해 겸손해지고, 현재의 자신에 멈추지 않고 계속 노력할 수 있게 될 것 같다.

http://legacy.www.hani.co.kr/section-009100003/2004/11/009100003200411261636092.html

 

 

  11) 출력. 출력은 입력과 같은 형태의 윈도우 프로그램 화면, 도스화면, 파일, 이미지, 패킷등으로 자유롭게 표현될 수 있다. 이는 이러한 출력이 다른 프로그램의 입력이 될수도 있다는 것을 의미하기도 한다. 리눅스의 명령어 들이 파이프로 연결되어 출력을 다른 명령어의 입력으로 전해 주듯, 요즘의 많은 프로그램들은 자신의 출력을 다른 프로그램에서 사용하는 것을 염두해 두고 만들어 지는 것 같기도 하다.

 

  마지막으로 아주 초보 분은 할수 없지만 어느정도 코드에 익숙한 사람들도 다른 사람이 만든 소스들을 보다보면 이해가 안되게 복잡한 코드를 만나서 자신의 지적 능력에 좌절을 가질 수도 있을듯 싶다. 그런데 개인적으로 생각하기에 어려워 보이는 코드를 만나는 것은(물론 내부에 담겨 있는 도메인 지식이 부족한 경우나, 패턴을 이해못해 그런건 예외지만) 그 코드를 만든 사람이 문제를 명확히 이해하지 못하거나 타인을 생각하는 객관적인 코딩을 하지 못한 결과물이라고 생각한다.. 해답을 찾아 구글을 돌아다니다가 이해 못할 어려운 코드와 설명을 만나면 자격지심을 가지지 말고 살포시 무시하는 것도 정신건강에 좋다. 

 

  그럼 파이썬이라는 언어를 어떻게 바라보는냐 하는 부분에 대한 설명을 마치고, 다음 시간에는 강의를 위해 파이썬의 특정 버전과 sql 등을 선택하게된 사유를 설명하고, 실제 파이썬을 설치하고 위의 각 언어 구조들의 샘플 파일들을 실제 시연 하는 시간을 가지려고 한다.

 

 

 

2017.2.5 by 자유로운설탕
cs

 

 

 

 

 

posted by 자유로운설탕
2017. 1. 14. 22:58 일본어와 중국어

 

  두 개의 언어를 깊게 안다고 하진 못 하지만, 취미로 어느 시간정도 공부한 결과 조금쯤은 두 언어의 느낌에 대해 얘기하여도 될 거 같아 조심히 글을 올리려고 한다. 여기서 얘기 하는 우리나라 한자와의 비교는 두 언어의 한자에 대한 개인적인 느낌을 바탕으로 유추한 부분이기 때문에 틀려도 적당히 글쓴 사람의 상상력으로 받아 들여주면 좋겠다.

 

 

  먼저 일반적으로 사람들이 두 언어에 대해서 많이 하는 말은 상반된 충돌이 있다. 한쪽은 일본어는 한국어와 어순과 발음이 비슷해 익히기 쉽고, 중국어는 어순, 발음, 성조 등이 상이해 익히기 어렵다고 얘기하는듯 하다. 또 반대 의견으로는 일본어는 첨엔 쉽지만 고급으로 갈수록(고급의 의미에 대해서는 사람마다 틀리겠지만...) 어렵고, 중국어는 첨에는 어렵지만 배워보면 언어구조가 단순해서 나중엔 쉬워진다고 얘기한다. 두 언어를 다 배운 사람들 사이에도 의견 충돌이 생기니 어느 쪽이 맞는지 아리송 해지기도 한다.

  

  아래와 같이 인터넷에 여러 관점의 논쟁이 있다. (google: '일본어 중국어 배우기 난이도' 검색)

  http://mlbpark.donga.com/mlbpark/b.php?&b=bullpen&id=2247840

 

  개인적인 생각으로는 현재 사람들이 많이 사용하는 어느 언어든 결국 사람의 생각을 가능한 완전하게 표현하기 위해 만들어 졌기 때문에, 비슷한 표현 범위를 지니고 있다고 생각한다. 만약 어휘 등이 그러한 범위를 커버 못할 경우는 외래어 같은 수단을 이용해 간격을 채워주는거 같다. 그래서 결국 자연스러운 표현 상태까지의 난이도는 비슷비슷 해지는게 아닌가 싶다.

 

  어떤 언어는 미묘한 뉘양스를 섬세한 표현 등에 담고, 어떤 언어는 단어나 구조에 함축적인 의미에 담기 때문에 일본어의 경우 깊게 들어 갈수록 여러 섬세한 표현을 위한 어휘를 익히기 힘들고, 중국어는 문장 구조와, 조사등의 한자에 숨어있는 미묘한 뉘양스를 이해하기 힘든게 아닌가 싶다. 결국 점점 어떤 언어에 대해서 많은 부분을 알고 싶을 수록, 그 언어를 쓰는 사람들의 경험의 깊이 만큼 다양한 측면에서 해당 언어를 경험해야 하는데, 그 부분이 쉬운 일도 아니니 결국 난이도는 비슷하지 않을까 싶다. 뭐 그리고 같은 나라 사람끼리도 같은 언어로 스타일이나 깊이가 다르게 표현하는데 난이도 라는게 굳이 의미있을 까도 싶다.

 

 

  원래 하려던 한자 얘기로 가서, 처음에 공부를 시작하게 되면 일본 한자는 모양이나 발음이 한국어랑 비슷하게 느껴지는데, 중국 한자는 모양만 같지(물론 홍콩, 대만어가 아닌 우리가 배우는 북경어는 간체라서 첨엔 많이 틀려 보이긴 하지만) 발음과 성조는 아주 동떨어진 듯한 느낌이 든다.

 

  그래서 일본어의 한자는 어느 정도 공부하게 되면 기존에 한자를 좀 안다는 가정에서 모르는 발음을 대충 유추할 수 있게 되는 반면, 중국 한자는 새로운 한자, 간체 모양, 성조 외우기 등(거기다 한자의 양도..)에 신경을 온통 빼았겨서 완전히 상이한 규칙의 발음을 가진 한자로 생각하는 면이 있는 듯 하다. 하지만 중국 한자 또한 일본 한자와 마찬 가지로 기존 한자만 안다면 발음이 우리나라와도 일관적으로 유사한 듯도 싶다. (물론 불행하게도 성조는 추측 가능한 부분이 아니라서 헷깔리긴 마찬가지지만...)

 

 

  상상을 해보면 옛날 중국의 어떤 시대에서 부터 한자는 조금씩 우리나라로 넘어왔을 것이고, 아마 우리나라나 중국을 통해 일본이라는 나라로 넘어갔을 것 같다. 일본에는 한자가 넘어가기도 전에 우리나라 말도 같이 넘어갔을 수도 있고 말이다. 유사함으로 유추해 보면 아마 넘어간 한자도 어느정도 우리나라에 영향을 받은 한자였을 것도 같다.

 

  우리나라의 옛날 문자를 보면 지금 글자와 모양이나 쓰임이 많이 바뀌었듯이, 중국에서 넘어오게 된 한자는 우리의 고유어와 어울리게 되면서 다양한 변화를 가져왔을 테고, 일본 또한 일본 자체의 고유어들과 섞이면서 나름의 특성을 가지게 됬을 것이다. 중국 또한 세월의 흐름에 따라서 언어의 운명이 그렇듯 한자들의 뉘앙스나 발음에 여러 변경을 가지게 됬을 거라고 생각한다.

 

  그래서 그런 여러가지 각 국의 변화의 영향을 받아 세 나라의 한자는 지금같이 비슷하지만 뭔가 이질적인 그런 특성을 지니게 되지 않았을까 싶다.

 

 

 

 

[일본 한자의 특징]

 

  먼저 일본의 한자의 특징은 우리나라 한자 처럼 뜻이 중의적인 부분이 거의 없고, 공식적이거나 무거운(관념적) 의미들을 주로 한자 단어로 사용하며, 음독(한자어)과 훈독(고유어)이 공존하며, 가끔 중국이나 우리나라에 없는 고유의 한자가 있다는 것이다. 또 한자에 국한된 얘기는 아니지만, 가독성을 돕기 위해 문장안에 일부러 한자를 사용하며, 우리나라와 어순이 비슷한 편이다. 외국어나 강조어를 가타카나라는 히라가나와 같은 발음, 문자 범위를 가지지만 모양이 다른 글자 셋으로 표기하는게 조금 특이하긴 하다.

 

 

1) 공식적이거나 무거운 의미, 음독과 훈독의 공존

 

  우리나라의 단어인 '언어' 라는 단어도 고유어인 '말'라는 의미로 대체 할수 있을 것이다. 물론 '언어'가 가진 의미는 '말' 이라는 의미보다 좀 더 무겁고 추상적인 느낌이 든다. 일본어도 언어라는 의미를 言語(げん ご - 겐 고)라는 한자어로 표현한다. 하지만 동시에 비슷한 말 또는 언어라는 의미로 言葉(ごと ば - 고토 바)라는 고유어로도 표현한다. 또 '말', '이야기' 라는 의미로 話(はなし - 하나시) 라고도 쓰고도 읽는다.

 

  위 부분이 우리나라 한자와 좀 달라서 힘들게 생각하게 되는 부분 같다. 우리나라의 한자는 딱히 고유말을 대체하지 않는다. 고유말은 분명한 한글로 표시하고, 한자는 한자 또는 한글로 표시할 수 있고, 한자의 발음이 바뀌거나 하지 않는다.

 

  우리나라의 '솔직(率直)'하다는 의미의 일본 한자 '素直' 같은 경우 아예 음독과 훈독이 섞여 있다 (す なお - 스(음독), 나오(훈독)). 솔직히 언어는 사람들의 경험의 결정체 같은 측면이 있으므로 완전히 이가 맞는 규칙은 없는 듯하다. 배우는 사람이 예외적인 부분은 적응해야 하는듯 싶다. (그러고 보니 위의 言葉도 음독과 훈독이 섞인 단어 같다)

 

참고) 率直 우리나라는 거느릴 솔로 '바름을 거느리다'의 의미 같고, 일본은 素直 본디 소로 '본디 바르다'의 의미로 의미상으로는 비슷하다고 본다. 요런게 미묘한 차이다.

 

  글을 정리하다 보니 훈민정음 이전엔 한글 표기를 어찌했을까가 궁금해서 구글을 찾아봤다. 한자를 가차해 표기했다는데 아래를 참조함 될 것 같다. 참고로 아이러니 하게도 중국어는 영어를 가차해 발음을 표기한다...

 

  훈민정음 창제 이전의 문자 생활

  http://www.typographyseoul.com/news/detail/502 

  한국 한자음에 대한 위키

  https://namu.wiki/w/%ED%95%9C%EA%B5%AD%20%ED%95%9C%EC%9E%90%EC%9D%8C

 

 

 

2) 일본 고유의 한자

 

  가끔 일본어 공부하다보면 온라인 한자 사전에서 못찾는 한자가 있었는데, 막상 예를 들려니 잘 보이지 않는다. 구글을 검색하니 일본에서만 쓰는 한자라는 위키가 나온다. 다음 한자 사전에는 안 나오는거 보니 맞는거 같은데, 네이버 한자 사전에는 나오긴 한다(요즘 네이버 사전쪽은 일본 한자를 업데이트 한듯 하다). 여튼 아래의 위키나 문의글 예를 참조해 보면 될것 같고, 대표적으로 일하다의 의미인 働く(はたらく - 하타라쿠) 같은 한자가 있다. 아래 위키를 보면 우리나라는 사람 인(人) 자가 빠진 글자, 勤(부지런할 근 - 근무 등에서 쓰인다)자를 쓴다고 한다. 근데 어째든 저 고유 한자를 가진 단어들은 은근 좀 어려운 단어들이 많으며, 위키에서도 얘기했듯이, 아예 표기도 읽기도 히라가나로만 하는 경우가 많은 듯하다. 그리 많지는 않은듯 해서 그런 한자를 만나면 그러려니 하면서 접근하면 될 듯 하다. 

 

  일본 고유한자

  https://ko.wikipedia.org/wiki/%EC%9D%BC%EB%B3%B8%EC%A0%9C_%ED%95%9C%EC%9E%90

  누군가가 게시판에 일본한자 노래 제목 문의한 글

  http://jieumai.com/xe/?mid=bbs&page=18&document_srl=1579960&sort_index=title&order_type=asc

 

 

 

3) 가독성을 위한 한자 사용.

 

  아래의 페이지의 제목 문장을 보자.

  http://www.kenbolife.com/entry/utukushiikao-100

 

1
2016年世界で最も美しい顔100人をもしも、すっぴんで選んだらこうなる! 
cs

(모바일은 드래그 하면 뒷 문장이 보입니다)

 

  많이 듣는 얘기지만 한자를 많이 아는 사람들은 일본어 문장을 읽게되면 대충 의미를 유추할 수 있다고 한다. 개인적인 생각으로는 반 정도는 맞고, 반 정도는 틀리다. 문장의 의미는 어느정도 이해하겠지만 조사나 일본의 고유어 등을 몰라 중요한 뉘앙스를 놓칠 가능성이 높다고 본다. 경제, 과학 같은 한자가 많은 분야는 확실히 뜻의 유추에 도움이 되겠지만, 미묘함이 중요한 서정적인 표현 분야(블로그, 소설, 시)나 가타카나가 많이 쓰이는 게임, 잡지 등의 경우는 힘들듯 싶다.(사실 그런건 일본어를 어느 정도 배워도 힘들긴 하지만 말이다.) 위의 문장은 전자에 가까운 문장이다. 

 

  위의 문장에 포함되어 있는 아래와 같은 한자들의 의미를 안다면

1
2
年(년) 世界(세계) 最(가장 최) 美(아름답다) 顔(낯 안-얼굴) 
人(사람) 選(가릴 선 - 선택하다)
cs

'2016도에 세계에서 가장 아름다운 얼굴사람선택하는 구나' 하고 유추가 가능하다.

 

히라가나를 포함한 정확한 해석은 "2016년 세계에서 가장 아름다운 얼굴의 100인을 만약(もしも) 화장을 안한(すっぴん) 얼굴로 선택한 다면 이와 같이 된다(こうなる)" 정도의 의미이다.

 

그럼 원래 하려던 얘기인 가독성으로 돌아가면, 일본어 문장의 특징이 우리나라와 다르게 띄어쓰기가 거의 없다는 거다. 띄어쓰기가 없는 예를 우리나라 말로 똑같이 표현하면 아래와 같다.

1
2016년세계에서가장아름다운얼굴의100인을만약, 화장을안한얼굴로선택한다면이와같다
cs

요즘은 문자, 메신저 등에서 빨리 치기위해서 띄어쓰기를 생략하긴 하지만, 위의 문장을 보면 가독성이 떨어지는 느낌은 확실히 든다. 한글을 배우는 외국인은 더 심할테고 말이다. 

 

그럼 마지막으로 위의 한자가 섞인 일본어를 히라가나로만 써보면 어떻게 되는지 보자

1
2016ねんせかいでもっともうつくしいかお100ひとをもしも、すっぴんでえらんだらこうなる!
cs

 

  확실히 한자가 있는 것보다 한눈에 읽기 힘들어 지지 않게되나 싶다. 아직 쪼랩이라서 고민해 보진 않았지만, 일본어는 글을 쓸때 얼마나 적절히 한자를 섞어 가독성이 있게 쓰느냐도 글을 잘 쓰는 기준의 하나라고 한다. 너무 과하게도 너무 적지도 않게 말이다. 물론 해당 언어에 조금은 익숙해진 입장이라 처음 접하는 사람 입장으로 100% 확신있게 말을 못하지만, 이렇게 보면 띄어쓰기를 안하는 일본어 특성상 가독성을 위해 적당한 한자의 차용은 필수 인 듯도 싶다. 반대로 생각해보면 그래서 우리나라는 띄어쓰기를 사용하나도 싶다.

 

 

4) 가타카나

 

  가타카나는 한자의 범위를 벗어나긴 하지만 이왕 얘기를 시작하거 부록으로 적기로 한다. 가타카나는 보통 3가지 정도의 방식으로 쓰이는 듯하다. 1번째로 완전한 외래어

 

 

  가타카나에 대해서는 여기를 참고로..

  https://namu.wiki/w/%EA%B0%80%ED%83%80%EC%B9%B4%EB%82%98

 

  일본사람이 설명하는 가타카나를 쓰는 이유 - 요게 정확하지 않을까 싶다.

  http://m.blog.naver.com/ryonryonryon/220529239288

 

  요것도 가타카나 쓰는 이유로 일리있는 듯하다. 100%의 룰은 없긴 하다.

  http://m.blog.daum.net/global-mina/40

 

 

5) 비슷한 어순과 한자 단어의 뉘앙스, 하지만 그것 땜에 어려워 지는 언어

 

뭐 한자 얘기 하다 가타카나 까지 얘기한 이상 마지막 외도를 하려한다. 어순이나 한자 단어 쓰임이 분명 많이 비슷해서 좋긴한데, 그래서 표현할때 자연스럽고 자신있게 한국어 처럼 표현하게 되어 어색한 표현이 되는 경우도 많은 것 같다. 일종의 콩글리쉬 처럼 말이다. 이 부분은 아는게 부족하여 아래 블로그의 예제로 대체 하며 마무리를 한다. 

 

  전혀 다른 일본어와 한국어의 표현

  http://m.blog.naver.com/ryonryonryon/220134114099#

 

 

 

 

[중국 한자의 특징(북경어 기준)]

 

  중국 한자의 특징은 중의적인 뜻을 가진 단어(정확히 얘기하면 단어보다는 한자 자체들)가 많은 듯 하다. 마치 영어의 동사 같은 느낌 이라고 할까(예를 들면 susceptible 이 쉽게 병에 영향받을 만큼 면역에 약하다는 뜻도 있으면서, 다른 사람이나 사물에 쉽게 영향을 받을 만큼 민감하다는 다는 뜻도 동시에 있는 것처럼 말이다). 물론 여러 뜻을 가진 부분이 결국은 하나의 뉘앙스에서 파생되 나오는 거긴 하지만, 좀 헷깔리긴 하는 것 같다.

 

  발음은 보통 하나의 단어는 하나의 발음만 가지고 있긴 하지만, 두 개의 다른 한자가 간체로 바뀌면서 같은 모양이 되어 서로 발음이나 성조가 다르거나, 특히 문법에 쓰이는 한자일 경우 같은 한자라도 단어, 역활에 따라 성조가 달라지는 경우가 있다. 이 부분이 한자의 중의적인 부분과 혼합되어 혼란을 가중 시킨다. 우리나라에서는 고어로만 쓰이거나, 문어체에 쓰이는 무거운 느낌의 단어가 일상어로도 종종 쓰이고(이건 당연한듯 하다, 중국의 고유어는 한자니까), 한자를 풀어보면 의미는 맞지만 우리나라에선 볼 수 없는 조합의 단어 들이 많고, 비슷한 사자성어도 뭔가 조금씩은 다를때가 많다.

 

  일본어와 마찬가지로 띄어 쓰기가 없어 문장에 모르는 한자가 많을 경우 문장구조가 파악이 안되 의미를 알기 힘든 경우가 많은거 같고, 아직 잘 몰라 그렇겠지만 문장구조가 과감히 생략되거나 도치된 것 같은 표현이 많아 적응이 힘든 경우가 있다. 간체차는 첨에는 많이 헷깔리지만, 자꾸 보다보면 정이 든다고 할까, 나름 규칙들이 있어 익숙해지면 쓰기는 확실히 편한편이다.(요즘은 스마트폰으로 한자를 쓰는 경우가 더 많아 상황이 좀 변하긴 했지만...). 어순도 기본 구조는 영어와 비슷하지만 미묘하게 다를때가 많다. 외래어는 발음을 가차하거나 발음에 의미까지 가차해서 사용해서 첨엔 무척 어색하다. 뭐 우리나라의 외래어들도 외국사람 입장에서 보면 마찬가지겠지만 말이다.

 

 

1) 중의적 의미들

 

우리나라의 한자 단어는 한글과 강하게 결합되어 있어 뜻이 딱 고정된 경우가 그대로 인데, 중국어 단어는 고정적 뜻도 많지만, 가끔 단어가 중의적인 의미를 가지고, 문법으로 쓰이는 한자어는 특히 이런저런 의미의 변화가 많은 듯하다. 약간 극단적인 예지만 문법요소로 많이 쓰이는了 (le, liǎo) 는

1
2
3
a) 没完没了 (méiwánméiliǎo - 끝이 나지 않는다. 종결 이라는 의미), 
b) 吃不了 (chībuliǎo - 먹을 수 없다. 가능의 의미)
c) 他拿去了我的雨伞 (tānáqùlewǒdeyǔsǎn - 그는 내 우산을 가져갔다. 
   과거의 사건의 완료를 의미) 

d) 下雨了 (비가 (안오다가) 오다 - 변화의 의미) 

cs

  또는 우리말의 요긴하다 할때 쓰는 要紧 (yàojǐn) 은 '중요하다'와 '심각하다'는 두 가지의 뜻으로 함께 쓰인다. 花 huā 의 경우도 '꽃' 이라는 우리가 아는 명사 의미도 있지만 '쓰다'라는 의미의 동사로 사용되서, 花钱 (huāqián - 돈을 쓰다)라는 의미로도 사용된다. 개인적으론 꽃잎이 날리는 모양을 보며 쓴다 라는 의미로 확장된게 아닌가도 싶다.

 

 

2) 단어들의 차이

 

<뜻은 비슷하 지만 일부 한자가 미묘하게 다른 단어>

1
2
a) 우리나라의 機能 기능 vs 중국은 功能 (gōngnéng - 핸드폰 '기능' 등을 표현)
b) 獲得 획득 vs 중국은 获取 (huòqǔ - 아이템 등의 '획득'.)  취할 취를 쓴다
cs

 

<뜻을 풀어보면 의미는 타당하지만 우리나라에선 볼 수 없는 한자 조합의 단어들>

1
2
3
a) 耳环 (ěrhuán - 귀에 거는 고리: 귀걸이)
b) 开心 (kāixīn - 마음이 열리다: 즐겁다)
c) 冰箱 (bīngxiāng - 얼음 빙,상자 상: 냉장고) 
cs

 

<한자 단어는 동일하지만 우리나라와는 사용하는 뜻이 다른 단어>

1
2
a) 爱人 (àiren - 애인이 아니라 부인을 칭함)
b) 登录 (dēnglù - 우리나라 한자로는 登錄 등록

   중국 앱 게임할때 처음 보고 '회원가입' 이라고 생각해 한참 누르며 
   혼란에 빠졌던 기억이 난다. '로그인'의 의미임.) 

cs

 

<한자와 뜻이 동일한 단어>

1
2
a) 结婚 (jiéhūn - 결혼)
b) 亲切 (qīnqiè - 친절: 간체(우리나라는 親切)인거만 틀림
cs

 

<우리나라에선 거의 못보는 한자이며, 뜻도 좀 낯설은 단어>

1
2
3
1) 淋湿 (línshī - 물뿌릴 림, 축축할 습: 비 같은거에 흠뻑 젖는거
2) 丢 (diū -잃을 주: 물건들을 잃어 버리는 것)
3) 麻烦 (máfan - 삼 마, 번거로울 번: 귀찮다는 의미
cs

 

<단어가 실제 다르거나 위치에 따라 성조나 뜻이 달라지는 단어>

1
2
3
4
a) 差 (chà - 차이날 차: 시력이나 성적등이 나쁘다는 의미)
   出差 (chūchāi - 보낼 차: 회사에서 출장 보내는 거) 
b) 教 jiāo (가르칠 교)
   教室 jiàoshì (같은 한자인데 성조가 달라진다)
cs

 

<우리나라는 엄중한 단어의 성격이지만 그쪽에선 평상어>

1
2
3
4
5
a) 우리나라에서의 고소(告訴) 법적인 용어지만 
   중국어로는 告诉 gàosu(소식을 알리다) 라는 평상어 이다 
b) 우리나라의 유언(遺言 - 남길 유) 과 한자어는 틀리지만
   留言 (liúyán - 머무를 류: 전화를 걸거나 할때 메시지를 남기는 것을 얘기한다) 
    비교해 받아들이다 보면 이상하게 느껴진다
cs

 

 

3) 4자성어 차이

 

  잘나가는 모습에 대해서 우리나라는 前途洋洋 (전도양양 - 나아가는 길이 바다처럼 넓고 넓다) 반면에 중국은 前途无量 qiántúwúliàng (나아가는 길에 다함이 없다) 이라고 표기한다.

또 어순 차이라 그렇겠지만 우리나라는 보통 '안전주의' 하고 하는데, 중국은  注意安全 (zhùyì'ānquán - 주의안전: 안전에 주의해라) 여서 어색하다. 

1
2
a) 한국은 中途而廢 (사실은 이것보다 중도포기란 말이 생각났지만),  
b) 중국은 半途而废 bàntú'érfèi (반쯤 가서 버림)

c) 賢母良妻 현모양처 -> 贤妻良母 xiánqīliángmǔ 

   한국은 어머니가 현명한게 이상형이고, 중국은 아내가 현명한게 이상형인가 봄. 

cs

 

 

4) 외래어의 표기

 

  발음을 나타내는 한자로 가능한 이미지와 비슷한 뉘양스를 만들려고 하는 거 같다.

1
2
a) 芭蕾 bāléi(발레 - 파초 파, 꽃봉오리 뢰: 발레의 우아함?)
b) 咖啡 kāfēi (커피 - 커피 가, 커피 비)
cs

 

 

5) 어순

 

  중국사람이 아시아 권에서 영어를 제일 공부하기 유리하다는 얘기도 듣는데, 어순이 비슷하긴 하다(발음이 동일한진 자신 없지만, r vs l, f vs p 발음도 구분한다). 예로서 '그는 중국어를 할 수 있습니다' 를 표현하면(영어가 들어가니 떨리긴 한다)

1
2
he can speak chinese.
他(he) 会(can) 说(speak) 汉语(chinese). tā huì shuō hàn yǔ 
cs

위와 같이 문장 구조가 일치 한다.

 

  하지만 아래와 같이 의문문이나 도치문 등 복잡한 문장으로 들어가면 달라지긴 한다.

'너 오늘 어떻게 왔니?' 를 표현 하면

1
2
How did you come today?
你(you) 今天(today) 怎么(how) 来的(come did) nǐ jīntiān zěnme láide
cs

  그럼에도 불구하고 화자 중심적인 언어(주어 + 주어의 행동, 감정 + 기타..)를 쓴다는 부분에서는 아무래도 유사한 듯 싶다. 

 

 

6) 중국어의 한자 발음.

 

  원래는 일본어와 비슷하게 중국도 우리 한자와 중국한자 발음 사이가 일정한 규칙을 가지고 비슷하다는 얘기를 하려고 했는데, 예제를 수집하다보니, 조금 애매하게 얘기를 해야할 것 같다. 기본적으로 특정 발음은 비슷하지만, 몇 개의 서로 다른 발음으로 갈라지는 경우도 있다.

 

아래의 예제를 보자

1
2
3
4
5
6
7
8
9
10
11
12
[우리나라의 '고']
a) 高兴 (gāoxìng - '까오' 싱): 고흥(기쁘다)
   告诉 (gàosu - '까오' 수): 고소(알리다)
b) 孤独 (gūdú - '꾸' 두): 고독
   故事 gùshi - '꾸' 스): 고사(이야기)
 
[우리나라의 우]
a) 优点 (yōudiǎn - '요우' 디엔): 우점(장점)
   右 (yòu - '요우'): 우
b) 雨伞 (yǔsǎn - '위' 산): 우산
   遇见 (yùjiàn - '위' 지엔): 우견(우연히 만나다)
c) 牛奶 (niúnǎi - - '니우' 나이): 우내(젓 '내'로 소젖 -> 우유)
cs

  뭐 예제를 보다 보면 한자를 좀 많이 알다 보면 일본어 같이 발음 유추가 가능할 것 같은 느낌이 들지 않는가 싶다. 깊이 파면 또 예외들이 나올듯도 해서, 요 정도로 이야기는 마무리를...

 

 

7) 마지막 - 간체와 한자 단어의 구조

 

  한문을 쓰기는 영어나 일본어에 비해서 무척 귀찮고 힘든 일이다. 간체의 유래는 본격적으로 1950년대 부터 중국에서 시작되었다고 한다. 간체를 구성하는 간략화된 문자는 우리가 한문 흘려쓰기로 알고 있는 초서나, 비슷한 뜻을 가진 간략한 문자, 비슷한 소리를 가진 간략한 문자 등을 이용하여 기존 문자의 일부를 대체하거나 생략하는 등 간체를 추구한 사람들의 노력이 담겨져 있다고 한다.

 

  간체자에 대해서 중국, 홍콩, 대만에서는 문화 유산인 한자의 아름다움을 새 세대들이 잃어버리게 된다며 싫어하는 사람들도 많다고 들었다. 뉴스를 보면 중국 사람들이 간체만 알고 번체를 몰라서 홍콩 관광시 메뉴를 못 읽어 고생한다고 하던데, 강사분께 물어보니, 어느 정도 교육 받은 사람들은 번체의 경우 쓸 줄은 몰라도 읽을 정도는 된다고 하니, 케바케 인거 같다. 간체에 대한 전문적인 얘기는 아래의 두 블로그를 참조한다. 개인적으로 두번째 링크에 있는 원리한자 책은 중국어 공부하기 초반에 재밌게 보고 도움이 많이 되었었다.

 

  간체자의 유래 위키

  https://ko.wikipedia.org/wiki/%EA%B0%84%EC%B2%B4%EC%9E%90

  간체자의 원리

  http://hkpark.netholdings.co.kr/web/manual/default/manual_view.asp?menu_id=83346&id=297

 

  그럼 위의 간체의 얘기를 왜 한참 했냐 하면, 간체의 원리에 복잡해 보이는 한자를 간단하게 생각할 수 있는 힌트가 담겨 있다고 생각하기 때문이다. 영어가 간단하게 보이는 이유는 단순한 모양의 26개의 알파벳(기본문자)가 1차원으로 나열되어 있기 때문이다. 단어가 길어지면 인식 난이도는 늘어나겠지만, 긴 단어의 경우는 보통 그리스나, 라틴어의 어원에서 파생되어 나왔기 때문에(예를 들어 pentagon의 'penta' 는 그리스어로 '다섯'을 의미) 어원을 안다면 유추하기 편하게 되어 인식 난이도를 낮춰 준다. 밑의 1차원적인 영어 구성의 예제를 보자

1
color = 'c' + 'o' + 'l' + 'o' + 'r'
cs

 

  한자는 개인적인 느낌으로 얘기해 본 다면, 복잡한 몇 백개의 알파벳(우리가 부수라고 하는)으로 만들어진 1~9개 미만의 2차원적인 배치의 글자이다. 그림으로 설명하자면 아래와 같다.

(아무것도 아닌 걸 그림까지 그려가며 심각하게 설명하니 좀 민망하긴 하다;;)

 

  위의 이슬 로(露)는 쓰기엔 상당히 복잡해 보이는 획수가 엄청 많은 한자다. 하지만 이젠 예전 같이 옥편이나 전자사전을 뒤지는게 아니라서(그때는 중국어나 일본어는 공부보다 사전에서 단어 찾다가 실제 시간을 다 보냈었다...), 요즘처럼 휴대폰으로 발음만 알면 편하게 입력이 가능한 상황에선 한자의 복잡도 기준이 많이 달라진듯 하다.

 

※ 예전 종이 사전은 부수와 획수를 모르면 거의 못 찾는다고 봐야되지만, 요즘 중국 포탈에서 제공하는 키보드 설치시 우리나라 천지인, 또는 이지한글 같은 편한 인터페이스를 제공하고, 발음을 모를 경우 사용할 수 있는 인식도가 아주 높은 필기 방식(우리나라 전자사전의 몇배)도 선택적으로 제공해서 PC보다는 휴대폰 입력이 조금 더 편한듯 싶. 물론 PC 에도 다음, 네이버 사전이 좋긴 하지만 글자 입력 면에서는 웹이라는 특성상 로딩땜에 좀 귀찮다. 참고로 스마트 폰에서는 개인적으로 바이두(baidu) 키보드(百度手机输入法)를 쓴다. 구글 같은데를 보면 소우구 搜狗(Sougou) 키보드가 더 유명한거 같은데 몇년전 부터 써서 익숙해서 인가보다. 모양을 살짝 보면 아래와 같다.

(번호에 적힌 순서로 발음이 있는 칸을 차례로 클릭하면(xuexiao) 위에 해당되는 한자 후보가 나온다)

 

 

  다시 이슬 '로' 얘기로 돌아가서, 많이 줄였다 해도 아직도 244개나 되는 많은 알파벳(부수)이 있긴 하지만 하지만, 비 우를 a, 발 족을 b, 각각 각을 c 라고 단순화 하면, 아래와 같이 3개의 기본 문자로 이루어진 삼각형 모양으로 배치된 글자이다. 이런 알파벳 같은 단순화를 추구해서 간체를 만든 걸지도 모르겠다.

1
2
 a
b c
cs

 

  부수가 244개나 되는게 쉬운거냐고 물으면 딱히 할 말음 없지만, 개인적으로 이렇게 한자를 바라본 이후부터, 한자를 몇 개의 조금 복잡한 알파벳으로 이루어진 2차원 문자로 보게 되어 마음이 좀 편해졌다. 한자를 잘 이해하기 위해 부수를 이해하려 하는 것을, 영어를 잘 이해하기 위해 그리스, 라틴어 어원책을 보는 것과 같은 맥락으로 생각해도 될 듯하다.(부수를 이해할때는 한자 어원책이 도움이 된다). 간체를 외울 때 우리나라 한자의 종류인 번체도 같이 익히려고 하면 간략화 되기전의 부수 모양이나 기존 번체에서 과감히 생략된 부분들을 유추해야 해서, 노력은 더 많이 들게 되긴 하지만, 개인적으로 간체를 외울때 우리나라 한자인 번체도 읽기는 가능해 보려고 노력하고 있다. 그럼 한자의 부수 수에 대한 링크를 마지막으로 예상보다 장황하고 많이 길어진 글을 마무리 하려 한다.

 

  한자의 부수 수

  http://mocco.tistory.com/entry/%ED%95%9C%EC%9E%90%EB%B6%80%EC%88%98214%EC%9E%90

 

 

 

혹시 정리한 부분에 잘못된 부분이 있으면 편하게 말씀해 주세요~

 

2017.1.30 by 자유로운설탕
cs

 

 

 

 

 

posted by 자유로운설탕