0301 TIL

looggi·2023년 2월 28일
2

TILs

목록 보기
23/114
post-thumbnail

django

장고란?

  1. Django가 무엇인지 설명하시오
    장고는 파이썬의 대표적인 웹 프레임워크입니다. 풀스택으로 프론트와 백 동시 개발이 가능하며 ORM, user auth 등의 기능을 내장해 빠른 웹 개발이 가능합니다.

하이 레벨 프레임워크

  • 프레임워크: 지속적으로 발생하는 문제들을 보다 쉽게 개발자들이 해결할 수 있도록 구현해 놓은 솔루션. 이런 문제들을 해결하는 데에 코딩이 필요하지 않도록 지원해주는 것이 하이 레벨 프레임워크

https://velog.io/@loooggi/0103-TIL

  1. Django에는 어떤 장점이 있습니까?
    파이썬 기반의 웹프레임워크로 파이썬에서 많이 사용하는 데이터 수집 및 분석, AI 분야에서 사용 가능한 많은 라이브러리들을 사용할 수 있습니다.
    또 장고는 APP단위로 독립적인 구성이 가능하여 유지보수성이 좋고 ORM을 사용하여 SQL을 작성하지 않고도 데이터베이스에 처리가 가능합니다.

장점

  • 기본 기능이 이미 구현되어있어 조립한다고 생각하면 된다
  • 어드민 기능
  • 컴포넌트 기반의 “shared-nothing” 아키텍쳐로 독립성을 추구하여 하드웨어를 추가해서 발생하는 늘어난 트래픽에 대응해 크기를 변경할 수 있게 됩니다.

단점

많은 기능들이 구현되어있어서 무겁다
그래서 느리다 (하지만 이용자가 많지 않다면 아직 괜찮다)

https://velog.io/@poding84/Django%EC%99%80-Python

  1. Django를 백엔드 스택으로 선정한 이유는 무엇입니까?
    웹 페이지를 만드는 전 과정을 빠르게 익힌 후 스택을 넓혀보자는 생각으로 장고를 선택하게 되었습니다. 이미 구현되어있는 기능들이 많고 ORM이나 객체지향적 면이 다른 언어들보다 좀 더 짧은 기간 안에 배우기 좋다고 생각했습니다.
    +파이썬 AI
    +개발자들이 웹사이트를 개발할 때 실수하기 쉽지만 고려해야하는 보안 문제에 대해서 많은 도움을 줍니다.

  2. Django가 다른 Python 웹 프레임워크와 비교되는 특징이 있다면 무엇입니까?
    장고는 풀스택 프레임워크이며 보안, ORM 등 기본적인 기능이 거의 다 구현이 되어있어 개발 시간을 단축하고 생산성이 높습니다.

https://developer.mozilla.org/ko/docs/Learn/Server-side/Django/Introduction
https://happyhaelee.tistory.com/56

MTV 패턴

  1. Django의 MTV 패턴 시스템은 무엇입니까?
    Model Template View로 프로젝트의 구성요소를 역할에따라 구분한 것입니다.
    장고에서 요청과 응답을 처리하는 시스템을 패턴화한 것으로
    Model 부분은 데이터 저장 형태를 관리하고 Template은 사용자에게 보여지는 부분을 View는 데이터를 처리해서 가공하는 부분을 뜻합니다. 이 세 가지 부분의 상호작용으로 요청과 응답이 이루어지게 됩니다. 보통 view와 url을 매핑하는 URLConfig와 함께 언급이 됩니다.

구성요소가 M,T,V,로 분리되어 각각의 역할에 충실하도록 해서 유연성이 좋고 유지보수가 용이함
+MVP, MVVM 패턴

장고에서 프로젝트를 만들고 기능을 담당하는 앱을 구현할 때 models.py views.py urls.py 에 구현..

Model

DB에 저장되는 데이터
하나의 클래스가 하나의 DB 테이블에 해당함

Template

유저에게 보여지는 화면
html 파일을 context와 함께 렌더링

View

요청에 따라 적절한 로직을 수행하여 결과를 템플릿으로 렌더링하며 응답

https://livetodaykono.tistory.com/40
https://tibetsandfox.tistory.com/16

  1. Django의 프로세스는 어떤 순서로 동작합니까?
    클라이언트의 요청을 받으면 해당하는 url을 찾고, url에 연결되는 view에서 httpmethod에 따라 요청을 처리합니다. 데이터베이스의 변화가 있을 경우 model에서 처리한 후 결과를 template에 띄워줍니다.

🛸장고 프로젝트 내의 프로세스(내 답변)

views.py

  • fbv에선 requestmethod로 구분해서 로직을 처리하도록 구현
    return 템플릿 렌더링/ url 리다이렉션
  • cbv에선 url마다 하나의 뷰로 연결되고 하나의 클래스 안에서 함수 명을 httpmethod와 매핑되도록 구현

🛸전체적인 서비스에서 장고의 프로세스

파이썬

파이썬의 웹 프레임워크

파이썬에는 Global Interpreter Lock 이라는 게 있는데

파이썬 인터프리터가 하나의 Thread만 하나의 Byte code로 실행할 수 있도록 하는 것
즉 하나의 Thread에게 모든 자원의 점유를 허락
즉 하나의 Thread가 인터프리터의 모든 것을 가짐

➡️ 파이썬은 멀티스레드 프로그래밍이 제한되어있다 !

🛸동기 프레임워크

순차적으로 리스폰스를 수행해서 웹서버를 연동하여 프로세스를 늘려 개선한다

django

  • 풀스택 프레임워크

Flask

  • 장고나 피라미드 수준의 스트럭쳐는 없음
  • 마이크로 프레임워크
  • 진짜 가볍다 = 적은 비용으로 웹사이트 운용가능

🛸비동기 프레임워크

역시 비동기가 최고다
sanic
vibora
FastAPI

  • API를 만드는데 보다 집중한 프레임워크
    DRF와 비슷하다
  • 한번 만든 API를 여러 클라이언트에서 변경없이 사용할 수 있다(Frontend 웹 프레임워크/앱)
  • 파이썬 웹 프레임워크 중 가장 빠르다(NodeJS 및 Go와 대등)
    • 내부적으로 Starlette이라는 비동기 프레임워크를 사용
  • SQLAlchemy를 사용하여 ORM을 사용할 수 있다
    입출력 정의와 입출력 값을 검증하는 것이 패턴화 되어 있다

*asyncio

  • async/await 구문을 사용하여 동시성 코드를 작성하는 라이브러리
    • 파이썬 비동기 프레임워크의 기반으로 사용됨
    • CPU작업과 I/O를 병렬로 처리할 수 있게 해줌

🛸아직 미분류

Pyramid: 개발 규모에 관계없이 빠르게 구현할 수 있음
Tornado: 실시간 웹서버
+SQLAlchemy

https://mokeya.tistory.com/109
https://mokeya.tistory.com/152
https://core-research-team.github.io/2020-03-30/Python-Async-Sync-Web-Framework#python-async-web-framework
https://dojang.io/mod/page/view.php?id=2469
https://wikidocs.net/175092

프로그래머스 문제 풀기

➡️완주하지 못한 선수

def solution(participant, completion):
    if len(participant)==len(set(participant)):
        return (set(participant)-set(completion)).pop()
    else:
        for i,j in zip(sorted(participant),sorted(completion)):
            if i != j:
                return i
 
 # 짧은 버전
 def solution(participant, completion):
    for i,j in zip(sorted(participant),sorted(completion)):
            if i != j:
                return i
    return sorted(participant)[-1] 

참가자 중에 같은 이름이 있는지 보고 없으면 차집합으로 답을 구하고 요소 값을 어떻게 뺄까 생각하다가 pop을 써봤다
동명이인이 있다면 정렬된 리스트 짝을 지어서 최초로 짝이 서로 이름이 다를 때의 참가자 이름을 리턴한다

두번째 풀이에서
zip은 짧은 리스트 만큼만 쌍이 만들어져서 동명이인이 없을 경우 for문에서 리턴하지 못하기때문에 그런 경우 정렬된 리스트의 마지막 값을 리턴해줘야한다

시간이 너무 오래걸려서 어떻게 바꿔볼까 생각하다가
zip()이 메모리 효율을 좀 저하시킨다고 어디서 본 게 있어서
zip()을 안쓰려고 어제 본 리스트 축약식 하려다가 망하면서 알게된 거

리스트 축약식

# else문에서 시도한 것
[i for i in sorted(["mislav", "stanko", "mislav", "ana"]) for j in sorted(["stanko", "ana", "mislav"]) if i != j]

# 어떻게 실행되는지 실험해본 것
[i+j for i in sorted(["mislav", "stanko", "mislav", "ana"]) for j in sorted(["stanko", "ana", "mislav"])   ]
# ['anaana', 'anamislav', 'anastanko', 'mislavana', 'mislavmislav', 'mislavstanko', 'mislavana', 'mislavmislav', 'mislavstanko', 'stankoana', 'stankomislav', 'stankostanko']

이렇게 for문을 2개 쓰게되면 각 범위의 모든 조합이 다 나온다
그래서 총 12개가 나온다

def solution(participant, completion):
    participant.sort()
    completion.sort()
    for i in range(len(completion)):
        if participant[i] != completion[i]:
            return participant[i]
    return participant[len(participant)-1]

zip대신 인덱스 값으로 비교

➡️Counter로 풀어보자

import collections

def solution(participant, completion):
    answer = collections.Counter(participant) - collections.Counter(completion)
    return list(answer.keys())[0]

collections모듈의 Counter는 중복된 데이터가 저장된 배열을 인자로 받았을 때 각 원소의 빈도를 딕셔너리 형태로 저장한다
리스트의 경우 리스트 요소들 각각의 빈도를
스트링의 경우 각 글자들의 빈도를 저장한다

Counter({'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1})

카운터 객체를 리턴하면 이런 모양 딕셔너리의 키/밸류 객체 리턴 모양과 동일하다
counter(대상).most_common(k)
가장 출현 빈도가 높은 요소 순서대로 k개 출력
[(요소,빈도수)] 형태로 리턴하고 이 리스트의 길이는 k가 됨
ex. if k==1: 최빈값을 가지는 요소만 리턴

카운터 객체끼리 연산이 가능하다
이 풀이에서도 카운터끼리 뺐는데, 이러면 어떤 요소 하나만 남게되고 딕셔너리 형태로 결과가 나오기 때문에 key값을 리턴해주면 된다 Counter({'A': 1})

https://www.daleseo.com/python-collections-counter/

➡️해시 풀이

def solution(participant, completion):
    answer = ''
    temp = 0
    dic = {}
    for part in participant:
        dic[hash(part)] = part
        temp += int(hash(part))
    for com in completion:
        temp -= hash(com)
    answer = dic[temp]

    return answer

파이썬 내장 hash함수를 사용해서 각 선수들의 이름을 해싱해서 key로 만들고 그 이름을 value로 저장한다
temp에 그 값들을 다 더해서 넣고 완주한 선수들의 요소들도 각각 해싱해서 temp에서 빼주면 마지막 남은 1명의 완주자 이름에 해당하는 값만 키값으로 남게되어 밸류값을 찾으면 된다
이 방법은 1명이니까 가능한 방법 다빼고 남은 숫자가 같아야하니까

temp가 overflow날 일은 없을 듯 합니다. python의 경우 int범위를 벗어나면 Long이되고 long은 한계가 없네요

➡️해시 풀이2

def solution(participant, completion):
	result = {}
    for a in participant:
        result[a] = result.get(a, 0) + 1

    for b in completion:
        result[b] -= 1
        if result[b] == 0:
            del result[b]
    return list(result.keys())[0]

모든 키값에 해당하는 밸류값이 1이 되고 두번째 for문에서 완주자라면 value값이 0이 되고, value값이 0인 경우 해당 요소를 삭제해버리면 하나만 남게 된다

효율성 테스트에서 되게 크게 차이는 나지 않았지만 해시는 원래 엄청 효율적으로 삽입 및 조회를 할 수 있다고 한다
(전체 자료를 검색해야하는 최솟값, 최댓값의 경우에는 효율이 낮다)

profile
looooggi

1개의 댓글

comment-user-thumbnail
2023년 3월 1일

플라스크 프레임워크: 풀스택으로써 처리해줄 수 있는 기능이 없다

답글 달기