- 원격 데이터베이스 연동
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()
- Secure Coding
- 소프트웨어(SW)를 개발할 때 개발자의 실수, 논리적 오류 등으로 인해 SW에 내포될 수 있는 보안취약점(vulnerability)을 배제하기 위한 코딩 기법을 의미한다.
- 네트워크 프로그래밍
- 소켓을 이용하여 양방향 네트워크 통신이 가능하게 하는 프로그래밍
- 소켓 객체를 사용
- 소켓(Socket)
- TCP/IP 프로토콜을 이용한 네트워크 프로그래밍을 지원하는 클래스 객체
- TCP/IP 프로토콜 소켓 통신
- 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() # 수신
- 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('프로그램 종료')