








-연결에 이상이 없다면 ok 를 누른다.

LocalMySQLServer 연결이 생겼다. 해당 연결로 들어가 보자.
위 링크를 참조해 아래에서 DB를 생성한다. (MySQL 에서의 스키마 == DB 동일하다. 스키마 : 테이블의 집합체로써의 데이터베이스)

스키마 및 테이블 생성
CREATE SCHEMA `sampledb` DEFAULT CHARACTER SET utf8 ;
use sampledb;
CREATE TABLE `emp` (
`empno` varchar(50) NOT NULL,
`name` varchar(50) DEFAULT NULL,
`department` varchar(50) DEFAULT NULL,
`phone` varchar(50) DEFAULT NULL,
PRIMARY KEY (`empno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



그 후 현 디렉토리에 venv 이름의 가상환경을 생성한다.

가상 터미널에 진입한다. 아래 명령어를 입력 후 엔터를 누르면 셀이 (venv) 라고 변경된다.
.\venv\Scripts\activate
가상 터미널에서 flask 를 설치한다.

추가로 pymysql 도 설치해준다.
(venv) C:\aws\hello-flask>pip install pymysql


import pymysql #mysql을 python에서 사용할 수 있는 라이브러리
class MyEmpDao:
def __init__(self):
pass
def getEmps(self):
ret = []
db = pymysql.connect(host='localhost', user='root', db='sampledb', password='password', charset='utf8')
curs = db.cursor()
sql = "select * from emp";
curs.execute(sql)
rows = curs.fetchall()
for e in rows:
temp = {'empno':e[0],'name':e[1],'department':e[2],'phone':e[3] }
ret.append(temp)
db.commit()
db.close()
return ret
def insEmp(self, empno, name, department,phone):
db = pymysql.connect(host='localhost', user='root', db='sampledb', password='password', charset='utf8')
curs = db.cursor()
sql = '''insert into emp (empno, name, department, phone) values(%s,%s,%s,%s)'''
curs.execute(sql,(empno, name, department,phone))
db.commit()
db.close()
def updEmp(self, empno, name, department,phone):
db = pymysql.connect(host='localhost', user='root', db='sampledb', password='password', charset='utf8')
curs = db.cursor()
sql = "update emp set name=%s, department=%s, phone=%s where empno=%s"
curs.execute(sql,(name, department, phone, empno))
db.commit()
db.close()
def delEmp(self, empno):
db = pymysql.connect(host='localhost', user='root', db='sampledb', password='password', charset='utf8')
curs = db.cursor()
sql = "delete from emp where empno=%s"
curs.execute(sql,empno)
db.commit()
db.close()
if __name__ == '__main__':
#MyEmpDao().insEmp('aaa', 'bb', 'cc', 'dd')
#MyEmpDao().updEmp('aa', 'dd', 'dd', 'aa')
#MyEmpDao().delEmp('aaa')
emplist = MyEmpDao().getEmps();
print(emplist)

python app.py

실제로 이 코드를 실행하면 getEmps 메서드가 호출되어 'emp' 테이블의 모든 레코드가 콘솔에 출력을 확인 가능하다.
다른 파이썬 파일을 VS Code 에서 생성하자. 이름은 mydao.py이다.
import pymysql
class MyEmpDao:
def __init__(self):
pass
def getEmps(self):
ret = []
db = pymysql.connect(host='localhost', user='root', db='sampledb', password='password', charset='utf8')
curs = db.cursor()
sql = "select * from emp";
curs.execute(sql)
rows = curs.fetchall()
for e in rows:
temp = {'empno':e[0],'name':e[1],'department':e[2],'phone':e[3] }
ret.append(temp)
db.commit()
db.close()
return ret
def insEmp(self, empno, name, department,phone):
db = pymysql.connect(host='localhost', user='root', db='sampledb', password='password', charset='utf8')
curs = db.cursor()
sql = '''insert into emp (empno, name, department, phone) values(%s,%s,%s,%s)'''
curs.execute(sql,(empno, name, department,phone))
db.commit()
db.close()
def updEmp(self, empno, name, department,phone):
db = pymysql.connect(host='localhost', user='root', db='sampledb', password='password', charset='utf8')
curs = db.cursor()
sql = "update emp set name=%s, department=%s, phone=%s where empno=%s"
curs.execute(sql,(name, department, phone, empno))
db.commit()
db.close()
def delEmp(self, empno):
db = pymysql.connect(host='localhost', user='root', db='sampledb', password='password', charset='utf8')
curs = db.cursor()
sql = "delete from emp where empno=%s"
curs.execute(sql,empno)
db.commit()
db.close()
if __name__ == '__main__':
#MyEmpDao().insEmp('aaa', 'bb', 'cc', 'dd')
#MyEmpDao().updEmp('aa', 'dd', 'dd', 'aa')
#MyEmpDao().delEmp('aaa')
emplist = MyEmpDao().getEmps();
print(emplist)

<!DOCTYPE html>
<html>
<head>
<style>
table, th, td{
border : 1px solid black;
}
</style>
<meta charset="UTF-8">
<title>회원관리</title>
</head>
<body>
<table>
<tr>
<th>사번</th>
<th>이름</th>
<th>부서</th>
<th>전화번호</th>
</tr>
{% for emp in empList%}
<tr>
<td>{{emp.empno}}</td>
<td>{{emp.name}}</td>
<td>{{emp.department}}</td>
<td>{{emp.phone}}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
from flask import Flask
from flask.templating import render_template
from mydao import MyEmpDao
app = Flask(__name__)
@app.route('/emp01')
def emp():
empList = MyEmpDao().getEmps();
return render_template("emp01.html", empList=empList)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
python myflask01.py






템플릿 설정 항목을 보자.

템플릿은 프리티어를 선택한다.
설정 항목을 보자.
DB 인스턴스 식별자 : database-015 / 마스터 사용자 이름 : root / 마스터 암호 : password

인스턴스 구성 항목을 보자
DB 인스턴스 구성 : db.t2.micro 선택한다
아래 DB 인스턴스 종류를 확인하면, 앞에서 프리티어를 선택해 프리티어 DB 인스턴스만 선택 가능함을 확인 가능하다.

이제 연결 항목으로 넘어간다.
앞서 생성한 VPC를 사용하고, 가용 영역을 ap-southeast-1a,b,c 중 임의로 선택(나는 a를 선택했다.)

이제 생성 버튼을 눌러 DB를 생성한다.




싱가포르 리전에서 리소스 사용 -> 서울 리전으로 변경. EC2 인스턴스 생성 및 접속 시, 오류가 발생하였다. (SSH 연결 시도 시, 응답없음) -> 계정의 엑세스 키 삭제 후 재발급. 재접속하였음. 뭔가 리전 변경 이후 Resource 생성 과정에서 딜레이나 오류 발생하거나 AWS 리소스는 정상적으로 생성 되었는데 내 컴퓨터에서 접속을 못한게 아닐까 예상함(Bitvise 프로그램, AWS CLI 2개 사용했음.)
EC2 접속 후 파이썬 설치를 확인한다.

Bitvise 의 SFTP 기능으로 파일을 업로드 하자


[ec2-user@ip-10-0-1-218 hello-flask]$ sudo yum install python-pip
[ec2-user@ip-10-0-1-218 hello-flask]$ pip install -r requirements.txt



다시 실행 해 준다.

Unkown database 'sampledb'라고 나온다. RDS DB 인스턴스로 연결이 필요하다.
MySQL 워크벤치를 이용해서 RDS의 데이터베이스 인스턴스로의 연결을 생성한다.
MySQL 워크벤치로 이동해 새로운 연결을 생성한다.
EC2 정보와 RDS 정보를 입력하고 Test Connection 한다. RDS password를 물어본다. 그러면 password 입력 후 경고를 무시하고 진행하면 연결 성공이 나온다.

CREATE SCHEMA `sampledb` DEFAULT CHARACTER SET utf8 ;
use sampledb;
CREATE TABLE `emp` (
`empno` varchar(50) NOT NULL,
`name` varchar(50) DEFAULT NULL,
`department` varchar(50) DEFAULT NULL,
`phone` varchar(50) DEFAULT NULL,
PRIMARY KEY (`empno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



mydao.py를 실행하니 스키마인 sampledb로부터 데이터를 잘 가져온다!
myflask01.py를 실행해 보자.
80번 포트를 사용하려고 해서 권한 문제가 발생한다.

sudo pip install flask

sudo pip install pymysql
다시 myflask01.py 을 실행해 보자.

EC2 인스턴스에서 애플리케이션을 실행했다!
브라우저로 웹 애플리케이션 실행을 확인해보자.
http://EC2인스턴스의퍼블릭주소:80/emp01


C:\Users\USER> node --version
C:\Users\USER> npm --version

설치가 잘 된것을 확인 가능하다!
create-react-app 설치해보자. ( Create React App을 전역 설치 도구이다)
C:\Users\USER> npm install create-react-app -g
설치가 완료되었다면 /aws/ 위치로 가서 hello-react 를 실행시켜 보자.

마지막 문장은 npx 패키지를 설치하며 hello-react 라는 앱을 생성한다.
리액트 앱이 성공적으로 설치되면 해당 폴더로 이동한다

통신 모듈을 설치하고, VS Code 를 연다. 그리고 개발 서버를 실행한다.

-Flask 앱 으로부터 JSON 데이터를 가져와 사용해보자.
table, th, td{
border : 1px solid black;
}


from flask import Flask
from flask.templating import render_template
from flask.json import jsonify
from mydao import MyEmpDao
app = Flask(__name__)
@app.route('/emp01')
def emp():
empList = MyEmpDao().getEmps()
# return render_template("emp01.html", empList=empList)
return jsonify(empList)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)





localhost/:1 Access to XMLHttpRequest at 'http://localhost/emp01' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.


브라우저가 Flask로 데이터 요청하는 것이 CORS 정책 오류로 인해 제한되고, 이로 인해 데이터를 가져올 수 없어 빈 테이블이 출력된 것이다.





function App() {
// 상태변수를 정의
const [emps, setEmp] = useState([]);
// 화면이 최초로 출력되었을 때(=마운트될 때) 동작을 정의
useEffect(() => {
// axios.get('http://localhost:80/emp01')
// 플라스크 서버가 동작하고 있는 EC2 인스턴스의 퍼블릭 주소로 변경
axios.get('http://13.212.152.43/emp01')
.then(res => {
console.log(res); // 응답 내용을 콘솔에 출력
setEmp(res.data); // 응답 내용 중 data 항목을 상태변수 emps에 설정
})
.catch(err => console.log(err));
}, []);
return (
<table>
<tr>
<th>사번</th>
<th>이름</th>
<th>부서</th>
<th>전화번호</th>
</tr>
{ // 상태변수의 내용을 화면에 출력
emps.map(emp =>
<tr>
<td>{emp.empno}</td>
<td>{emp.name}</td>
<td>{emp.department}</td>
<td>{emp.phone}</td>
</tr>
)
}
</table>
);
}
C:\aws\hello-react> npm run build
C:\aws\hello-react> dir .\build

from flask import Flask
from flask.templating import render_template
from flask.json import jsonify
from flask_cors import CORS
from mydao import MyEmpDao
app = Flask(__name__)
CORS(app, origins=['*'])
@app.route('/emp01')
def emp():
empList = MyEmpDao().getEmps()
# return render_template("emp01.html", empList=empList)
return jsonify(empList)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)






권한을 아래와 같이 설정 후 업로드 한다

업로드 완료 후, 버킷 속성 - 정적 웹 사이트 호스팅 - 편집 - 아래와 같이 설정한다

이제 다시 해당 옵션으로 들어가면, DNS 주소가 나온다.

-이를 접속해보면 아래와 같이 성공한다!
