Skip to content

2.22. 내용정리: 25일차

흔한 찐따 edited this page May 7, 2022 · 7 revisions

프레임워크 (Framework)

  • 프레임워크는 사전적인 의미로 혹은 뼈대, 골조 라는 뜻이다.
  • 프레임워크(Framework) 란, 복잡한 문제를 해결하거나 서술하기 위해 사용되는 기본적인 개념 구조이다.
  • 다시 말해, 어떤 소프트웨어를 개발하는데에 있어 필요한 구성 요소들을 언제든 재사용이 가능하도록 구성해놓은 것이 바로 프레임워크이다.
  • 컴포넌트, 라이브러리를 포함하는 개념이라고 볼 수 있다.
  • 라이브러리는 소프트웨어를 개발하는데 필요한 부품, 프레임워크는 소프트웨어의 뼈대로 비유할 수 있다.

MVC 패턴

  • MVC 패턴이란, Model-View-Controller를 지칭하는 디자인 패턴의 일종이다.
    • 디자인 패턴(Design pattern) 은 소프트웨어 공학의 소프트웨어 디자인에서 특정 문맥에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책을 의미한다.
  • 모델-뷰-컨트롤러는 응용 프로그램을 다음과 같이 세 가지의 구성요소로 나눈다.

구성요소

각각의 구성요소들 사이에는 다음과 같은 관계가 있다.

모델 (Model)

  • 모델(model) 이란, 어떠한 동작을 수행하는 코드를 말한다.
  • 모델은 모델의 상태에 변화가 있을 때 컨트롤러와 뷰에 이를 통보한다.
  • 이와 같은 통보를 통해서 뷰는 최신의 결과를 보여줄 수 있다.
  • 어떤 MVC 구현에서는 통보 대신 뷰나 컨트롤러가 직접 모델의 상태를 읽어 오기도 한다.

뷰 (View)

  • 는 보여줄 값(모델)을 컨트롤러로부터 받아와 사용자에게 보여준다.
  • 뷰는 사용자가 볼 결과물을 생성하기 위해 모델로부터 정보를 얻어 온다.

컨트롤러 (Controller)

  • 컨트롤러는 모델에 명령을 보냄으로써 모델의 상태를 변경할 수 있다.
    • 예: 워드 프로세서에서 문서를 편집하는 것
  • 또, 컨트롤러가 관련된 뷰에 명령을 보냄으로써 모델의 표시 방법을 바꿀 수 있다.
    • 예: 문서를 스크롤하는 것

플라스크 (Flask)

  • 플라스크(flask) 란, 파이썬용 마이크로 프레임워크(micro-framework) 이다.
    • 마이크로 프레임워크(micro-framework) 란, 미니멀리스틱한 웹 애플리케이션 프레임워크을 가리키기 위해 사용되는 용어이다.
  • flask 는 더 작은 애플리케이션, API 및 웹 서비스를 구축하기 위한 라이브러리이다.
  • 좀 더 자세한 설명은 flask 공식 문서 를 참고하면 된다.
  • 디자인 패턴 중에서 웹 프레임워크에 보편적으로 사용되는 패턴인 MVC 패턴으로 설계되었다.
  • flask 는 특히 간단하게 웹 서비스를 개발할 수 있는 강력한 프레임워크이다.
  • flask 를 사용하기 위해서는 명령 프롬프트에 pip 명령어를 통해 설치해야 한다.
    • 설치 명령어: pip install flask

예시

  • 아래는 flask 를 사용하여 MVC 패턴을 적용시켜 웹 애플리케이션을 작성한 간단한 예시이다.
from flask import Flask

# 먼저, Flask 애플리케이션 객체를 생성한다.
# Flask 객체는 웹 애플리케이션을 구현하고 그 중심적인 역할을 한다.
# 인자값으로 애플리케이션의 모듈 또는 패키지 이름이 전달된다.
# 일단 생성되면 보기(View) 기능, URL 규칙(rules), 템플릿(templates) 구성 등을 위한 애플리케이션의 중심부 역할을 한다.
app = Flask(__name__)


# 그 다음 'route' 함수를 통해 URL을 지정한다.
# 아래의 예시처럼 데코레이터로 정의한다.
@app.route('/')
def main():
    # 반환값은 웹 브라우저에 보여주기 위한 HTML 코드가 전달된다.
    return '<h1>Hello, Flask!</h1>'


# Flask 애플리케이션을 실행하기 위해서는 'run' 메서드를 호출하면 된다.
# 인자값으로는 호스트(host) 주소와 포트(port) 번호를 받는다.
# 여기서는 포트 번호를 웹 서버 포트 번호인 '80'을 입력해주었다.
if __name__ == '__main__':
    host = 'localhost'
    port = 80

    app.run(host, port)
  • 실행이 완료되면 http://localhost:80 으로 접속해본다.
  • URL 뒷부분의 포트 번호는 웹 포트 번호인 80이므로, http://localhost 같이 생략하여 접속이 가능하다.

프로젝트 구조

flask 의 프로젝트 구조는 다음과 같다.

Project/
  static/
  templates/
  ...
  • static: 정적 파일들( css 파일이나 js 파일)의 최상위 폴더이다.
  • templates: jinja2 템플릿 파일들( html 파일)의 최상위 폴더이다.
    • flaskjinja2 라는 템플릿을 사용한다.
    • html 파일에 jinja2 문법을 적용시켜서 파이썬 데이터를 표현할 수 있다.

예시

아래는 jinja2 문법으로 html 파일을 작성한 예시이다.

<!DOCTYPE HTML>
<html>
<head>
  <title>{{ title }}</title>
</head>
<body>
  <h1>{{ message }}</h1>
</body>
</html>

jinja2 문법

  • 위와 같이 templates 폴더 안의 html 파일에 { } 기호가 포함되어 있다면 jinja2 문법이다.
  • jinja2 문법의 종류는 다음과 같다.

데이터 표현

<h1>{{ data }}</h1>

if-elif-else 문

<body>
{% if data == 'hello' %}
  <h1>Hello, Flask!</h1>
{% elif data == 'bye' %}
  <h1>Goodbye, Flask!</h1>
{% else %}
  <h1>This is Flask!</h1>
{% endif %}
</body>

for 문

<table>
{% for e in elements %}
  <tr>
    <td>{{ e.data }}</td>
  </tr>
{% endfor %}
</table>

render_template 함수

  • 위와 같이 jinja2 문법으로 작성된 html 에 파이썬 데이터를 보내야 한다.
  • 그럴때 사용하는 것이 flask 라이브러리의 render_template 함수를 사용한다.

예시

먼저, templates 폴더 안에 html 파일을 jinja2 문법으로 작성한다.

<!-- example.html -->

<!DOCTYPE HTML>
<html>
<head>
  <title>{{ title }}</title>
</head>
<body>
  <h1>{{ message }}</h1>
</body>
</html>

그 다음, jinja2 문법으로 표현된 파이썬 변수들을 render_template 함수를 통해 표현한다.

from flask import Flask
from flask import render_template


app = Flask(__name__)


@app.route('/')
def main():
    title = 'Flask Tutorial'
    message = 'Hello, Flask!'
    template = render_template('example.html', title=title, message=message)
    return template


if __name__ == '__main__':
    host = 'localhost'
    port = 80

    app.run(host=host, port=port)

위의 코드를 실행하면 웹 페이지에 접속했을때 잘 뜨는 것을 확인할 수 있다.

url_for 함수

  • url_for 함수는 URL 주소값을 가져오는 함수이다.
  • 인자값으로 route 함수명을 넣어주면 해당 route 의 URL 주소를 가져온다.

예시

아래는 url_for 함수를 통해 정의된 route 를 실행하는 예시이다.

from flask import Flask
from flask import url_for


app = Flask(__name__)


@app.route('/')
def main():
    # 인자값으로 route로 정의한 함수 'my_test'를 넣어준다.
    url = url_for('my_test')
    # 실행되면 '/test'가 출력된다.
    print(url)
    html = f'''
<html>
<body>
    <h1>url_for 함수</h1>
    <a href="{url}">
        <p>Test</p>
    </a>
</body>
</html>
'''
    return html


@app.route('/test')
def my_test():
    return '<h1>This is url_for function test.</h1>'


if __name__ == '__main__':
    host = 'localhost'
    port = 80

    app.run(host=host, port=port)

실행해보면 a 태그의 href 속성값으로 /test URL이 전달된 것을 확인할 수 있다.