📌 Python 원격 데이터베이스 연동

  • 원격 데이터베이스 연동

1. anaconda3 prompt에서 pip install mysqlclient
2. python 파일 내부에서 MySQLdb import하기
3. DB 연결 설정 값 dict 형식으로 생성

# sangdata table과 연동
config = {
    'host':'127.0.0.1',
    'user':'root',
    'password':'123',
    'database':'test',
    'port':3306,
    'charset':'utf8',
    'use_unicode':True
}

4. conn 변수에 MySQLdb.connect() 객체 받기

conn = MySQLdb.connect(**config)

5. 데이터 핸들링을 위한 cursor 생성

cursor = conn.cursor()

6. INSERT문 수행

sql_data = ('12', '아이스아메리카노', '12', '5500')
sql = "INSERT INTO sangdata(code, sang, su, dan) VALUES(%s, %s, %s, %s)"
count = cursor.execute(sql, sql_data)
print('성공' if count==1 else '실패')
conn.commit()

7. UPDATE문 수행

sql = "UPDATE sangdata SET sang=%s, su=%s, dan=%s WHERE code=%s"
sql_data = ('파이썬', '10', '10000000', '12')
count = cursor.execute(sql, sql_data)
print('성공' if count==1 else '실패')
conn.commit()

8. DELETE문 수행

sql = "DELETE FROM sangdata WHERE code=%s"
sql_data = ('12',)
count = cursor.execute(sql, sql_data)
print('성공' if count==1 else '실패')
conn.commit()

9. SELECT문 수행

sql = "SELECT code, sang, su, dan FROM sangdata"
cursor.execute(sql)

# 방법1
datas = cursor.fetchall()
for data in datas:
    for cell in data:
        print(cell, end="\t")
    print()

# 방법2
print()
for r in cursor:
    print('%s %s %s %s' %r)

# 방법3
print()
for (code, sang, su, dan) in cursor:
    print(code, sang, su, dan)

# 방법3-1
print()
for (a1, a2, a3, a4) in cursor:
    print(a1, a2, a3, a4)

10. cursor와 conn 연결 닫기

cursor.close()
conn.close()


📌 Python Secure Coding

  • Secure Coding
    - 소프트웨어(SW)를 개발할 때 개발자의 실수, 논리적 오류 등으로 인해 SW에 내포될 수 있는 보안취약점(vulnerability)을 배제하기 위한 코딩 기법을 의미한다.


📌 Python 네트워크 프로그래밍

  • 네트워크 프로그래밍
    - 소켓을 이용하여 양방향 네트워크 통신이 가능하게 하는 프로그래밍
    - 소켓 객체를 사용

  • 소켓(Socket)
    - TCP/IP 프로토콜을 이용한 네트워크 프로그래밍을 지원하는 클래스 객체

  • TCP/IP 프로토콜 소켓 통신


📌 Python Client/Server 프로그래밍

  • Client/Server 프로그래밍
    - 소켓 함수를 이용해 HTTP 통신을 한다.

  • 소켓 종류와 타입
    - 소켓종류 : AF_INET - ip_v4를 이용한 소켓 통신 종류
    - 소켓타입 : SOCK_STREAM - 소켓끼리 양방향 통신을 지원하는 소켓 타입

  • 서버 소켓 구성

1. socket() : 서버 소켓 생성

serversock = socket(AF_INET, SOCK_STREAM)   # socket(소켓종류, 소켓타입)

2. bind() : 서버 ip주소와 port번호를 소켓과 묶기

serversock.bind(('127.0.0.1', 8888))

3. listen() : 서버 소켓 준비 완료
- 파라미터 : 1~5의 숫자를 지정 (동시 접속 최대수)

serversock.listen(1)

4. accept() : 클라이언트 소켓으로부터 요청 패킷 받기까지 기다리기
- 무한루프 안에서 수행 가능
- 반환값 : conn(클라이언트 정보), addr(클라이언트 ip주소 + port번호)

conn, addr = serversock.accept()    # 연결 대기

5. recv() : 요청 메시지 받기
- 소켓로 들어온 클라이언트 요청 메시지를 1kb(1024)로 받고 인코딩된 패킷을 decoding 하기 위해 decode()를 한다.

print('message : ', conn.recv(1024).decode())
  • 클라이언트 소켓 구성

1. socket() : 서버 소켓 생성

clientsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

2. connect() : 서버 소켓과 연결
- 인자값 : (서버 ip주소, 서버 port번호)

clientsock.connect(('192.168.0.36', 7878))

3. send() : 서버로 요청 메시지 보내기
- 입력한 문자열을 직렬화하여 패킷으로 보내기 위해 encode()한다.

clientsock.send('안녕 반가워'.encode('utf_8', 'strict')) # 송신

4. recv() : 서버로부터 응답 메시지 받기
- 서버로부터 1kb(1024) 패킷을 받아 원래 문자열로 decode()한다.

recv_msg = clientsock.recv(1024).decode()	# 수신


📌 Python Thread

  • process
    - 실행 중인 프로그램을 의미한다.
    - 자신만의 메모리를 확보하고 공유하지 않음

  • thread
    - light weight process라고 한다.
    - 하나의 process내에는 한 개의 thread가 존재한다.

  • multi thread
    - 하나의 process 내에서 여러개의 thread를 돌려 multi tasking 효과를 낼 수 있다.
    - multi thread는 실제로 동시 작업을 하는 것이 아니라 thread의 IDLE 상태를 최소화하여 동시 작업을 하는 것처럼 보이도록 하는 것이다.

  • thread 구현
    - threading 모듈 : Thread() 함수를 지원하는 모듈
    - threading.Thread() : thread를 사용할 목표 함수인자값을 튜플로 주어 thread를 수행한다.
    - Thread().start() : 지정한 thread 실행
import threading, time

def run(id):
    for i in range(1, 10):
        print(f'id : {id} -> {i}')
        time.sleep(0.5)

# thread를 사용하지 않은 경우
# run(1)
# run(2)

th1 = threading.Thread(target=run, args=(1,))
th2 = threading.Thread(target=run, args=(2,))
th1.start()
th2.start()

print('프로그램 종료')


profile
데이터 사이언티스트를 목표로 하는 개발자

0개의 댓글