0320 TIL

looggi·2023년 3월 20일
0

TILs

목록 보기
41/114
post-thumbnail

django

장고 로그인

  1. Django의 기본 기능을 사용하는 것과 JWT를 사용하여 로그인 기능을 구현하는 것에는 어떤 차이점이 있습니까?

"Django의 기본기능을 사용한 로그인은 세션을 이용한 방식이다. 기본 세팅을 통해서도 내장함수를 이용하여 간단하게 로그인을 구현할 수 있다.
특정 url으로 들어오는 아이디와 비밀번호를 가진 요청을 받아 데이터베이스에 일치하는 값이 있다면 jwt토큰을 생성해서 보내준다."

장고의 기본 기능에서는 세션을 이용한 인증방식을 제공하고 jwt는 토큰을 이용하여 인증합니다. 세션은 브라우저에 세션 id를 저장하고 DB서버에 일치하는 id가 있는지 확인하는 방식으로 인증을 하고 토큰은 자체적으로 인증정보를 모두 담고 있어 DB서버와의 통신이 불필요합니다. ➡️ stateless한 통신을 유지하는 방법

django와 DB

  1. Django에서 어떨때 inner join / outer join으로 나뉘는지 말씀해주세요.

"외래키가 NOT NULL인 경우에는 INNER JOIN으로 만들고 NULL인 경우에는 LEFT OUTER JOIN으로 쿼리를 만든다."

https://wikidocs.net/9648#join
3. Django에서 PostgreSQL을 선호하는 이유는 무엇입니까?

PostgreSQL은 오픈소스이며 ORM과 NoSQL을 지원한다

장고는 PostgreSQL만을 위한 라이브러리를 제공하고 PostgreSQL에서 제공하는 거의 모든 기능을 지원합니다.

Postgresql is the preferred database for Django applications due to its open-source nature; and it’s also ideal for complex queries.
https://blog.sentry.io/2022/06/10/django-performance-improvements-part-1-database-optimizations/

https://hevodata.com/learn/django-postgresql/#Why_is_Django_PostgreSQL_Connection_Useful
https://jaha01.tistory.com/13

  1. Django는 어떤 종류의 데이터베이스를 사용합니까? Flask와의 차이는 무엇입니까?

"장고는 ORM을 통해 DB를 자동 생성해주고 파이썬에서 기본 DB로 설정되어있는 sqlite를 사용합니다. sqlite는 서버 프로세스로 실행되지 않아 즉지 사용이 가능하며 로컬에서 구동되기때문에 이식성이 높습니다. Flask는 DB를 직접 생성해야하므로 선택해서 사용할 수 있는데 주로 mongoDB(NoSQL)를 사용합니다. mongoDB는 query자체가 ORM으로 되어 있기 때문에 pymongo/flask-pymongo 라이브러리를 통해 손쉽게 DB를 이용할 수 있습니다."

mongoDB: NoSQL databases, MongoDB Realm: Object oriented databases

SQLAlchemy: 장고의 ORM기능을 하는 파이썬 모듈로 sql문을 작성하지 않고도 생성한 모델을 바탕으로 db를 매핑해서 생성해줍니다.

  1. Django에서 제공하는 sqlite는 어떤 장단점이 있습니까?

SQLite는 Python에서 기본으로 제공되기 때문에 별도로 설치할 필요가 없습니다.또한 로컬에서 구동되는 DB이기때문에 이식성이 높고 바로 사용이 가능하며 가볍다는 장점이 있지만 서버와 분리되어있지 않기때문에 서버가 무거워질 수 있습니다. 또 다른 서버형 DB보다 확장성이 떨어진다는 단점이 있습니다

https://docs.djangoproject.com/ko/4.1/intro/tutorial02/
https://velog.io/@aboutjoo/Django-50%EB%AC%B8-50%EB%8B%B5-5

  1. AWS를 통해 배포할 경우, sqlite를 사용하지 않는 이유는 무엇입니까?

"sqlite는 동시성을 제공하지 않아 서버-클라이언트 구조 RDBMS보다 속도가 느리고 배포시에는 얼마나 많은 유저가 접속할지 예측하는 것이 어렵기때문에 트래픽량을 고려해 postgresql이나 MySQL과 같은 서버DB를 사용해서 배포하는 것이 좋다"

server-based approach like PostgreSQL
in-file sqlite database with a server database
in-process database

https://spacebike.tistory.com/22

SQLITE 특징

SQLite is an embedded, server-less relational database management system. It is an in-memory open-source library with zero configuration and does not require any installation. Also, it is very convenient as it’s less than 500kb in size, which is significantly lesser than other database management systems.

  • 인메모리 데이터베이스는 컴퓨터의 주 메모리에 모든 조직 또는 개인의 데이터를 저장합니다. 인메모리 데이터베이스에 대한 데이터 분석은 보조 기억 장치를 사용하는 기존 데이터베이스에 비해 빠릅니다

SQLite is an embedded database. It doesn't live in a conventional architectural tier; it's just a library, linked into your application server's process. It's the standard bearer of the "single process application": the server that runs on its own, without relying on nine other sidecar servers to function.
https://fly.io/blog/all-in-on-sqlite-litestream/

SQLite facilitates you to work on multiple databases on the same session simultaneously, thus making it flexible.
cross-platform DBMS that can run on all platforms, including macOS, Windows, etc.
It can manage low to medium-traffic HTTP requests.

  • Generally speaking, any site that gets fewer than 100K hits/day should work fine with SQLite

SQLite can change files into smaller size archives with lesser metadata.

  • metadata: 데이터에 대한 데이터. 데이터를 적절하게 정리하거나 재가공할 때에 유용하게 쓸 수 있는 정보. 검색성을 향상시킴

SQLite doesn't support any kind of concurrency, so you may have problems running it on a production website

  • the real challenge for sqlite is the amount of writers at a time
  • Since WALhas been introduced, may not be a problem anymore
    • redo, undo 복구가 가능하도록 트랜잭션 전후의 상태를 저장해놓은 것

We often use SQLite for internal databases

  • intranet services all run on lightweight databases

SQLite does not compete with client/server databases. SQLite competes with fopen().

Client-Server DBSQLite
purposeshared repository of enterprise dataprovide local data storage for individual applications and devices
emphasizingscalability, concurrency, centralization, and controleconomy, efficiency, reliability, independence, and simplicity

https://stackoverflow.com/questions/913067/sqlite-as-a-production-database-for-a-low-traffic-site
https://www.simplilearn.com/tutorials/sql-tutorial/what-is-sqlite
https://www.tibco.com/ko/reference-center/what-is-an-in-memory-database
https://eyeballs.tistory.com/504
https://stitchcoding.tistory.com/9
https://www.sqlite.org/whentouse.html

장고의 장단점
https://blog.lxf.kr/2018-11-19---why-or-not-django/

프로그래머스 문제 풀기

➡️ 덧칠하기

def solution(n, m, section):
    cnt=0
    s=section[0]
    for i in range(len(section)):
        if section[i]-(s+m-1)>0:
            s=section[i]
            cnt+=1
    #if section.index(s)<=len(section)-1:
        #cnt+=1
    return cnt+1

벽면을 1m짜리 구역 n개로 나누고 각 구역을 순서를 매긴다. 이중에서 덧칠이 필요한 구역을 section에 기록해서 해당 구역들이 모두 덧칠이 되는 최소 횟수를 구한다

최초의 덧칠이 필요한 구역(s)부터 롤러의 길이 m만큼이 포함할 수 있는 구역의 번호는 s+m-1이다
해당 번호 이하는 s를 덧칠할 때 같이 할 수 있기때문에 그것보다 큰 최초의 i를 찾는다
section[i]를 s에 다시 넣어서 롤링의 시작점으로 정해서 해당 과정을 반복한다
cnt는 덧칠의 횟수로 시작점을 갱신할 때 +1해줘야한다
for문이 끝날 때까지 새로운 s값이 나오지 않는 경우는 section의 마지막 구역이 마지막 롤링에 포함되는 경우이므로 그런 경우에는 cnt+=1해준다 적다가 생각해보니 마지막 s값에 대해서는 cnt+1을 해줄 수가 없어서 무조건 1을 더해야해서 마지막 조건문이 필요없어 지워주고 마지막에 cnt+1을 리턴해준다

➡️ 덧칠하기 다른 사람 풀이

def solution(n, m, section):
    answer = 1
    start = section[0]

    for digit in section:
        if digit < start + m:
            continue
        
        answer += 1
        start = digit
    return answer

이게 내가 최초에 생각했던.. 처음에 이렇게해서 for s in section:으로 했다가 s랑 section이랑 계속 섞여서 헷갈려서 다시한다고 인덱스로 바꿨는데 ㅠㅠ
무튼 continue로 이하 코드를 실행하지 않고 다시 반복문으로 돌아가는 게 깔끔하고 괜찮은 것 같다
인덱스를 쓰지 않아도 그냥 start=digit으로 넣을 수 있는데 왜그랬지.. 🫠

def solution(n, m, section):
    answer = 0
    coloredWall = 0
    for wall in section:
        if wall > coloredWall:
            coloredWall = wall + m -1
            answer += 1
    return answer

탐욕법⭐⭐⭐
section의 요소가 이미 칠해진 벽보다 커지면 칠하고, 칠한 횟수도 증가
coloredwall에 칠한 부분까지 저장이 되니까 더 직관적이고 좋은 것 같다

profile
looooggi

0개의 댓글