MVC 패턴 : Model-View-Controller
- MVC 패턴대로 코드를 작성하면, 유지보수가 쉬워진다는 주장에 따라 등장한 아키텍쳐
- 실제로는 그렇지 않은 경우가 많음
-> MVC 패턴은 하나의 기능을 구현하는데 각 기능이 여러 파일에 쪼개져 있으므로, 코드 이해/디버깅이 어려움
-> 코드 수정시, 결국 MVC 특정 부분만 수정하기 보다, 전체 연결된 기능 관련 코드를 수정하는 경우가 더 많아지는 경우도 많음
1. Model: 응용 프로그램의 데이터 (주로 데이터베이스) => DB 영역
2. View: 텍스트, 버튼등 사용자 인터페이스를 나타냄
-> 프로젝트에서 backend endpoint경로를 처리해주는 부분이다.
플라스크에서는 Flask 클래스가 route라는 매서드를 가지고 있고 이를 통해서 클라이언트에게서 온 request를 처리한다.
3. Controller: Model 과 View 를 제어하는 중간 역할 (중간 제어 코드) , api에서 로직을 담당하는 영역이다.
=> server 영역(server - db 통신)
flask 백엔드 코드 구조
- 기능별로 폴더/파일 구분
- C 는 API, M 은 데이터베이스/데이터 모델 로만 구성하면 됨
- 기능별로 폴더를 나눠서 코드 구현 => 라우팅에 다른 폴더 구조 구축
- MVC 패턴은 매우 복잡한 기능을 가진 큰 규모의 시스템에서, 일부 유용할 수 있음
기본적인 MVC 패턴 구조 이해
- flask 서버: blog_abtest.py
- Model: db_model
- View: blog_view
- Control: blog_control
- static 은 부트스트랩등 HTML 파일에서 필요로 하는 동일 서버 내의 javascript 와 css 파일
- templates 는 flask 서버가 지원하는 HTML 파일
. ├── blog_abtest.py(메인 서버 코드)
├── blog_control
│ ├── session_mgmt.py
│ └── user_mgmt.py
├── blog_view
│ └── blog.py
├── db_model
│ ├── mongodb.py
│ └── mysql.py
├── schema.sql
├── static
│ ├── blog.css
│ ├── brand
│ └── dist
└── templates
├── blog_A.html
└── blog_B.html
Flask blueprint
-> javascript에서의 route 기능
-> flask에도 route가 있지만, 어떻게 보면 flask의 MVC 처리 순서는 " 메인서버 -> 블루프린트->라우트" 라고 이해하면 된다.
Blueprint를 활용하면
1) 가독성이 좋아진다. 2) 유지보수가 쉬워진다. 3) RESTful 한 URL 생성이 간편해진다.
- 메인 서버 코드
from flask import Flask from
하위폴더명(폴더명이 blog_view 이면 blog_view) import 하위폴더의소스파일명(blog.py 이면 blog)
app = Flask(__name__)
app.register_blueprint(하위폴더의소스파일명.블루프린트객체이름, url_prefix='/blog')
-> url_prefix=기본경로명 : 하위폴더의 소스파일에 있는 라우팅 경로는 URL/기본경로명/라우팅 경로 와 같이 설정됨
-> 분리된 하위 폴더의 소스 파일 내
-
Blueprint(블루프린트이름, name) 으로 작성
- 자바스크립트에서의 route 라이브러리를 떠올리자!
1. http://localhost:8080/blog/blog1 의 api를 MVC 패턴을 위한 블루프린트로 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# 메인서버.py
from flask import Flask
from sub_blueprint import blog_test
# 다른 폴더 내의 파일을 불러옴
# from 폴더명 import 파일명
import test_func # 동일 폴더 내의 파일을 라이브러리 처럼 불러옴
app = Flask(__name__)
print(test_func.test1())
# 그리고 "파일명.불러온 파일내의 함수명" 으로 함수를 불러와서 사용가능
app.register_blueprint(blog_test.blog_ab, url_prefix='/blog')
# http://localhost:8080/blog/blog1 해당 API를 구현하기 위해
# 우선 /blog 경로로 시작하는 api들을 해당 코드로 블루프린트 구축
# /blog가 기본경로인 api는 sub_blueprint 폴더의 blog_test 파일로 들어가서 blog_ab 함수를 실행
if __name__ == '__main__':
app.run(host='0.0.0.0', port='8080')
|
cs |
1
2
3
4
5
6
7
8
9
10
11
|
# blog_test.py
from flask import Blueprint
blog_ab = Blueprint('blog', __name__)
#blog_ab 함수는 /blog를 기본 경로로 가지는 api를 받음
# http://localhost:8080/blog/blog1
# 그리고 blog1을 세부 경로로 가지는 api에 대해서 하단의 코드 실행
@blog_ab.route('/blog1')
def blog():
return 'TEST BLUEPRINT'
|
cs |
실제로 위의 구조처럼 간단하게 MVC 패턴이 구현되지 않을 것이다.
좀더 복잡하게 구조가 짜여질 수 있고, 특히나 자율도가 높은 flask의 경우,
api 구조를 짜는데 있어서 MVC패턴에서 좀더 계층화된 패턴으로 구조를 짜는 layered architecture 도 존재한다.
처음에 둘 다 비슷한 개념인 줄 알았으나 전혀 다른 개념이므로 아래 링크 참고하여 잘 기억해 두어야 한다.
-> controller가 아닌, service에 대한 언급이 있다면, 보통 layered architecture이다.
MVC is clearly different from the layered architecture. Layered architecture does not allow coupling like in MVC, where MVC components could talk to each other. In contrast, layered architecture only allows message passing between layers. MVC architecture is mostly used for presentation, but layered architecture is focussed on the entire system. For an example, a large enterprise application with layers can have a presentation layer which uses a UI framework that makes use of MVC, but everything else is layered such as API, Persistence and Communication busses.
실제로 구조를 짜려고 하다보니 MVC 패턴, layered archetecture 그리고 blueprint 뿐아니라 flask-restx 라는 라이브러리까지...
실제로 어떤 차이가 있는지 모르겠고 개념이 헷갈리기만했다.
따라서 blueprint방식을 활용해서 프로젝트 아키텍쳐를 짜면서 개념에 대해서 추가적으로 정리해두었고,
아래의 링크에 정리해두었으니 참고하면 좋을듯 하다.
hazel-developer.tistory.com/63
Reference
www.quora.com/Is-MVC-different-from-a-3-layered-architecture
github.com/indhifarhandika/flask-mvc
github.com/senavs/flask-api/blob/master/api/project/__init__.py
github.com/r0b1n1sl4m/flask-mvc-boilerplate
'SW Engineering > BE' 카테고리의 다른 글
Flask 서버_JWT활용한 인증기능 (0) | 2020.11.19 |
---|---|
Flask 서버_flask-bycrypt로 비밀번호 암호화 (0) | 2020.11.19 |
Flask 서버구축하기_에러/로깅 다루기/데코레이터 (0) | 2020.11.13 |
Flask로 서버 구축하기_REST API(feat. 프론트) (0) | 2020.11.13 |
Flask로 서버 구축하기_Routing기본 (0) | 2020.11.12 |