Share
Sign In
TIL 웹개발
내일배움캠프에서 공부한 내용을 복습니다.
서경태
TIL 웹개발 - RESTful API란?
RESTful API는 웹 서비스 개발에서 많이 사용하는 아키텍처 스타일 중 하나입니다. Django에서는 Django REST Framework(DRF)를 이용하여 쉽게 RESTful API를 구축할 수 있습니다. RESTful API와 Django에 대해 이해하는 데 도움이 될 만한 개념들을 아래에 설명할게요. 1. RESTful API란? REST(Representational State Transfer)는 자원을 네트워크 상에서 정의하고 자원에 대한 주소를 지정하는 아키텍처 스타일입니다. RESTful API는 이 REST 원칙을 따르는 API를 의미합니다. RESTful API의 주요 특징: 자원(리소스) 기반: REST는 모든 것을 자원으로 간주합니다. 예를 들어, 사용자, 게시물, 댓글 등이 자원으로 표현됩니다. HTTP 메서드 사용: CRUD 작업을 HTTP 메서드로 매핑합니다. GET: 자원의 조회 POST: 자원의 생성 PUT: 자원의 전체 수정 PATCH: 자원의 부분 수정 DELETE: 자원의 삭제 URL 설계: 자원은 고유한 URL로 접근됩니다. 예를 들어, GET /users/는 사용자 목록을, GET /users/1/은 특정 ID를 가진 사용자를 조회합니다. 무상태성: REST API는 무상태성을 유지해야 합니다. 즉, 서버는 각 요청을 독립적으로 처리하며, 이전 요청의 상태를 기억하지 않습니다. 표준화된 응답: 주로 JSON 형식으로 데이터를 주고받습니다. 2. Django에서 RESTful API 구현하기 Django REST Framework (DRF): Django에서 RESTful API를 쉽게 구축할 수 있도록 도와주는 라이브러리입니다. DRF는 직렬화, 인증, 권한 부여, 요청 처리 등의 기능을 제공합니다. 핵심 컴포넌트: Serializer: Django 모델 인스턴스를 JSON으로 직렬화하거나, JSON 데이터를 모델 인스턴스로 역직렬화하는 역할을 합니다. ViewSet: API의 논리를 처리하는 뷰를 그룹화한 것입니다. DRF에서는 일반적으로 ViewSet을 사용하여 CRUD 기능을 구현합니다. Router: ViewSet과 URL을 자동으로 연결해주는 역할을 합니다. 이를 통해 RESTful URL 패턴을 쉽게 설정할 수 있습니다. 예시 코드:
서경태
TIL 웹개발 - Django의 cleaned_data 활용
모델 폼을을 사용해 값을 받은 후 그 값을 다시 반환하거나 사용할때 cleaned_data를 사용할 수 있다. 팀프로젝트에서 해시태그 기능을 만들때 cleaned_data를 사용해 중계테이블의 값을 가져왔다. 해시태그와 아티클의 모델을 만들고 아티클에 해시태그를 M:N 필드로 가져와 article_hashtag 중계테이블을 만든 상태다. 모델폼은 만드는데 hashtags를 상속받지 않고 오버라이딩한다. 이유는, 상속받아 폼에 적용하면 hashtag테이블에 생성된 것 중 선택하는 양식으로 나오기 때문이다. 보통 해시태그는 선택이 아니라 직접 작성하기 때문에 위 코드처럼 오버라이딩해서 Textfield로 지정한다. views.py 에서는 모델폼을 사용해 값을 입력받는 로직이다. 하지만 form이 만들어지고 save를 했다고 해도 article_hashtags 중계 테이블에는 데이터가 저장되지 않는다. 이때 form의 cleaned_data 요소를 사용해 hashtag값을 반환해 따로 저장한다. form.is_valid()를 통해 유효성 검사를 통과화면 cleaned_data 딕셔너리가 생성되고 데이터가 cleaned_data 딕셔너리에 추가된다. 각 필드의 이름이 딕셔너리의 키(key)가 되고 입력한 내용이 값(value)로 저장된다. 만약 내가 아티클을 아래와 같이 작성하고, 타이틀: 아이폰 신상 공개 내용: 아이폰이 새로나왔어요! 해시태그: 아이폰 if form.is_valid()를 지나 해시태그 내용응 반환하고 다시 해시태그 테이블에서 그 값으로 중계테이블에 추가한다.
서경태
TIL 웹개발 - Git 활용
git init 현재 디렉토리를 깃 저장소로 초기화한다. .git 폴더가 생성됨으로써, 해당 디렉토리가 깃으로 관리되는 프로젝트가 된다. git status 현재 작업 디렉토리의 파일 상태를 확인할 수 있다. 어떤 파일이 수정되었는지, 어떤 파일이 스테이징되지 않았는지 등을 보여준다. git add <파일명> 특정 파일을 스테이징 영역에 추가한다. 예를 들어, git add example.txt를 입력하면 example.txt 파일이 커밋 대상에 포함된다. git add . 현재 디렉토리의 모든 변경 파일을 스테이징 영역에 추가한다. 자주 쓰이지만, 정확히 어떤 파일이 추가되는지 항상 확인하는 게 좋다. git commit -m "커밋 메시지" 스테이징된 파일들을 커밋한다. "커밋 메시지" 부분에 해당 커밋에 대한 설명을 적는다. 이 메시지는 프로젝트 히스토리를 이해하는 데 중요하다. git log 커밋 히스토리를 조회할 수 있다. 각 커밋의 해시, 작성자, 날짜, 메시지 등을 확인 가능하다. git branch 현재 브랜치를 확인하거나, 브랜치를 목록으로 보여준다. 새로운 브랜치를 생성하거나 삭제할 때는 -d 옵션 등을 추가로 사용한다. git branch <브랜치명> 새로운 브랜치를 생성한다. git branch feature를 입력하면 feature라는 이름의 새로운 브랜치가 만들어진다. git checkout <브랜치명> 다른 브랜치로 전환한다. 예를 들어, git checkout develop을 입력하면 develop 브랜치로 이동한다. git merge <브랜치명> 특정 브랜치를 현재 브랜치로 병합한다. 주로 새로운 기능을 개발한 브랜치를 main 브랜치에 병합할 때 사용한다. git remote add origin <원격 저장소 URL> 로컬 저장소와 원격 저장소를 연결한다. 보통 origin이라는 이름으로 많이 쓰인다. git push origin <브랜치명> 로컬 브랜치의 커밋을 원격 저장소에 푸시한다. 보통 main이나 develop 같은 브랜치를 푸시한다. git pull 원격 저장소에서 최신 변경 사항을 가져오고, 현재 브랜치에 병합한다. 푸시하기 전에 자주 사용하게 된다. git clone <원격 저장소 URL> 원격 저장소를 로컬에 복제한다. 원격에 있는 프로젝트를 그대로 내 컴퓨터로 가져올 수 있다.
서경태
TIL 웹개발 - Django form, model 등등 찾아보기
Django를 배우다보니 어느순간 기억하는데 한계가 오기 시작한다. 그 이유는 import하는 함수, 데코레이터, 모델, 폼 등등 너무 복잡하기 때문인데... 이참에 정리해보고 여기서 한번에 확인하자.. (자동 완성은 from 머시기도 다 찾아주나...) Accounts 관련 로그인 / 로그아웃 기능 auth_login(request, user)를 사용한다. user가 없는 경우 request.user를 사용한다. 로그아웃할때 자동으로 세션를 삭제해준다. 로그인 폼 현재 프로젝트에서 사용되는 사용자 모델 가져오는 기능 커스텀 사용자 모델을 사용하는 경우, settings.py에 AUTH_USER_MODEL을 설정해야한다. AUTH_USER_MODEL를 설정하지 않으면 기본 사용자 모델을 사용한다. 회원가입 / 회원 정보 수정 폼 비밀번호 변경 폼 데코레이터
서경태
TIL 웹개발 - Django에서 커스텀 폼 사용하기
Django에서 제공되는 Form을 커스텀해서 사용하는 방법에 대해 알아보자. 회원 정보를 수정하는 페이지를 만들때, 간편하게 UserChangeForm을 사용할 수 있다. 하지만 이 폼에는 아래 이미지처럼 일반 회원이 굳이 접하지 않아도 되는 필드들이 나온다. 그래서 커스텀 폼을 사용해 필요한 내용만 나오도록 조정한다. 먼저 forms.py에서 쟝고에서 제공하는 UserChangeForm을 임포트한다. CustomUserChangeForm을 만들고 ()안에 UserChangeForm을 넣어 상속을 받는다. class Meta: model = get_user_model() 은 모델폼을 만든 것이다. fields를 리스트로 만들어 안에 필요한 내용을 채운다. 코드처럼 이름과 이메일 주소만 기입하도록 설정했다. 처음 이미지와 달리 깔끔하게 필요한 정보만 기입하도록 수정했다.
서경태
TIL 웹개발 - Django쟝고에서 Decorator 데코레이터 사용하기
Django에서 데코레이터는 웹 애플리케이션의 특정 기능을 쉽게 구현할 수 있도록 도와준다. 주로 인증, 권한 관리, 보안, 캐싱 등의 기능을 위해 사용된다. @login_required : 로그인된 사용자만 접근 가능 @permisison_required : 특정 권한이 있는 사용자만 접근 가능 @crsf_exempt : CSRF 검사를 비활성화 @require_http_mothods : 지정된 HTTP 메소드만 허용 @require_POST: POST 요청만 허용 @cache_page: 지정된 시간동안 캐싱하여 출력 성능 향상 @transaction.atomic: 하나의 트랜잭션으로 모든 DB작업 처리 위 데코레이터들은 쟝고에서 주로 사용되는 것들인데 이제 하나씩 알아보자. @login_required 사용자가 로그인하지 않은 상태에서 이 데코레이터가 사용된 뷰에 접근하면 로그인 페이지로 다이렉트를 하는 기능 제공한다. 이렇게 사용하면 my_view에 접근하기 위해 로그인이 필요하고 로그인하지 않은 경우 로그인 페이지로 이동한다. (물론 로그인 페이지가 있는 경우) 이때 두 가지 방법으로 로그인 페이지를 login_required와 연결할 수 있다. 직접 login_url 설정 @login_reqired 데코레이터 함수를 보면 다음과 같이 작성되어 있다. 여기서 login_url = None으로 되어있는데 이 부분을 로그인 페이지로 설정하면 데코레이터가 정상적으로 작동한다. accounts / login.html 설정 쟝고의 기본 설정에 따라 아래 그림처럼 페이지를 구성하면 @login_required를 사용할 수 있다. 로그인 페이지를 accounts 폴더에 위치시키면 쟝고가 알아서 해당 페이지를 리다이렉트해준다. 로그인 후에는 사용하던 페이지의 url을 next 파라미터에 저장해 다시 리다이렉트 해주니 굉장히 편리한 기능이다.
서경태
TIL 웹개발 - Django form 정리
우선 form은 클라이언트가 데이터를 조회하거나 전송할 때 사용하는 태그(tag)다. 게시글을 작성하는 form을 작성하면 아래 코드와 같다. 제목과 내용을 작성해 form형태로 서버에 전달해 처리한다. 이 form 형태를 쉽게 처리하는 기능을 django에서 제공하는데 Django model form이다. 데이터베이스 모델에 대응하는 폼을 자동으로 생성해주는 기능으로 위 코드처럼 별도로 폼을 정의하지 않아도 된다. 그리고 데이터베이스 기준에 따라 (텍스트, 숫자 등) 형식을 맞추지 않을 경우 자동으로 경고 메시지를 보내주기도 한다. Django model form 모델과 폼의 자동 연결 ModelForm을 사용하면, Django 모델에 정의된 필드를 기반으로 자동으로 폼 필드가 생성된다. 예를 들어, 모델에서 Charfield, DateField 등이 있다면, 해당 필드에 맞는 html 폼 필드가 생성된다. 간편한 데이터 처리 모델 폼은 데이터의 유효성을 검사하고, 유효하다면 데이터베이스에 쉽게 저장할 수 있다. form.save() 메소드를 사용하면 폼데이터를 모델 인스턴스로 변환하고 저장할 수 있다. 유효성 검사 모델 폼은 모델에서 정의된 필드의 유효성 검사(예: 최대 길이, 필수 입력 여부)를 자동으로 처리한다. 추가적인 커스텀 유효성 검살르 쉽게 정의할 수 있다. 모델 폼 정의하는 방법 Article 데이터베이스 / models.py 현재 title과 content라는 데이터 베이스가 있는 경우,
서경태
TIL 웹개발 - Django 시작하기
배운대로 써보는 djano 시작하기 기본적인 세팅부터 앱을 등록하는 방법까지 정리해본다. 아래 코드들은 모두 터미널에서 진행된다. 디렉토리를 잘 확인하고 진행해야한다. 가상 환경을 만들어준다. 가상 환경을 만들어주는 이유는 여러 프로젝트를 진행하는 경우 각 프로젝트의 버전을 유지하기 위해서다. A프로젝트에서 쟝고 3.2를 쓰고 B프로젝트에서 쟝고 4.2를 쓴다면 가상환경만 바꿔주면 문제 없이 작동한다.(고 한다. 안해봄.) Django를 설치한다. 이때 버전은 4.2를 설치하는데 이유는 LTS이기 때문인다. Django 4.2는 LTS(Long Term Support)다. LTS는 긴 보증 기간을 뜻하는데 안정성을 위해 보통 LTS 버전을 많이 사용한다. requirements.txt를 생성한다. requirements.txt에는 설치한 라이브러리의 이름과 버전이 적혀있다. 다른 사람이 이 프로젝트를 이어서 진행하거나 수정하는 경우 어떤 라이브러리와 버전이 설치되어있는지 확인할 수 있고 이 문서를 통해 바로 설치도 가능하다. Django 프로젝트 생성하기 "name" 부분에는 따옴표없이 프로젝트의 이름을 넣어준다. 그럼 바로 지정한 이름의 폴더가 생성되고 그 안에 django의 구조가 자동으로 만들어진다. 앱 생성 및 등록 프로젝트 폴더 안에 "app name"으로 폴더가 생성된다. 이제 settings.py를 찾아 그 안에 생성한 앱 이름을 넣어주면 기본세팅이 끝난다. 프로젝트 폴더 안에 같은 이름의 폴더가 하나 더 있다. 그 안에 setting.py가 있다. settings.py 안에 둘러보다보면 INSTALLED APPS = [] 가 있다. 이미 여러 가지가 채워져있는데 그 밑에 생서한 앱 이름을 추가하면된다.
서경태
TIL 웹개발 - CS 모의 면접 정리
우선 CS 면접의 경험을 정리해보면, 왜 CS를 공부해야하는지 이제서야 알게 된 느낌이었다. 단순히 개념과 설명을 반복해서 표현하는게 아니라 각 개념들 간 관계를 알고 차이점까지 설명할 줄 알아야 실무에서도 적용할 수 있다. 주로 두 가지 개념에 대해 묻는다. 이렇게 두 가지를 물어보는 이유는 차이점이 존재하기 때문에 그 특징을 잘 설명하는 것이 중요하다. 배열, 연결리스트 자료구조에서 배열과 연결리스트는 모두 데이터를 저장하고 관리하는데 사용된다. 배열 연속적인 메모리 공간에 정하는 데이터 구조 고정 크기를 가지며 한번 선언되면 크기를 변경할 수 없다. → 이는 단점으로도 작용하는데 배열의 크기를 동적으로 변경할 수 없다. 인덱스를 사용해 데이터에 접근이 빠르다. → O(1)의 시간복잡도를 가진다. 삽입 및 삭제의 비효율성 → 배열 중간에 삽입하거나 삭제할 경우 나머지 요소들을 이동시켜야하므로 O(n)이 걸린다. 연결리스트 각 요소가 노드로 구성되고, 각 노드는 데이터와 다음 노드를 가리키는 포인터를 표함되는 데이터 구조 동적 크기로 필요에 따라 노드를 추가하거나 제거하여 크기를 동적으로 변경할 수 있다. → 각 노드는 효율적인 삽입/삭제 리스트의 중간에 요소를 삽입하거나 삭제하는데 O(1) 시간이 소요된다. → 반면 특정 위치를 찾는데 O(n)의 시간이 걸려 접근이 느리다. 비연속적 저장으로 메모리 활용이 유연하다. 프로세스와 스레드 프로세스 실행중인 프로그램의 인스턴스를 의미하며, 프로그램이 메모리에서 실행되는 상태를 말한다. 각 프로세스는 독립된 메모리 공간을 가지며, 다른 프로세스와 메모리 공간을 공유하지 않는다. 실행에 필요한 자원(파일, 메모리, CPU 등) 을 소유한다. 운영체제는 프로세스를 생성, 스케쥴링, 종료등의 작업을 관리한다.
서경태
TIL 웹개발 - CS면접 대비 정리글
모의 CS면접을 하루 앞두고 기억나는대로 정리를 해보려한다. 컴퓨터 구조 컴퓨터는 네 가지 장치로 이뤄진다. CPU 컴퓨터의 뇌에 해당하며 연산을 담당한다. 주기억장치 = RAM , 메모리 보조기억장치에 저장된 프로그램을 실행시키면 주기억장치에 올라와 사용한다. 전원이 꺼지면 주기억장치에 담긴 메모리도 없어진다. 보조기억장치 HDD, SSD 등 컴퓨터가 꺼져도 유지되는 장치. 평소 보조기억장치에 저장되었다가 프로그램이 실행되면 주기억장치에서 작동한다. 입출력장치 마우스, 키보드, 모니터 등 컴퓨터에 입력 혹은 출력을 할 수 있는 것들을 말한다. 프로세스: 작업이 이루어지는 것을 말한다. 프로세스의 순서 신규, 준비, 실행, 대기, 종료 로 이루어진다. 프로그램을 불러오면 신규에서 준비단계로 넘어온다. 메모리의 할당을 마치면 준비에서 실행 단계로 넘어가 실행된다. 실행 중 입력이 필요하면 대기단계로 넘어간다. 입력을 마치면 다시 준비 단계로 넘어가고 실행단계에서 출력한다. 종료를 하면 실행에서 종료 단계로 넘어간다. 프로세스 구조
서경태
TIL 웹개발 - 유연한 사고를 가져라
알고리즘 조금 풀어봤다고 모든걸 알고리즘으로 풀려고 하기 시작했다. 펠린드롬 관련 문제를 백트래킹으로 풀면 결국 풀리는거 아냐? 하고 시작했는데... 파이참이 계산을 하다가 꺼져버렸다... 그래서 아 이건 안되겠구나 싶어.. 다시 코드를 작성했다. 조금만 더 유연한 사고를 가지면 사실 펠린드롬은 1/2로 충분히 계산할 수 있고 경우의 수가 아니면 굳이 백트레킹을 사용할 필요도 없다. 결국 내가 작성한 코드는 시간 복잡도는 O(n^2)다. 이상한거에 매몰되어 시간을 낭비하지 말자. 공부시간이 줄어든다.
서경태
TIL 웹개발 - 자료구조
기본적인 자료구조 연결리스트 스택 큐 해시테이블 힙 연결리스트 Array LinkedList 특정 원소 조회 O(1) O(N) 중간에 삽입 삭제 O(N) O(1) 데이터 추가 데이터 추가시 모든 공간이 다 차버렸다면 새로운 메로리 공간을 할당받아야한다. 모든 공간이 다 찼어도 맨 뒤의 노드만 동적으로 추가하면 된다. 정리
서경태
TIL 웹개발 - 빅데이터 인공지능
빅데이터 데이터의 종류 정형 데이터 정량적이고 수치로 확인할 수 있거나 구조를 가지고 있는 데이터를 의미 시간, 시계열, 데이터, 금융 데이터 등등 비정형 데이터 수치적으로 확인할 수 없거나 구조를 띄지 않는 데이터를 의미 그림, 소리, 영상 등등 반정형 데이터 정형 데이터와 비정형 데이터의 성격을 두 개 다 가지는 데이터 DICOM, JSON, XML, 스마프톤에서 위치 값을 함께 저장하는 사진 데이터 전처리 데이터를 AI에게 학습시키기 전이나 분석하기 전에 적합한 형태로 가공하는 작업 빅데이터 단순히 많은 양의 데이터를 의미하는 것이 아님. 규모, 속도, 다양성 - 3가지의 특성을 가진다. 규모 - 굉장히 방대한 양의 유의미한 데이터 속도 - 데이터의 생성 및 처리 속도가 매우 빠름 다양성 - 데이터의 종류 뿐만 아니라 형식이 다양하다. 데이터 수집 계획 빅데이터를 구성하기 위해서는 ㅁ여확한 수집 계획이 필요
서경태
TIL 웹개발 - 사고의 전환
프로그래머스 '숫자 문자열과 영단어' 문제를 풀다보니 문제를 해결하는 방식은 주어진대로 하는 것이 아님을 느꼈다. 문제의 내용은 s가 "one4seveneight" 이런식으로 주어지는데 숫자로 올바르게 변환하는 함수를 만드는 것이다. 먼저 나는 문제를 풀기 위해 영단어와 숫자가 일치하는 딕셔너리를 만들었다. 하지만 코드를 적다보니 딕셔너리를 사용하지도 않고 굉장히 단순하고 무식한 방법으로 풀었다. 문자열 s를 하나씩 풀어서 일치하는 조건의 값을 숫자로 돌려주는 함수다. 다른 사람의 문제 풀이를 보니 순서를 바꿔서 푸는 방법도 있었다. 내가 처음 생각했던 것도 딕셔너리로 만들어 s의 일부값이 딕셔너리 키값에 들어있다면 해당 숫자를 반환하는 식이었는데 이 코드는 아예 딕셔너리부터 시작해서 s에 해당하는 값을 찾았다. 그리고 answer를 문자열 그대로 사용해 replace로 키값과 밸류를 치환했다. 내가 항상 리스틀 만들고 그걸 다시 해답에 맞게 조합하거나 조작해서 출력하는 경우가 많은데 시간복잡도면에서 리스트를 사용하지 않는게 더 좋으니 앞으로 다른 방법도 고민해야한다. 딕셔너리의 특성도 잘 알고 있어야 한다. 반복문에서 num_dict.items()는 키-값 쌍을 반환한다. 그래서 key, value를 동시에 추출하는 것도 가능하다. 만약 key만 뽑거나 value만 뽑을때는 .keys / .values 라고 적어줘야 한다.
서경태
TIL 웹개발 - 서버
클라이언트와 서버 클라이언트 요청을 보내는 사용자 서버 클라우드 서버 웹 서버 데이터베이스 서버 어플리케이션 서버 프록시 서버 데이터베이스 테이블 표 열 행 DBMS (데이터베이스 관리 시스템) RDBMS(관계형 데이터베이스 관리 시스템) MySQL PosgreSQL SQLite
서경태
TIL 웹개발 - 소프트웨어 설계
자료 자료구조 데이터를 효과적으로 젖아하기 위해 어떤 논리나 규칙으로 자료를 모안호은 구조 선형 구조 자료간의 관계가 1:1로 순차적으로 나열되어 있는 것 배열 : 메모리상에 연속적인 공간에 데이터를 저장하는 방법 리스트 : 메모리상에 임이의 위치에 데이터를 저장하지만 각 데이터들이 앞뒤 관계를 갖게 하는 방법 스택 : 선입후출 방식의 자료구조. 히스토리 기능을 구현할 때 유용하고 DFS(깊이우선탐색), 후위연산, 백트래킹, 유효성 검사 등 다양한 곳에 사용된다. 큐 : 선입선출 방식의 자료구조. 작업스케쥴링 기능을 구현하거나 BFS(너비우선탐색), 티켓 시스템 등 다양한 곳에서 사용된다. 비션형 구조 자료들 간 관계가 1:N으로 나열되어 있는 것을 의미한다. 그래프: 노드와 간선으로 이루어진 자료구조 무방향 그래프 / 방향 그래프 / 가중치 그래프 트리: 그래프의 한 종류로 싸이클의 구조가 없어야 한다. 이진트리 : 각 부모노드의 자식 노드가 최대 2개인 트리 편향트리 : 한쪽으로만 자식을 갖는 트리 포화이진트리 : 이진트리에서 모든 부모가 2개의 자식노드를 갖는 이진트리 완전이진트리 : 이진트리에서 거의 모든 노드가 채워져 있으며 강한한 제일 왼쪽부터 채워져 있는 이진트리 프로그래밍 기본
서경태
TIL 웹개발 - CS 기초 지식
메인보드 컴퓨터 본체 내부에 위치한, 주회로가 내장된 보드이다. CPU (Central Processing Unit) 컴퓨터의 두뇌 역할을 하는 실질적으로 모든 기능을 수행하는 요소 입력을 받은 명령을 해석/연산 한 후에 결과값을 출력장치로 전달하는 컴퓨터의 주요 부품 GPU (Graphic Processing Unit) 병렬 연산에 특화되어 이전에는 3D 그래픽을 처리하는데 많이 사용했지만 현재는 범용적으로 사용된다. 주기억장치 (RAM) 휘발성 메모리로 컴퓨터를 껏다 키면 메모리가 사라진다. DRAM SRAM 보조기억장치 비휘발성 메모리로 컴퓨터를 껐카 켜도 메모리가 사라지지 않는다. HDD : 물리적인 보조기억장치 SSD : 반도체에 전기 신호를 이용하여 데이터를 적재하는 보조기억장치 OS 운영체제란 사용자가 컴퓨터를 조작 및 제어하고 작업의 편의성을 제공하기 위한 '시스템 소프트웨어'입니다.
서경태
TIL 웹개발 - 재귀함수, 그저 믿음 뿐
정확히 말하면, 머릿속에 함수 실행 순서를 그리려고 하지 말라는 것이다. 이유는 머릿속에서 재귀에 재귀에 재귀에 재귀를 따라가보면 어는 순간 핀트가 나가버리기 때문이다. 그래서 중요한 것은 재귀 함수의 중요한 부분에 초첨을 맞춰 문제를 풀어나가는 것이다. 재귀가 풀리는 4단계 접근법 재귀를 꼭 써야 하는가? 반복 대신 재귀를 써야하는 경우인지 생각해본다. 재귀함수를 사용해서 푸는 문제의 대부분은 반복을 사용해서도 풀수 있다. 복잡한 문제를 더 작은 문제로 쪼개고, 작은 문제를 반복적으로 풀고, 작은 답들을 조합해서 전체 문제를 해결한다. 그리고 일반적으로 성능은 반복문이 재귀함수보다 더 좋다. 그렇기에 꼭 재귀함수를 써야하는지 먼저 체크해본다. 베이스 조건 답을 바로 알 수 있는 가장 간단한 상황을 생각한다. 재귀함수는 무한루프에 빠질 경우가 많다. 그렇기에 베이스 조건을 가장 먼저 만들어야 한다. 베이스 조건에서 무엇을 return 해야할지 헷갈린다면 문제에서 요구한 답의 데이터 타입을 본다. 예시로 주어진 인풋 값을 보고, 답으로 만드는 방법을 생각하면 함수 실행 순서를 떠올린다. 그보다 문제에 초점을 맞춰 베이스 조건을 만들어보자. 분해 베이스 조건에 가까워지도록 인풋값을 조작한다. 예를 들어, n이라는 정수로 함수를 실행한다면, 자기 자신을 호출할때는 n-1을 넣는다. 그래야 재귀함수가 반복하면서 인풋값이 조금식 더 간단해진다. 재귀적 분해라고도 하는데 인풋값을 간단하게 만들어서 문제를 더 작게 만드는 것이다. 이 재귀적 분해에는 패턴이 보이기도 한다. 정수 : 수를 줄여나간다. n-1 or n-2 배열 : 앞의 숫자를 없애 길이를 줄인다. [1, 2, 3, 4] → [2, 3, 4] → [3, 4] 링크드 리스트 : 포인터가 가리키는 다음 노드가 input으로 들어간다.
서경태
TIL 웹개발 - DFS, BFS
DFS(Depth Fisrt Search) 깊이우선탐색으로 말 그대로 연결된 노드 트리를 따라 끝까지 탐색 후 다시 올라와 나머지를 탐색한다. 위와 같은 노드 트리를 탐색한다면 순서는 아마 [0, 1, 3, 4, 2]가 될 것이다. DFS를 재귀함수로 구현한 코드다. 함수에 함수가 쓰여 조건이 달성될 때까지 반복한다. BFS( Breadth First Search) 너비우선탐색으로 노드트리를 위에서 아래로 차례대로 탐색하는 특징을 갖고 있다. DFS와 달리 BFS로 위 노드 트리를 탐색하면 [0, 1, 2, 3, 4]의 순서를 가진다. 코드로 표현하면 아래와 같다. deque를 사용해 탐색할 노드의 맨 앞에서부터 가져오기때문에 아래에서 위로 순차적인 탐색이 가능하다. dfs, bfs의 특징을 이용해 풀 수 있는 문제가 나뉘기도하고 혹은 두 방법으로 동일한 문제를 풀 수도 있다.
서경태
TIL 웹개발 - 리스트(list)와 세트(set)의 시간 복잡도 차이
백준 11725번 문제를 푸는데 계속해서 시간초과로 난항을 겪고 있었다. 이 문제를 풀기 위해 내가 짠 코드는 다음과 같다. 파이참에서 실행시켰을때는 입출력 예제와 똑같이 나왔기에 이제 여기서 줄일 만한 곳을 찾기 시작했다. graph를 딕셔너리로 만들었는데 리스트로 변경하면 좀 더 시간이 줄어들까 싶어 시도했지만 역시나 실패였다. 그후 몇 가지 시도를 하다보니 코드가 아예 틀리기도 했다. 결국 나는 그를 찾아갔다. 거의 솔루션은 간단했다. 리스트(list)를 세트(set)로 변경하는 것이다. 위 코드 중 일부를 보면 입력값을 받아 그래프를 만든 후 부모 노드를 찾기 위해 bfs를 사용했다. def bfs_queue(start): parent = [0] * (n+1) visited = [start] q = deque([start]) while q: node = q.popleft() for adj in graph[node]: if adj not in visited: parent[adj] = node q.append(adj) visited.append(adj) def bfs_queue(start): parent = [0] * (n+1) visited = set([start]) q = deque([start]) while q: node = q.popleft() for adj in graph[node]: if adj not in visited: parent[adj] = node q.append(adj) visited.add(adj) visited는 방문한 노드를 중복 방문하지 않기 위해 만든 리스트다. if문에 인접 노드가 이미 visited에 없다면 아래 코드를 반복해서 실행한다. 이때 if adj not in visited의 시간 복잡도는 O(n)이다. 하지만 visited를 세트(set)로 바꾸면 시간 복잡도는 O(1)이 된다. 리스트와 세트의 연산 차이점을 나타낸 표를 참고해보면, 리스트(list)
서경태
TIL 웹개발 - 파이썬 scope
Scope 파이썬에서 변수의 유효 범위를 말한다. 위치에 따라 작성한 코드가 작동하거나 작동하지 않을 수도 있고 때로는 원하는 대로 값이 안나올 수도 있다. 변수의 위치를 알맞게 작성해야 한다. LEGB rule 이 규칙에 따라 순서대로 작동한다. Local scope 함수 내부에서 선언된 변수나 함수로 그 범위에만 유효하다. Enclosed scope 외부함수에 정의되었지만 내부함수까지 사용된다. 주로 중첩 함수가 정의될 때 사용된다. Global scope 외부에 선언된 변수로 전체적인 범위에 유효하다. Built-in scope 파이썬 설치 파일 안에 바로 내장된 것으로 별다른 선언없이 실행된다. ex) len(), input(), print() 등
👍
1
서경태
TIL 웹개발 - 해시테이블
해시테이블(해시 맵) 키, 밸류 구조로 딕셔너리형태의 자료형 자료를 저장하고 검색하는데 사용하는 중요한 기법 좋은 해시 함수의 조건 해시 함수 값 충돌의 최소화 쉽고 빠른 연산 해시 테이블 전체에 해시 값이 균일하게 분포 사용할 키의 모든 정보를 이용하여 해싱 해시 테이블 사용 효율이 높아야함 로드 팩터 해시테이블에 저장된 데이터 개수 n을 버킷의 개수 k 로 나눈 것 로드 팩터 비율에 따라 해시 함수를 재작성 할지, 크기를 조정할 지 결정한다. 로드팩터가 증가할 수록 해시 테이블 성능은 점점 감소하기에 해시테이블의 공간을 재할당한다. 해시 함수 해시 함수를 통해 키가 해시 값으로 변경되는 과정을 도식화 한 것이다. 윤아와 서현의 값은 해시 함수를 통해 동일한 2를 가지며 충동한 것을 알 수 있다.
서경태
TIL 웹개발 - 알고리즘이란?
파이썬 과정을 마치고 알고리즘과 자료구조에 대한 강의를 시작했다. 알고리즘이란? 같은 문제를 풀더라도 공간적으로 시간적으로 더 효율적으로 풀기 위한 것 시간 복잡도 입력값과 문제를 해결하는데 걸리는 시간과의 상관관계를 말한다. 입력갓이 2배로 늘어났을 때 문제를 해결하는 데 걸리는 시간은 몇 ㅐ로 늘어나는지 보는 것. 공간 복잡도 입력값과 문제를 해결하는데 걸리는 공간과의 상관관계를 말한다. 입력값이 2ㅐ로 늘어났을 때 문제를 해결하는 데 걸리는 공간은 몇 배로 늘어나는지를 보는 것. 점근 표기법 알고리즘의 성능을 수학적으로 표기하는 기법으로 알고리즘의 '효율성'을 평가하는 방법이다. 빅오(Big-O) 표기범 최악의 성능이 나올때 어느정도 연산량이 걸릴지 표기 방법: O(N) N은 얼마나 계산하냐를 말하기 때문에 for문이 한번 있으면 O(N)으로 사용하고 for문이 2개 중첩된 알고리즘은 O(N제곱) 으로 표기한다. 빅 오메가(Big -Ω) 표기법 최선의 성능이 나올때 어느정도의 연산량이 걸릴지 표기 방법: Ω(1) 빅 오메가는 거의 사용하지 않는다. 왜냐하면 보통 최악의 경우를 대비하기때문. 최선은 가장 좋으면 1이지만 최악은.... 상상하기 싫다. 알파벳 찾기 문제
서경태
TIL 웹개발 - flask, request, form
먼저 html에서 form 형태를 작성한다. <form action:'/ 보낼 곳' method = '방식'> action : 어디로 보낼지 정하는 것이다. 파이썬에서 라우트하는 곳으로 설정한게 된다. method : form에서 지원하는 방식은 여러가지가 있는데 보통 get과 post를 사용한다. get은 검색처럼 데이터를 요청할때 사용한다. post는 로그인처럼 정보를 서버에 전달할 때 사용한다. <select name="요청 이름" — — —> <option value ="값"></<option> 부트스트랩에서 사용한 셀렉트 방식으로 가위바위보를 골라서 제출하도록 했다. name : 파이썬이 요청 받을때 여기서 정해진 이름으로 데이터를 받는다. value : name이란 데이터의 값을 말한다. 예를 들어, 가위바위보 게임을 한다면 name은 내가 낼 패를 말하고 value는 가위, 바위, 보 처럼 선택한 값을 말한다. <input button type ='submit'> 버튼을 통해 제출되도록 설정했다. 라우트를 사용해 html의 데이터를 받는다. 위에서 본 action 과 methods를 먼저 써준다. methods는 html에서 post만 사용했는데 왜 둘 다 써야할까? 그 이유는, 사용자가 웹페이지를 처음 방문할 때 기본적으로 get 요청을 통해 페이지를 로딩한다. 따라서 get 메서드를 포함하지 않으면 로딩시 오류가 생길수 있다. get을 사용하지 않더라도 꼭 둘 다 써야함을 기억하자! user_choice = request.form['user_choice'] 로 name과 같은 값을 통해 value값을 매개변수(user_choice 앞에 거)에 지정한다. 이렇게 하면 form은 정상적으로 작동한다.
서경태
TIL 웹개발 - 두 class로 생성한 instance 연결, 공유하는 법
과제 내용을 보면 두 개의 class를 사용한다. 계정을 생성하는 Member 클래스 포스트를 생성하는 Post 클래스 각 클래스로 생성한 인스턴스를 리스트로 만들어 보여주는데 우리는 덧붙여 포스트를 삭제하는 기능을 넣었다. 그냥 __del__(소멸자: __init__과 반대)를 사용하면 되는거 되네 싶었는데, 실제 서비스에선 다른 사람이 내글을 마음대로 지운다면 진짜 개빡칠 것 아닌가? 그래서 아이디와 비밀번호를 기입해 포스트 삭제에 대한 권한을 부여한다. members = [m1, m2, m3] m1 = [name, username, password] Member 클래스로 만든 member 인스턴스와 인스턴스를 리스트로 만든 memebrs다. posts [p1, p2, p3] p1 = [title, content, author] Post 클래스로 만든 post 인스턴스와 인스턴스를 리스트로 만든 posts다. (단, author = username) 두 데이터를 연결시키는 방법은 post의 author 속성에 Member 클래스 인스턴스를 넣는 것이다. 그러면 아래 이미지처럼 사용할 수 있다. 그럼 p1 = [title, content, m1] 형태로 사용할수 있고 p1의 author를 알고 싶다면 p1.author.username을 사용하면된다. 그리고 만약 p1의 비밀번호를 알려면 p1.author.password를 사용하면 된다. elif select == '4': # 게시글 작성 while True: id_input = input("ID를 입력해주세요. ") member_matched = None for member in members: if id_input == member.username: member_matched = member break if member_matched: while True: ps_input = input("패스워드를 입력해주세요. ") if ps_input == member_matched.password: print("게시글을 작성해주세요.") title = input("\n제목: ") content = input("내용: ") posts.append(Post(title, content, member_matched)) print("\n게시글 작성을 완료했습니다.") break else: print("패스워드가 일치하지 않습니다.") break else: print("ID가 존재하지 않습니다. ") 위 코드에선 게시글을 작성할 때, 아이디와 비밀번호를 확인한다. 확인이 맞으면(memebr_matched) 제목과 내용을 기입하고 posts 리스트에 post 객체가 추가되는데 여기서 author에 member_matched를 사용한다. member_matched는 아이디와 비밀번호로 찾은 member 인스턴스이다. elif select == '5': # 게시글 삭제 del_title = input("삭제할 게시글의 제목을 입력하세요. ") post_matched = None for post in posts: if del_title == post.title: post_matched = post break if post_matched: while True: id_input = input("ID를 입력해주세요. ") if id_input == post_matched.author.username: while True: ps_input = input("패스워드를 입력해주세요. ") if ps_input == post_matched.author.password: posts.remove(post_matched) print(f'{post_matched.title}이 삭제되었습니다.') break else: print("패스워드가 일치하지 않습니다.") break else: print("아이디가 일치하지 않습니다.") 이렇게 게시글을 삭제할때, title을 검색해서 삭제할 post를 선택(post_matched라고 정의)하고 username과 password가 일치하면 삭제되는 기능이다. post_matched.author.username = member.username post_matched.author.password = member.password 기억하자. 두 클래스는 인스턴스를 공유할 수 있고 그 방법은 한 인스턴스를 다른 클래스의 속성으로 사용하면 된다.
서경태
TIL 웹개발 - Class 개념 정리
클래스(class) : 클래스는 객체를 생성하기 위한 청사진(설계도)입니다. 클래스는 데이터(어트리뷰트)와 행동(메서드)을 정의합니다. 객체(object) : 객체는 클래스의 인스턴스입니다. 클래스는 객체의 구조와 동작을 정의하고, 객체는 클래스에 정의된 구조와 동작을 실제로 구현한 것입니다. 인스턴스(instance) : 인스턴스는 클래스로부터 생성된 개별 객체를 의미합니다. 각 인스턴스는 독립적인 값을 가지며, 클래스에 정의된 속성과 메서드를 사용할 수 있습니다. 인스턴스 어트리뷰트(속성) : 인스턴스 어트리뷰트는 각 인스턴스마다 개별적으로 저장되는 데이터를 의미합니다. 보통 __init__ 메서드 내에서 정의됩니다. 클래스 어트리뷰트(속성) : 클래스 어트리뷰트는 클래스 자체에 속하는 변수로, 모든 인스턴스가 공유합니다. 메서드(methods) : 메서드는 클래스 내부에 정의된 함수로, 객체의 행동을 정의합니다. 메서드는 첫 번째 인자로 self를 받아 인스턴스의 속성과 상호작용합니다. 상속(inheritance) : 상속은 기존 클래스를 바탕으로 새로운 클래스를 정의하는 것입니다. 새로운 클래스는 기존 클래스의 속성과 메서드를 물려받습니다. 다형성(polymorphism) : 다형성은 동일한 메서드가 다른 객체에서 다르게 동작할 수 있게 하는 것입니다. 이는 주로 메서드 오버라이딩을 통해 구현됩니다. 캡슐화(encapsulation) : 캡슐화는 객체의 속성과 메서드를 외부에서 직접 접근하지 못하게 하고, 객체 내부에서만 접근할 수 있게 하는 것입니다. 보통 접근자와 설정자를 통해 구현됩니다. 추상화(abstraction) : 추상화는 객체의 복잡성을 줄이고, 필요한 부분만 노출하는 것입니다. 이는 추상 클래스를 통해 구현될 수 있습니다.
서경태
TIL 웹 개발 - class 이해하기 init, instance, method
팀프로젝트로 class를 사용하게 되었다. 하지만 class가 대략 미리 만들어놓고 나중에 또 쓰기 위한 거다 정도로 이해하고 있어서 이번 포스팅을 통해 이해해보기로 하자. init 일단, class 코드에 대해 찾아보면 항상 첫번째 함수는 __init__이 나온다. init은 아마 initiail, initiative, initiation 등의 약자로 우선적인 느낌을 가진 함수일 것이다. class 함수에서 init은 생성자(conductor)로 불리며 객체가 생성될 때, 자동으로 호출되는 특별한 메소드다. 좀 더 쉽게 이해하기 위해 역할에 대해 설명하면, 객체 초기화 : 객체가 생성될 때 필요한 초기 설정이나 값들을 초기화하기 위해 사용된다. 위 코드에서 이름과 나이에 대한 정보를 받는 프로그램을 만든다면 처음 데이터를 생성하는 역할을 한다는 것이다. 유연한 객체 생성 : 매개변수를 받아 객체 생성시 다양한 초기값을 설정할 수 있게 해줍니다. 그냥 새로운 객체를 생성할 때 이걸 사용해 쉽게 한다는 것이다. 위 코드 #객체생성 부분에서 보듯 person1 = class(데이터1, 데이터2) 를 넣어주면 바로 생성할 수 있다. 명확한 코드 구조 : class 함수의 기준이 되다보니 코드 구조가 한눈에 보기 쉽게 해준다. 추후 유지보수에도 도움이 된다. instance 인스턴스는 클래스에서 생성된 객체를 말한다. 위 코드에서 보면 person1, person2가 인스턴스에 해당한다. method 메소드는 클래스나 인스턴스에서 호출할 수 있는 함수를 말한다. 인스턴스 메소드 특정 인스턴스와 연관된 메소드로 self 매개변수를 통해 접근하고 조작한다. 위 코드에서 보면 def intoruduce(self): 가 인스턴스 메소드이다. 클래스 메소드 클래스 자체에 연관된 메소드로 데코레이터로 사용된다. 데코레이터는 다음 기회에 알아보자.
서경태
TIL 웹개발 - while 반복문 break, continue 사용하기
개인 과제로 주어진 두 문제 Up&Down 게임 만들기 가위, 바위, 보 게임 만들기 이 두 과제를 하는데 하루를 다 써버렸다... 핵심은 while 반복문 사용하기 사용법은 간단하지만 여러 조건들이 붙으며 구조를 잡는데 꽤나 애를 먹었다. 가장 어려웠던 부분은 게임을 한 차례 진행 후 새로 시작하는 것과 그 기록을 남기는 것. Up & Down 게임 우선 게임 내용은 쉽게 만들었다. 하지만 문제는 랜덤으로 나온 숫자가 코드를 실행할때마다 새롭게 생성이 되어 게임 진행이 안됨 게임을 마치고 다시 시작하는지 혹은 마치는지 + 기록 표시 1번의 문제는 구글링 하다보니 구조적으로 해결이 되었다. x는 컴퓨터가 만든 랜덤 숫자이고 n은 사용자가 입력한 숫자이다. (사실 input을 쓰면 터미널에서 진행할 수 있는지 모르고 처음엔 VS code에서 index.html을 만들었다... request함수 쓰려고...) x가 생성되고 n을 입력하며 힌트를 얻어 맞추면 끝나는데 n을 입력할때마다 x의 값도 바뀌니 게임 진행이 안되었다. 확률을 줄여나가는 게임인데 계속 1/100 확률 게임을 만들어 버린 것. 해결 방법은 x는 외부 while 반복문에 넣고 n은 내부 while 반복문에 위치해서 n = x 조건이 성립 될때까지 n의 변수를 입력하는 것이었다. 그리고 게임이 끝나면 다시 시작할지 그대로 종료할지 되묻는데 이때는 break와 exit()를 사용했다. while 반복문에서 break, continue 그리고 빈칸 break는 while 반복문이 조건을 성립하면 멈춘다. 위 코드의 경우 게임 재시작 의사를 물을 때 y를 누르면 내부 while 반복문이 종료되고 다시 외부 while 반복문이 시작되며 랜덤 숫자가 주어지고 게임이 진행된다. continue는 break과 달리 while 반복문 조건이 성립되면 건너뛰고 이어뛰는 함수다. (예외 처리에 사용 가능할지도?) 빈칸은 조건 성립이 안되었기에 처음부터 다시 도는 것이다. y or n을 고르는 단계에서 a,e,d같은 문자열이 입력될 경우 print("다시 입력해주세요.")라고 하면 y or n 선택 단계로 돌아간다.
서경태
TIL 웹 개발 - from ... import ...
파이썬 강의를 듣던 중 갑자기 궁금한게 생겼다. (난 왜 자꾸 이런거에 꽂히는 모르겠다...) 여러 함수들을 배우는데, request를 사용할 땐, 맨 위에 import requests를 써야 함수가 작동한다. datetime을 사용할 땐, 맨 위에 from datetime import datetime을 써야 함수가 작동한다. 오케이... 이렇게 맨 위에 뭔가를 적어야하는 것은 내장함수가 아니기 때문에 "나 이거 쓸래!" 라고 말해줘야 한다. 근데 왜 어떤건 from을 써야하고 어떤건 그냥 import만 써도되는지 궁금했다. 바로 ChatGPT에 물어봤다. (유료 구독하길 잘했다...) 우선 모듈과 클래스라는 개념이 있다. import 뒤에 오는게 모듈이고 함수를 작성할때 접두사로 사용하는 것이 클래스다. 모듈 내에 클래스가 있어서 모듈을 임포트하고 클래스써서 함수를 사용한다고 이해하면 쉽다. 그럼 이제 from을 왜 쓰느냐? GPT가 대답해준다. 이 모듈은 여러 클래스를 포함하는 모듈입니다. datetime 모듈 내의 datetime 클래스는 특히 자주 사용되기 때문에, 이를 편리하게 임포트하기 위해 다음과 같이 사용합니다: from datetime import datetime 이 방식은 datetime 모듈 내의 datetime 클래스를 직접 임포트합니다. 따라서 해당 클래스를 사용할 때 모듈 이름을 접두사로 사용할 필요가 없습니다. 예를 들어: current_time = datetime.now() 접두사로 datetime을 쓰는데 접두사를 사용할 필요가 없다고 알려준다. ??? 결론부터 이야기하자면, 모듈안에 여러 클래스가 있는 경우! from을 써서 문자열이 길어지는 것을 방지하는 것이다. 비교로 알아보면 좀 더 이해가 빠르다. import datetime(모듈) current_time = datetime(모듈).datetime(클래스).now() from datetime(모듈) import datetime(클래스) current_time = datetime(클래스).now() 이처럼 1번에서는 import만 쓸 경우, datetime 모듈을 쓸거야 라고 말하고 뒤에 datetime 클래스를 쓸거야 라고 해야한다. 반면에 2번처럼 from을 쓰면 datetime 클래스만 쓰면 된다. 앞서 GPT가 알려준 것처럼 datetime 모듈에는 여러 클래스가 있다. 그중 3가지를 써서 시차를 구하는 코드를 작성해보자. from datetime import datetime, timezone, timedelta import datetime utc_time = datetime.now(timezone.utc) print("Current UTC time:", utc_time)
서경태
TIL 웹개발 - 미니프로젝트
팀원을 소개하는 웹페이지 제작 프로젝트를 진행했다. 그 중에서 나는 팀원의 데이터를 정리하고 html에 연결하는 작업을 맡았는데 여러 시행착오가 있었다. SQLalchemy 데이터 베이스를 생성하고 SQLalchemy를 설치. pip install flask-sqlalchemy 이런 식으로 데이터 구조를 짠 후 하나씩 데이터를 채워 넣는데 이 부분이 굉장히 고된 작업이었다. flask shell에서 터미널 형태로 데이터를 넣다보니 한땀한땀 만드는 느낌. 데이터 포맷을 완성하고 다른 팀원이 만든 html과 연결하는 작업을 진행했다. 라우트 @app.route('/') def show_members(): members = Member.query.all() return render_template('index.html', data=members) 라우트 기본구조다. 가장 밑에 index.html로 html과 연결시켜주고. 데이터에 내가 만든 구조를 넣는다. 그럼 html에서 이렇게 {{ data[2].role }}로 표기하면 데이터 값이 나온다. 반복문을 사용해 최대한 노가다를 줄이려했지만 실피했다. 실패 원인은 모르겠다.... 마우스가 호버링하면 나오는 문구때문이지... 폴더 구조 다른 팀원이 만든 html과 css파일을 넣고 데이터베이스와 연결하니 실행이 되지 않았다. 그 원인은 폴더 구조. 아래와 같은 형태로 만들어야한다. gpt 센세가 알려줬다. 내친구 GPT 친구는 아니고 확실히 센세다. 결제해놓고 좀 후회했는데 이제 없으면 아무것도 못한다. 오늘 좀 괴롭혔더니 지혼자 꺼지더라... 그래도 고맙다.
서경태
TIL 웹 개발 - Flask 이해하기
GPT 가라사대 Flask는 Python으로 작성된 마이크로 웹 프레임워크입니다. Flask는 경량화된 웹 프레임워크로, 필요한 최소한의 핵심 기능만을 제공하여 사용자가 필요한 기능을 플러그인 형태로 추가할 수 있습니다. 이해하기 Flask는 2010년에 Armin Ronacher가 만든 웹 프레임워크이다. 이름 자체는 '플라스크' 라는 단어에서 영감을 받아 '작고 가벼운' 이라는 의미를 내포하고 있다. Django와 같은 큰 프레임워크와 대비되며 작은 프로젝트나 간단한 웹 애플리케이션을 빠르게 개발할 수 있는 마이크로 프레임워크다. 예제 from flask import Flask app = Flask(name) @app.route('/') def home(): return () if name == 'main': app.run(debug=True) from flask import flask 에 이어 render templates, request를 주로 사용하고 마지막엔 redirect, url_for까지 사용했다. redirection은 단순히 url만 복사해서 붙여넣기 하면 끝나는 단순한 기능으로 알았는데 그 안엔 여러 세팅들이 필요했다. 구조 @app.route('/') def home(): return () 위 코드를 기본 구조로 괄호 안에 페이지의 이름이 들어간다. 그리고 def 아래에는데이터를 넣고 웹에서 요청하면 데이터가 나올수 있도록 세팅한다. 처음에는 그냥 따라 쓰기만해서 구조가 눈에 들어오지 않았는데 오히려 각 기능들을 달고나니 구조가 조금씩 읽히기 시작했다.