[Python] 동기와 비동기 프로그래밍, asyncio
·
Programming Languages/Python
동기 프로그래밍동기 프로그래밍은 작업이 순차적으로 진행된다. 한 작업이 완료될 때까지 다음 작업이 시작되지 않는다. 따라서 코드의 흐름을 쉽게 이해할 수 있다. 그러나 I/O 작업이 진행되는 동안 프로그램은 작업이 완료될 때까지 잠시 중단되게 된다. def read_file(filename): with open(filename, 'r') as file: data = file.read() return datadef main(): filenames = ['file1.txt', 'file2.txt', 'file3.txt'] for filename in filenames: data = read_file(filename) print(f"{filename}..
[Flask] 4. 게시판 기능 추가
·
Web Development/BackEnd
준비게시판 기능을 추가하려면 다음과 같은 파일들이 필요하다. 게시판에 대한 라우터를 정의하는 board.py작성된 게시글을 보여주는 템플릿인 board.html글을 작성하는 페이지인 new_post.html 추가된 파일들에 맞게 기존 파일들을 적절히 수정해야 할 것이다.먼저 게시글에 대한 DB 테이블을 구현해야 한다. 테이블명이 post인 테이블을 생성했다.config.pyfrom flask_sqlalchemy import SQLAlchemydb = SQLAlchemy()class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(150), unique=True, nullable=..
[Python] subprocess를 사용하여 다른 파이썬 버전으로 코드를 실행하기
·
Programming Languages/Python
버전이 낮은 파이썬을 통해 개발하던 도중 xgboost 라이브러리 관련 함수를 실행하려고 했으나 파이썬 버전 호환성이 맞지 않아 설치가 되지 않았다. 결국 별도의 파일에서 별도의 파이썬 버전을 통해 해당 코드를 실행해야 했다. 그러나 매 실행마다 중간에 별도로 구분한 코드를 일일히 실행하는 것은 올바른 방향이 아니라고 생각했다. 구글링을 해 보니 파이썬의 subprocess 모듈을 통해 코드 실행 도중 별도로 구분한 함수(모듈)을 실행하는 방법을 찾았다. main.py에서 module.py의 함수를 실행하되, 파이썬 버전을 다르게 하여 실행해보자.main.pyimport subprocessimport sysdef run(): path = "C:/Users/user/AppData/Local/Progr..
[키움증권 API] 상장된 종목 코드 구하기
·
Databases/API
준비키움증권 OpenAPI+가 설치되었고, 필요한 모든 라이브러리를 설치하였다고 가정한다.코드kiwoom = Kiwoom()kiwoom.CommConnect()kospi = kiwoom.GetCodeListByMarket('0')kosdaq = kiwoom.GetCodeListByMarket('10') kiwoom = Kiwoom()kiwoom.CommConnect()Kiwoom 클래스의 인스턴스를 생성하고, CommConnect()를 통해 키움증권 API에 연결한다. kospi = kiwoom.GetCodeListByMarket('0')kosdaq = kiwoom.GetCodeListByMarket('10')GetCodeListByMarket()을 통해 종목 코드를 얻을 수 있다. 사용할 수 있는 파라..
[Flask] 3. Flask와 MySQL 연결하기
·
Web Development/BackEnd
준비Flask 애플리케이션과 MySQL을 연결하여 회원 정보를 관리하려고 한다. 먼저 회원 정보를 저장하는 테이블을 생성한다. 나는 다음과 같이 생성하였다. model.pyfrom flask_sqlalchemy import SQLAlchemydb = SQLAlchemy()class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(150), unique=True, nullable=False) password = db.Column(db.String(150), nullable=False)model.py는 SQLAlchemy를 통해 DB 모델을 정의한다.생성한 테이블의 구조와 동일..
[Flask] 2. 회원가입, 로그인 기능 만들기 / Blueprint
·
Web Development/BackEnd
준비/templates에 register.html, login.html을 작성하고 /routes에 __init__.py와 회원가입 및 로그인에 관련된 라우터인 auth.py를 작성할 예정이다.Blueprint먼저 Flask의 Blueprint에 대해 알아보자. Blueprint는 Flask 애플리케이션의 구성 요소를 모듈화하게 하는 기능이다. bp = Blueprint('bp_name', __name__)Blueprint는 위와 같이 생성할 수 있다. bp_name은 생성된 Blueprint의 이름, bp는 Blueprint 인스턴스, __name__은 현재 모듈의 이름이다. app = Flask(__name__)app.register_blueprint(bp)Blueprint를 생성한 후, Flask 애..
[Flask] 1. 프로젝트 환경 만들기
·
Web Development/BackEnd
목표파이썬 Flask 프레임워크, MySQL을 통한 기본적인 회원가입, 로그인, 게시판 기능을 구현해보고자 한다.가상환경 구축본격적으로 프로젝트를 진행하기 전, 가상환경을 구축하여 진행하고자 한다. 혹시 모를 의존성 충돌 방지 및 시스템 환경을 보호하기 위함이다. 프로젝트 폴더명은 'practice_flask'이다. python -m venv .venv터미널에 위 명령을 입력하여 가상환경을 생성한다. 폴더명은 '.venv'로 설정하였다.여담으로, 가상환경을 구축할 때 폴더명 앞에 온점('.')을 붙이는 이유는 해당 폴더를 숨김으로써 프로젝트 폴더를 깔끔하게 유지하고 실수로 폴더를 삭제하는 일을 방지하기 위함이라고 한다. 지금 같은 상황에도 굳이 폴더를 숨겨야 하나 싶지만... 관습이라고 하니 넘어가려고 ..
[Algorithm] CCW과 선분 교차 판정
·
PS/Algorithms
설명CCW는 Counter ClockWise의 약자로, 반시계 방향을 의미한다. CCW 알고리즘은 세 점이 주어졌을 때, 이들이 이루는 방향을 판별한다.  먼저 세 점 $A, B, C$를 두 개의 벡터 $\textbf{a}, \textbf{b}$로 나타내고, 두 벡터의 외적 $\textbf{a}\times \textbf{b}$를 계산한다. $\theta$를 두 벡터의 사잇각이라고 할 때,  $\textbf{a}\times\textbf{b}=\left\|\textbf{a}\right\|\left\|\textbf{b}\right\|\mathrm{sin}\theta$  이다.즉, 외적의 크기가 양수라면 두 벡터의 사잇각이 $0^{\circ}$~$180^{\circ}$이고, 이는 두 벡터가 반시계 방향이라는 것..
데이터 파이프라인이란?
·
Databases/Data Engineering
정의데이터 파이프라인은 데이터 수집, 처리, 저장, 분석을 위한 자동화된 프로세스이다.단계데이터 수집: DB, API, 로그 등에서 데이터를 수집한다. 수집한 데이터들의 형식과 구조는 다양할 수 있다.데이터 정제: 데이터의 중복을 제거하거나 결측값 처리, 데이터 형식 변환 등의 작업을 수행한다.데이터 변환: 정제된 데이터를 분석이나 저장에 적합한 형식으로 변환한다. 이 과정에서 데이터 집계, 필터링, 조인 연산 등이 사용될 수 있다. 또한 ETL(Extract, Transform, Load) 프로세스의 일환으로 수행된다.데이터 저장: 변환된 데이터를 데이터베이스, 데이터 웨어하우스, 데이터 레이크 등 적절한 곳에 저장한다. 데이터의 접근성 및 효율성을 고려해야 한다.데이터 웨어하우스: 대량의 데이터를 체..
SQL Injection이란? SQL Injection을 방어하는 방법은?
·
Web Development/BackEnd
정의 SQL Injection은 공격자가 SQL 쿼리를 조작하여 데이터베이스를 사용하는 웹 애플리케이션을 공격하는 방법이다. 이는 사용자가 입력한 데이터가 적절히 검증되거나 필터링되지 않을 때 발생하며, 공격자는 이를 통해 데이터베이스에 대한 비정상적인 접근이나 조작을 수행할 수 있다. 공격자는 모든 사용자의 정보를 조회하거나 데이터 삭제 및 수정을 할 수도 있고, 관리자 권한을 얻을 수도 있다. 동작 원리1. 공격자가 웹 애플리케이션의 입력 필드에 악의적인 SQL 쿼리문을 입력한다.2. 애플리케이션이 사용자의 입력을 검증하지 않고 쿼리로 변환할 때 입력한 SQL이 실행된다. 이를 통해 공격자가 데이터베이스에 대한 접근이 가능해진다.공격 종류1. Error based SQL InjectionSELECT ..