1. 성능:- 대규모 읽기/쓰기 작업이 필요한 경우 MySQL이 더 빠른 읽기 성능을 제공- PostgreSQL은 복잡한 쿼리 및 동시성 작업에서 더 나은 성능을 제공2. 확장성:- PostgreSQL은 수직 및 수평 확장성이 뛰어나고, 다중 환경에서의 작업이 용이- MySQL은 수직 확장에 더 강점* 수평 확장성(horizontal scaling)과 수직 확장성(vertical scaling)은 시스템의 성능과 용량을 증가시키는 두 가지 다른 접근 방식 - 수평 확장성(horizontal scaling): 수평 확장성은 시스템의 성능과 용량을 늘리기 위해 여러 노드(서버)를 추가하는 방식으로, 이를 통해 각 서버 간의 부하를 분산시키고, 고 가용성과 내구성을 향상할 수 있다. 수평 확장은 서버의 수를 ..
Django에서 웹을 만들고 FastAPI에서 딥러닝 모델을 돌리기 위해서 서버를 분리했다. Django에서 FastAPI API를 연결해서 데이터를 주고 받았고, 이미지를 다중으로 받아야 했기 때문에 리스트 형태로 받았다. 1) FastAPI 함수 구성 @app.post('/cnn_model') async def cnn_model(uploaded_files: List[UploadFile] = File(...)) -> JSONResponse: # 결과와 이미지를 딕셔너리에 담아 리스트에 추가 image_with_results = [] # 업로드된 파일의 객체를 바이너리로 이미지 데이터를 읽는다. for uploaded_file in uploaded_files: content = await uploaded..
1) 라이브러리 from django.core.paginator import Paginator 장고 내에 구현된 라이브러리로 불러온 객체를 페이징 객체로 변환시켜 준다. 2) 페이지 옵션 설정 # 장고ORM으로 데이터 쿼리셋 추출 foods = models.Food.objects.filter(name__icontains=food).order_by('name') 데이터 쿼리 셋을 가져왔다고 가정해 보자(filter내 들어가 있는 것은 Like 검색이다) # 한 페이지에 n개씩 노출 page_count = n # foods의 쿼리셋을 페이징객체로 변환시키고 n개를 한 페이지에 보여준다. paginator = Paginator(foods, page_count) # 현재 웹에서 요청하는 페이지 번호를 가져온다...
간단하게 HTML 태그를 넣어서 HttpResponse가 가능하다. 1) formating을 통해 를 넣어준다. def monthly_challenge(request, month): response = monthly_case.get(month) response_data = f"{response}" if response: return HttpResponse(response_data) return HttpResponseNotFound(f"Not month") h1는 제목 태그로 텍스트를 제목 형식으로 변경해 준다. 기존의 받은 데이터가 크기가 커지고 굵어진 것을 볼 수 있다. 2) 새롭게 index 함수를 생성한다. def index(request): response_data = """ January """..
앞서 다뤄본 것은 "Redirect"였다. 여기서 monthly_challenge_by_number 함수의 redirect 구문에 challenges를 지정해서 넣어줬었다. 하지만 이렇게 되면 monthly_challenges 폴더의 urls.py에 url을 변경하게 되면 페이지를 호출할 수 없게 된다. 물론, 함수의 redirect구문을 똑같이 변경해주면 문제가 없다. 하지만 웹 규모가 커지게 되면 오류를 찾기가 힘들 수 있다. ex) monthly_challenges 폴더 URL challenges => challenge urlpatterns = [ path("challenge/", include("challenges.urls")) ] ex) monthly_challenge_by_number 함수 c..
Redirect 리다이렉트란 다시 지시하는 것을 의미한다. 클라이언트에서 A라는 URL을 서버에게 요청했을 때 서버는 클라이언트에게 B로 다시 재요청하라는 것이다. 즉, A 요청 >> B 재요청 >> B 페이지 제공 1) 앞서 int로 생성했던 함수를 수정해 본다. def monthly_challenge_by_number(request, month: int): monthly_case_key = list(monthly_case.keys()) if month > len(monthly_case_key): return HttpResponseNotFound("Not month") response = monthly_case_key[month - 1] return HttpResponseRedirect(f"/chall..
1개의 함수 안에 많은 if문을 하게 되면 코드 가독성 부분과 확장성에 제한이 있다. 그래서 함수안의 데이터를 분리시켜 로직을 짜게 되면 코드 관리가 편해진다. 1) 월의 집합을 dict로 생성한다. monthly_case = {"january": "Django is fun!", "february": "Coding for at least 1 hour every day!", "march": "Hard Coding is hard", "april": "Let's split the if statement", "may": "Create new function", "june": "Code management made easy", "july": "Django is fun!", "august": "Coding for ..
경로에 타입을 지정할 수 있다. 1) challenges/url.py의 경로에 타입을 추가해 본다. from django.urls import path from . import views urlpatterns = [ path("", views.monthly_challenge_by_number), path("", views.monthly_challenge) ] 2) View에서는 int로 받는 값을 그대로 return 한다. from django.shortcuts import render from django.http import HttpResponse, HttpResponseNotFound def monthly_challenge_by_number(request, month): return HttpResp..
앞서 FastAPI의 라우팅과 같은 방식으로 간단히 다뤘다.(타 폴더의 값을 메인 폴더에서 읽음) 다만 하드 코딩된 URL 패턴을 사용했고, 이는 확장성이 좋지 않다.(많은 페이지가 있다면 모든 경로를 추가해야 함) 그래서 하나의 경로 패턴으로 많은 페이지를 처리할 수 있도록 해야 한다. Django에서 동적 URL 패턴을 위해서 Angle Brackets: ''을 사용한다. 1) 기존의 코드를 동적 URL 패턴으로 바꿔보자. 우선 views.py을 수정한다. from django.shortcuts import render from django.http import HttpResponse, HttpResponseNotFound # Create your views here. def monthly_chall..
View MVC Framework에서 말하는 Controller와 비슷한 역할(장고는 MVT라고 한다.) Client에서 보낸 Request에 대해서 Response을 보내주는 역할 View는 사용자의 요청을 수락하고 응답을 반환한다. User Request / Response Server Database 1. app challenges의 "view.py"을 수정 from django.shortcuts import render from django.http import HttpResponse # Create your views here. def index(request): return HttpResponse("This works!") # 인스턴스화한다. - 기본적으로 클래스 2. view와 연결을 해줄 ..