"Django의 기본기능을 사용한 로그인은 세션을 이용한 방식이다. 기본 세팅을 통해서도 내장함수를 이용하여 간단하게 로그인을 구현할 수 있다.
특정 url으로 들어오는 아이디와 비밀번호를 가진 요청을 받아 데이터베이스에 일치하는 값이 있다면 jwt토큰을 생성해서 보내준다."
장고의 기본 기능에서는 세션을 이용한 인증방식을 제공하고 jwt는 토큰을 이용하여 인증합니다. 세션은 브라우저에 세션 id를 저장하고 DB서버에 일치하는 id가 있는지 확인하는 방식으로 인증을 하고 토큰은 자체적으로 인증정보를 모두 담고 있어 DB서버와의 통신이 불필요합니다. ➡️ stateless한 통신을 유지하는 방법
"외래키가 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
"장고는 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를 매핑해서 생성해줍니다.
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
"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 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.
SQLite can change files into smaller size archives with lesser metadata.
SQLite doesn't support any kind of concurrency
, so you may have problems running it on a production website
WAL
⭐ We often use SQLite for internal databases
SQLite does not compete with client/server databases. SQLite competes with fopen().
Client-Server DB | SQLite | |
---|---|---|
purpose | shared repository of enterprise data | provide local data storage for individual applications and devices |
emphasizing | scalability, concurrency, centralization, and control | economy, 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
에 칠한 부분까지 저장이 되니까 더 직관적이고 좋은 것 같다