flask로 웹 만들기 2 (+Mysql)
저번 포스팅에선 sql 없이 파이썬 코드 내의 딕셔너리를 활용해 키와 값으로 아이디와 비밀번호를 저장했습니다.
이번 포스팅에선 mysql을 활용해 flask와 연동시켜 작동시켜보겠습니다.
sql 구문이 꽤 등장하지만 난이도는 낮으니 걱정하지 마시고 그럼 시작하겠습니다.
1) mysql 다운로드
https://dev.mysql.com/downloads/mysql/
제 컴퓨터는 64bit이기에 64bit를 다운로드했습니다. 32bit이신 분들은 32bit용을 다운로드 하시길
만일 자신의 컴퓨터 사양을 모르신다면
윈도우 버튼 클릭 -> 설정 클릭 -> 시스템 클릭 -> 정보 클릭 -> 사양 확인
이렇게 하시면 되겠습니다.
우선 다운로드를 하시고 저는 로그인을 안했기 때문에
하단의 No thanks, just start my download. 를 클릭했습니다.
이후 화면은
https://velog.io/@hanpaul4281/MySQL-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C
MySQL 다운로드
공식 웹 페이지 https://mysql.com/downloads web community 와 community는 web으로 설치할건지 local에서 설치할건지 차이 학습용은 community로 설치하는게 편할듯하다  mysql db, table 생성 가이드
이번 단계는 sql을 아시는 분이나 mysql에 대해서 연고가 있으신 분들은 넘기셔도 됩니다.
우선 처음 하시는 분들은 mysql 창이 켜져있을 터인데 우선 빨리 익히기 위해선 그 창은 꺼주시고 저흰
이 창이 아닌 (중간 모자이크 처리는 개인 정보이기에 가렸습니다.)
이 창, 즉 Command Line Client 로 할겁니다.
이유는 SQL을 익히거나 결과를 볼 때 더 편하기 때문입니다.
우선 각자 설정한 비밀번호로 로그인해주시고
이제 설명하겠습니다.
db 관련 쿼리
CREATE DATABASES (db명);
DROP DATABASES (db명);SHOW DATABASES (db명);USE DATABASES (db명);
TABLE 관련 쿼리
CREATE TABLE (table명) (설정);SHOW TABLE (table명);DROP TABLE (table명);
가장 간단히 추려본 필수 쿼리들입니다. * 쿼리는 명령문을 뜻함. 데이터베이스에 요청하는 것들
다른 명령어들은
MySQL 기본 쿼리 (DB 생성, 삭제, Table 생성, 삭제, 데이터 입력, 삭제) - Vlee's Tale
DB 생성 CREATE database example; DB 삭제 DROP database example; DB 선택 USE example; DB 목록 보기 SHOW databases; Table 생성 CREATE TABLE test ( id int(11) not null auto_increment, name varchar(10) not null, email varchar(30), primary key(id),
vlee.kr
이 곳에 다 나와있으니까 찾아보시고 vscode로 넘어가겠습니다.
flask는 구현할 수 있는 방법이 굉장히 다양하기에 저는 가장 필요한 것들만 설명드리겠습니다.
아마 user은 제가 올려드린 곳 그대로 따라하셨으면 root이실 것이고 db명이나 password는 여러분이 정하셨을테니 비워놨습니다.
이 코드는 db와 연결시켜주는 코드입니다.
굉장히 중요한 코드입니다.
db.cursor()의 의미는 직접 쿼리를 db에게 전달하려는 매개입니다.
고로 이를 지정하는 것이 중요합니다.
cursor라고 하거나 cur이라고 하는 것이 편합니다.
가장 중요한 코드입니다.
예시로 board라는 가상 테이블의 정보를 모두 가져오라는 쿼리를 짜봤습니다.
이 단계부터는 sql의 기초 쯤은 아셔야 가능합니다.
적어도 select, insert, delete 문은 아셔야합니다.
어쨌건 쿼리를 문자열로 짜기 때문에 만일 정보 조회를 하는데 값을 받아서 한다라고 한다면
라고 짜실 수 있습니다.
이스케이프 문자로 따옴표를 붙여주지 않으면 쿼리에서 에러가 납니다.
그렇기에 붙여주었고 설정한 정보가 아닌 받은 정보를 조회한다면 포멧팅을 해야하기에 f를 문자열 앞에 넣었습니다.
조회 말고도 추가, 삭제, 업데이트 등 굉장히 많은 것들이 있습니다.
하지만 이런 것들은 sql을 조금만 공부한다면 잘 알수 있기에 넘기고 다음은 제가 어려움을 겪었던 에러들을 해결하는 법입니다.
3) 에러 해결
제가 골머리를 앓았던 것들 중 가장 큰 것은 delete과 update문이었습니다.
왜냐하면 항상 할 때마다 safe mode 뭐시기때문에 안된다고 했기 때문이죠.
허나 굉장히 간단하게 풀 수 있었습니다. (물론 당시에는 꽤 걸렸지만)
safe mode는 sql injection으로 인한 데이터 손실과 변조를 막기 위해 설정된 것입니다.
이걸 꺼주면 됩니다.
하지만 여기서 중요한 것은 아예 끄는 것과 꺼야할 때만 끄는 것은 다르다는 것입니다.
만일 그냥 끄고싶다면
쉽게 우선 MySQL Workbench (처음 실행했을 때 제가 끄라고 했던 창)을 켜주신 후 만드신 db로 들어가셔서 Edit을 누르시고 Preferences를 누르신 후 상단의 이미지에 보이듯이 SQL Editor에 들어가 가장 하단 부분에 위치한 Safe Update 체크표시를 꺼주시면 됩니다.
허나 추천하진 않습니다. (보안 문제 때문에)
다른 해결책은
이것입니다.
set 명령어는 설정이나 다른 값들을 정해준다는 것이고 sql_safe_updates는 아까 보여드렸던 설정의 값입니다.
0은 끈 것이고 1은 킨 것입니다. (1보다 높은 숫자를 설정하면 1로 자동 설정됩니다.)
저 두 개의 쿼리 사이에 delete 문이나 update 문을 넣으면 됩니다.
간단하죠?
그리고 한가지 팁을 드리자면 파이썬에서 기본적으로 제공하는 try except 문을 활용하시는 것을 추천드립니다.
물론 html에서 js 혹은 다른 것을 사용해 사전에 방지할 수 있지만 아직 어려우실 수 있기 때문에 설명드리자면
만일 회원가입 창에서 누군가 sql injection이나 XSS 공격을 한다면 (safe mode는 조회나 추가는 막지 않습니다)
escape 라이브러리로 막을 수 있습니다. (이는 python에서만 통용되는 것이 아닙니다.)
허나 만일 에러가 났다면 코드에서는 바로 오류가 날 것이고 이는 심각한 보안 문제까지 이어질 수 있습니다.
이를 미연에 방지하려면 try except문으로 sql이나 코드가 에러를 불렀을 때 except 문에 있는 코드로 에러 페이지를 띄우거나 리로드를 하는 방식 혹은 초기화나 리디렉션을 하는 방식으로 할 수 있습니다. (리디렉션은 redirect로 사이트를 옮기는 것을 뜻합니다. url을 직접 바꾸는 방식)
그리고 만일 redirect를 남용한다면 과도한 redirect 사용으로 페이지가 막힐 수도 있습니다. 이유는 redirect가 사이트 내에 있는 쿠키 및 기타 사이트 데이터에 들어가기 때문에 많아진다면 이를 초기화하고 다시 들어가야하는 상황이 일어날 수도 있습니다.
이는 적당히 redirect를 사용해주시고 (할 수 있으면 최소화) 가능하다면 render_template으로 직접 html을 불러오시는 방법을 추천드립니다. (결국 정보를 받는 것은 프론트 엔드 쪽이기 때문)
여기까지 웹 관련 포스팅이었습니다.
flask에 관해 궁금한 점이 있거나 이 포스팅에 오류가 있거나 하시면 댓글에 남겨주세요. 제가 본다면 성실히 답해드리겠습니다.