오늘의 이모저모
오늘은 시간이 매우 빨리 간 하루였다.
저번주 까지 뭔가 좀 붕 뜬 체 유지가 됬는데..
이번에는 다시 정신을 차리고 해보기로 햇다.
오늘부터 화이팅!
오늘 한 일
- SQL 코드카타
문제
Last Person to Fit in the Bus - LeetCode
There is a queue of people waiting to board a bus.
However, the bus has a weight limit of 1000 kilograms,
so there may be some people who cannot board.
Write a solution to find the person_name of the last person that can fit on the bus
without exceeding the weight limit.
The test cases are generated such that the first person does not exceed the weight limit.
Note that only one person can board the bus at any given turn.
The result format is in the following example.
Example 1:
Input:
Queue table:
+-----------+-------------+--------+------+
| person_id | person_name | weight | turn |
+-----------+-------------+--------+------+
| 5 | Alice | 250 | 1 |
| 4 | Bob | 175 | 5 |
| 3 | Alex | 350 | 2 |
| 6 | John Cena | 400 | 3 |
| 1 | Winston | 500 | 6 |
| 2 | Marie | 200 | 4 |
+-----------+-------------+--------+------+
Output:
+-------------+
| person_name |
+-------------+
| John Cena |
+-------------+
Explanation: The folowing table is ordered by the turn for simplicity.
+------+----+-----------+--------+--------------+
| Turn | ID | Name | Weight | Total Weight |
+------+----+-----------+--------+--------------+
| 1 | 5 | Alice | 250 | 250 |
| 2 | 3 | Alex | 350 | 600 |
| 3 | 6 | John Cena | 400 | 1000 | (last person to board)
| 4 | 2 | Marie | 200 | 1200 | (cannot board)
| 5 | 4 | Bob | 175 | ___ |
| 6 | 1 | Winston | 500 | ___ |
+------+----+-----------+--------+--------------+
풀이
- 해당 턴과 해당 턴 +1 의 weight 를 더해 total_weight를 업데이트 시킨다.
- 만약 해당 턴 +1 의 total_weight 가 1000이 초과된다면, 이때 해당 턴의 사용자를 반환시킨다.
- 즉 n+1 의 turn의 total_weight 가 >= 1000 일때 n의 Name을 반환.
변경
- total_weight를 생성
- total_weight를 역순으로 배치
- total_weight <=1000이 만족하는 마지막 turn의 사람 이름 반환
코드
with sum as (
select turn,
sum(weight) over (order by turn) as total_weight
from Queue
)
select q.person_name
from Queue q
join sum s
on q.turn = s.turn
where s.total_weight <= 1000
order by s.total_Weight desc limit 1
sum 이라는 새로운 인스턴트 테이블을 생성.
total_weight를 만들어주고,
이를 Queue 와 결합하여서 total_weight를 역순으로 배치.
마지막 사람의 이름을 반환.
링크
LeetCode/1204-last-person-to-fit-in-the-bus at main · K-MarkLee/LeetCode
LeetCode/1204-last-person-to-fit-in-the-bus at main · K-MarkLee/LeetCode
Collection of LeetCode questions to ace the coding interview! - Created using [LeetHub](https://github.com/QasimWani/LeetHub) - K-MarkLee/LeetCode
github.com
Django 정리하기
- 장고와 Framework
Django 알아보기
마음가짐
Django를 공부할때는 모든 작동 방식을 아는것 보다는
각각의 기능들 예로 로그인 기능, 데이터 등의 구현을 직접 처음부터 0 > 1 까지 하는 것이 아닌,
어떻게 기존의 오픈된 것들을 사용 할 수 있는지에 좀더 집중을 하기.
어떠한 물건이 즉 키보드를 사용하는 법을 알고 난 후에 나중에 키보드의 작동원리나 어떻게 구성이 되어있는지를 알아도 늦지 않다는 것이다.
처음부터 세세하게 들어가면 끝까지 하지도 못하고 지칠 뿐 더러 시간이 너무 오래 걸릴 것이다.
Framework
Framework 란 개발을 위한 구조적인 틀이다.
즉 이는 특정한 작업이나 목적을 수행하기 위해 자주 사용하는 도구들을 모아둔 코드 뭉치를 뜻한다.
( Django, Flask, FastAPI 등이 있다)
이유
Framework를 사용하는 이유로는 다음이 있다.
- 기존을 틀을 가져옴으로써 생산성이 높아진다.
- 부가적인 부분에 대한 리소스의 를 아껴서 핵심의 로직에 집중을 좀 더 할 수 있게 한다.
- 검증이된 형태를 가져옴으로 써 안정적이며 높은 퀄리티의 소프트웨어 개발이 가능하게 한다.
즉 잘 만든걸 이용해서 나에 맞게 가꾸는 것이 중요하다.
이유
Django를 선택한 이유를 알아보자.
- Python 기반의 웹 프레임워크임으로써 다른 언어를 공부 할 필요가 없다.
- 빠른 웹개발을 위한 모든 것들( 보안, 관리자 기능, Auth등등 )이 준비가 되어 있다.
- 코드의 중복을 최소화 하는 개발의 원칙 DRY(Dont repeat yourself) 의 원칙을 따른다.
- 매우 많은 레퍼런스로 이슈가 있다면 이미 해결이 되어있기 때문에 해결에 용이하다.
- 매우 유명한 서비스들에도 Django를 사용했기에 검증이 됬다고 볼 수 있다.
- 장고 기본 프로젝트 생성하기
Django 프로젝트를 생성해보자
기초 설정
- 가상환경 생성하기
1. python -m venv <이름> - 가상환경 실행하기
1. source venv/Scripts/activate - 장고 패키지 설치하기
1. pip install django==4.2 - 가상환경 패키지 추출하기
1. pip freeze > requirements.txt - 추출한 패키지 설치하기
1. pip install -r requirements.txt
프로젝트 생성
- 프로젝트 생성
1. django-admin startproject <프로젝트명> <위치> - 프로젝트 실행
1. python <실행파일> runserver
파일 설명
- settings.py - 프로젝트의 설정을 관리
- urls.py - 어떤 요청을 처리할지
- _init__.py - 하나의 폴더를 하나의 파이썬 패키지로 인식하도록 하는 파일
- wsgi.py - 웹 서버 관련 설정 파일
- manage.py - Django 프로젝트 유틸 (조종)
settings.py 와 urls.py가 우리가 사용 할 것.
- 장고 앱
Django App에 대해서 알아보자
앱이란
Django App이란 내가 생각하는 하나의 기능 덩어리이다.
하나의 프로젝트에는 여러개의 앱으로 구성이 된다.
즉 앱은 하나의 모듈 이고 프로젝트는 패키지 또는 라이브러리 가 되는 것이다.
살펴보기
앱 실행하기
python manage.py startapp <앱이름>
생성된 앱 등록하기
프로젝트 파일 > settings.py > Installed_apps에 추가
파일 살펴보기
admin.py - 관리자용 페이지 관련 설정
apps.py - 앱 관련 정보 설정
models.py - DB 관련 데이터 정의 파일
tests.py - 테스트 관련 파일
views.py - 요청을 처리하고 처리한 결과를 반환하는 파일
models.py 와 views.py는 중요.
- 클라이언트 와 서버
Django의 클라이언트와 서버에 대해서 알아보자
웹이란 무엇인가
www 즉 world wide web 전세계에 거미줄처럼 연결되어 있는것 처럼
사실은 광케이블을 이용하여서 전세계가 연결이 되어있다.
클라이언트
클라이언트란 인터넷에 연결된 장치를 의미하게 된다.
웹브라우저, 게임실행파일 등 데이터를 인터넷을 통하여 전송을 받아 실행이 되게되는 모든 장치를 의미.
이때 클라이언트는 서비스를 요청하는 주체이다.
서버
서버란 자원을 가지고 있는 컴퓨터를 의미한다.
요청을 처리하고 응답한다.
게임의 데이터 파일이나, 라이브 서비스의 데이터, api등을 실제로 가지고 있는 컴퓨터이다.
이때 서버는 요청받은 서비스를 처리하고 응답을 전해주는 주체이다.
연결
클라이언트아 서버의 연결 즉 인터넷을 이용한 연결을 CS ( Client - Server )라고 한다.
예시를 들어보자.
- 브라우저 (파이어폭스 이하 파폭) 에서 구글 홈페이지의 url을 입력한다.
- 브라우저는 유저의 입력값을 받고 구글의 홈페이지 즉 해당하는 url의 데이터를 가진 서버에게 파일을 요청한다.
- 구글 서버는 이 응답을 받고 요청된 데이터를 전송하게 된다.
- 이 응답을 받은 브라우저는 이를 해석하여 유저에게 시각적으로 표현한다.
이때, 브라우저 (사용자) 는 클라이언트 이며 구글 서버는 서버인 것이다.
- 요청과 응답
Django 요청과 응답에 대해서 알아보자
웹브라우저란?
웹브라우저는 사용자가 인터넷에서 원하는 페이지를 찾아 시각적으로 변환하고, 링크를 통해 다른 페이지로 이동할 수 있도록 돕는 프로그램이다. 서버로부터 응답은 HTML 파일, 즉 코드 형태로 오기 때문에 이를 시각적으로 변환하는 ‘렌더링’이 주요 기능이다.
웹페이지란?
웹페이지는 브라우저에서 보이는 화면 하나하나를 의미한다. 웹페이지는 크게 정적 웹페이지와 동적 웹페이지로 나뉜다.
- 정적 웹페이지: 작성된 상태 그대로 항상 동일한 내용을 전달하는 웹페이지다. 누구에게나 같은 결과값을 제공한다.
- 동적 웹페이지: 요청에 따라 내용이 수정되는 웹페이지다. 각 사용자나 환경에 따라 다른 결과값을 제공한다. 이때, 결과값의 변경이나 기능 요청에 응답을 주는 주체가 Django와 같은 프레임워크다.
프론트엔드와 백엔드
- 프론트엔드:
프론트엔드는 디자이너가 만든 페이지를 바탕으로 동적인 상호작용이 가능하도록 기능을 개발하는 영역이다. 데이터 처리와 상태 관리를 담당하며, 백엔드에서 받아온 데이터를 화면에 표시한다. 주로 사용자 인터페이스(UI)와 상호작용하며, 웹 애플리케이션의 상태를 관리한다. - 백엔드:
백엔드는 서버 측의 작업을 담당한다. 데이터베이스와의 상호작용, 보안, 로직 처리를 수행하며, 안정성과 보안을 유지하면서 원활한 데이터 교환을 지원하는 것을 목표로 한다. 백엔드는 처리된 데이터를 프론트엔드로 전송한다.
요청(Request)과 응답(Response)
- 요청(Request):
클라이언트가 서버에 특정 작업을 요청하는 과정이다. 요청은 클라이언트의 정보를 포함하여 JSON, HTML 파일 등의 형식으로 서버에 전달된다.
- 응답(Response):
서버가 클라이언트의 요청을 처리한 뒤, 결과를 클라이언트에게 전달하는 과정이다. 응답은 HTML, JSON, XML 등 다양한 형식으로 전달되며, 요청 형식에 따라 다르게 전송된다.
이처럼 웹브라우저, 웹페이지, 프론트엔드와 백엔드의 역할, 그리고 요청과 응답 과정을 이해하면 웹 개발의 기본 구조와 흐름을 파악할 수 있다.
- Design pattern
Django의 Design pattern MTV에 대해서 알아보자
MTV 패턴이란?
MTV 패턴은 Django에서 MVC 패턴을 변형한 것이다.
MVC 패턴
MVC는 Model - View - Controller의 형식으로 구성된다.
- Model
- 데이터와 관련된 로직을 관리한다.
- View
- 레이아웃과 화면 관련 로직을 처리한다.
- Controller
- Model과 View를 연결하는 로직을 처리한다.
기능별로 분리되어 독립적으로 개발이 가능하고 유지보수가 쉬워진다.
MTV 패턴
Django의 MTV 패턴은 Model - Template - View의 형식으로 구성된다.
- Model
- 데이터와 관련된 로직을 처리하며, MVC의 Model과 같다.
- Template
- 레이아웃과 화면상의 로직을 처리하며, MVC의 View에 해당한다.
- View
- 메인 로직을 담당하며, Model과 Template을 연결해 처리한다.
MTV의 동작 방식
- 사용자의 요청이 View로 들어온다.
- View는 데이터가 필요하면 Model에 요청하고, 결과를 받아온다.
- 레이아웃이 필요하면 Template에 요청해 가져온다.
- Model과 Template에서 가져온 데이터를 처리해 사용자에게 결과를 반환한다.
이처럼 MTV 패턴은 Django의 핵심 구조로, 웹 애플리케이션을 효율적으로 개발하고 유지보수하는 데 중요한 역할을 한다.
- 페이지 연결
Django를 사용해서 페이지를 추가해보자
URL Patterns
urlpattenrs는 해당 path로 url이 들어오게 되면 해당하는 함수로 연결을 시킨다 라는 뜻이다.
즉 만약 path 가 home 이면 home의 데이터를 불러오는 함수 views.home 을 부르는 식이다.
이는 urls.py의 파일에서 작성을 해야하며 위치는 <프로젝트명> / urls.py 이다.
urlpatterns = [
path("admin/", admin.site.urls),
path("index/", views.index),
path("users/", views.users)
]
해당 리스트에서 path 는 url뒤에 오는 문자열을 의미하며, 해당 문자열이 입력되면, 뒤의 함수를 호출 하는 식이다.
이때 중요한 것은 이 파일은 urls.py이기 때문에 views의 파일의 함수를 들고 오려면 호출을 해야한다.
from articles import views
위의 코드를 작성 함으로써 articles안에 있는 views를 불러오게 된다.
이때의 articles는 startapp으로 생성된 기본의 장고앱 구조를 띄고 있다.
python manage.py startapp articles
Views
views는 Django에서 로직을 담당하고 있다.
views파일의 위치는 <장고앱이름> / views.py 이다.
views에서는 함수 또는 클래스를 설정 할 수 있는데,
지금은 함수로 해보겠다.
기본적으로 함수와 클래스의 장 단점을 똑같이 가지고 있으므로 본인에 맞는 코드를 작성하는 것이 중요 할 것 같다.
우선 이전의 코드에서 index를 연결 해 보겠다.
def index(request):
return render(request, "index.html")
이 코드는 index를 호출하게 되면, request와 index.html을 같이 응답하는 함수이다.
이 render는 html의 파일을 전송하는 함수라고 보면 될 것이다.
Template
template는 html의 파일을 저장하는 장소이다.
이는 위의 코드에서 render를 사용하여 index.html을 같이 호출하지만 정작 index.html의 작성을 하지 않았음을 알 수 있다.
이때 이러한 index.html의 파일 저장을 templates폴더에 하게 된다.
templates 폴더는 기본 구조에 없으므로 새로 생성 해 줘야 한다.
위치는 <장고앱 이름> 하위에 templates 라는 폴더를 생성 해 주면 된다.
어떻게 내가 생성한 templates 폴더에 생성한 html을 알아서 찾을수 있을가? 라는 질문을 할 수 있다.
위의 사진은 setting.py의 코드 중 일부이다.
여기서 APP_DIRS 가 True로 되어 있는 것을 알 수 있다.
이는 app_dirs에서 찾아서 실행을 시키라는 의미이다.
즉 index.html을 templates 폴더를 생성해서 넣어두면 이는 장고앱 하위에 있으니 app_dirs를 통해서 찾아져서 실행이 되는 것이다.
이때 실행은 이렇게 할 수 있다.
python manage.app runserver
링크
https://github.com/K-MarkLee?tab=repositories
K-MarkLee - Overview
K-MarkLee has 29 repositories available. Follow their code on GitHub.
github.com
'TIL and WIL > TIL' 카테고리의 다른 글
2024년 12월 18일 TIL (0) | 2024.12.19 |
---|---|
2024년 12월 17일 TIL (0) | 2024.12.17 |
2024년 12월 05일 TIL (0) | 2024.12.05 |
2024년 12월 04일 TIL (0) | 2024.12.05 |
2024년 12월 03일 TIL (0) | 2024.12.04 |