작성자 | 성창민 |
일 시 | 2024. 4. 11 (목) 18:00 ~ 21:00 |
장 소 | 복지관 b128-1호 |
참가자 명단 | 임혜진, 이재영, 성창민, 김명원, 장원준 |
사 진 |
질문 등록 기능 만들기.
먼저 질문 등록하기 버튼을 만들겠습니다.
question_list.html 파일 마지막 부분에 질문 등록하기 버튼을 추가했습니다.
pybo:question_create 별칭에 해당되는 URL이 호출될 것입니다.
이제 pybo:question_create 별칭에 해당되는 URL 매핑 규칙을 추가하겠습니다.
views에 있는 question_create를 호출할 것입니다.
이제 question_create 함수를 만들어 보겠습니다. 그 전에 폼에 대해서 먼저 알아보겠습니다.
폼이란 페이지 요청 전달되는 파라미터들을 쉽게 관리하기 위해 사용하는 클래스입니다.
필수 파라미터의 값이 누락되지 않았는지, 파라미터의 형식은 적절한지 등을 검증할 목적으로 사용합니다.
질문 등록시 사용할 QuestionForm을 만들면서 자세히 알아보겠습니다. QuestionForm을 forms.py 파일에 작성합니다.
QuestionForm은 모델 폼(forms.ModelForm)을 상속했는데, 이때 모델 폼은 모델과 연결된 폼으로 폼을 저장하면 연결된 모델의 데이터를 저장할 수 있는 폼입니다. 모델 폼은 이너 클래스인 Meta 클래스가 반드시 필요합니다.
Meta 클래스에는 사용할 모델과 모델의 속성을 적으면 됩니다. 우리는 Question 모델의 subject와 content를 사용할 것이므로 위와 같이 작성하면 됩니다.
이제 다시 뷰 함수를 작성해 보겠습니다.
views.py에 가서 아래와 같이 작성합니다.
아까 만든 폼을 사용합니다.
render 함수에 전달한 {'form': form}은 question_form템플릿에서 질문 등록시 사용할 폼 엘리먼트를 생성할 때 쓰입니다.
이제 템플릿을 작성해 보겠습니다.
위에서 질문 등록 시 사용했던 question_form 템플릿입니다.
{ { form.as_p }}는 폼에 정의한 subject, content 속성에 해당하는 HTML 코드를 자동으로 생성해줍니다.
또한 이 폼을 질문 수정에서 또 사용할 것이기 때문에 action을 POST로 지정하지 않고 비워둡니다.
여기까지 했다면 질문 등록 버튼이 만들어 집니다.
그러나 아직 question_create 함수에 데이터를 저장하는 코드를 작성하지 않았기 때문에 저장이 되지 않습니다.
question_create 함수를 수정해 보겠습니다.
같은 URL 요청을 POST인지, GET인지에 따라 다르게 처리합니다.
질문 등록하기 버튼을 클릭하면 /pybo/question/create/ 페이지가 GET 방식으로 요청되어 question_create 함수가 실행됩니다. 그리고 질문을 등록하는 화면을 렌더링 합니다.
그리고 질문 등록 화면에서 subject, content 항목에 값을 기입하고 저장하기 버튼을 누르면 /pybo/question/create/ 페이지를 POST 방식으로 요청합니다. 그리고 이와 같이 QuestionForm을 생성하면 내부 속성에 자동으로 저장되어 객체가 생성됩니다. 그리고 form.is_valid()는 form이 유효한지를 검사합니다.
이제 질문이 잘 등록됩니다.
앞으로는 백엔드쪽 스택을 쌓기 위해 Django REST Framework를 학습해 볼 것입니다.
Django REST Framework 에 대해서 먼저 알아보겠습니다.
RESTful API (Representational State Transfer)는 HTTP 요청을 사용하여 데이터에 액세스하고 사용하는 응용 프로그램 프로그래밍 인터페이스(API)의 아키텍처 스타일입니다. API는 서버에서 데이터를 검색하거나 데이터를 업데이트하거나 저장하기 위해 데이터를 보낼 수 있습니다. REST의 원칙을 따르는 API는 종종 'RESTful'이라고합니다. 웹 개발의 맥락에서 RESTful API는 웹 애플리케이션이 서로 상호작용할 수 있는 인터페이스를 생성합니다. 이를 통해 서로 다른 소프트웨어 시스템이 표준 HTTP 메서드(GET, POST, PUT, DELETE 등)를 사용하여 HTTP를 통해 통신하고 데이터를 교환할 수 있습니다. 요약하자면, RESTful API는 프론트엔드와 백엔드 간의 계약 역할을 하며, 클라이언트가 데이터를 요청하는 방법과 서버가 이러한 요청에 응답하는 방법을 정의합니다. 이 추상화는 프론트엔드와 백엔드 개발이 상호 독립적으로 진행될 수 있도록 해줍니다. 단, 양쪽 모두 합의된 API 구조를 준수하는 한입니다.
따라서 앞으로 프론트엔드에서 보낸 데이터들을 받아 사용해야 하기 때문에 REST API의 구조를 익혀 이를 원활히 사용할 수 있도록 해보겠습니다.
먼저 이 DRF의 주요 기능을 살펴보겠습니다.
DRF 주요 기능
Django REST Framework (DRF)은 RESTful API를 구축하기 위한 강력한 도구로써 다양한 기능을 제공합니다. Django REST Framework의 주요 기능은 다음과 같습니다:
1. 직렬화: DRF는 복잡한 Python 객체를 JSON 또는 다른 콘텐츠 유형으로 변환하기 위한 견고한 직렬화 프레임워크를 제공합니다. 직렬화기를 정의하여 API 응답에서 데이터가 표시되는 방식과 들어오는 데이터가 처리되는 방식을 제어할 수 있습니다.
2. 인증과 권한: DRF는 토큰 기반 인증, 세션 인증, OAuth 등 다양한 인증 체계를 제공하여 API를 보안합니다. 또한 사용자 역할과 권한에 기반하여 리소스에 대한 액세스를 제어하는 유연한 권한 시스템을 제공합니다.
3. 뷰셋과 라우터: DRF는 뷰셋이라는 개념을 도입하였습니다. 뷰셋은 단일 모델 또는 리소스에 대한 여러 개의 뷰를 결합하는 클래스입니다. 뷰셋은 생성, 조회, 업데이트, 삭제(CRUD) 등의 작업을 쉽게 수행할 수 있도록 지원합니다. DRF는 뷰셋에 대한 URL 라우팅을 간소화하기 위해 자동으로 URL 패턴을 생성하는 라우터를 포함하고 있습니다.
4. Browsable API: DRF는 Browsable API 기능을 제공하여 개발자가 웹 브라우저를 통해 API와 상호 작용할 수 있도록 합니다. 이 기능은 API의 사용자 친화적인 HTML 표현을 제공하며, 요청 제출을 위한 양식, 엔드포인트 간의 탐색, 페이지네이션 지원 등을 포함합니다.
5. 페이지네이션: DRF는 대량의 데이터셋을 페이지별로 나누어 API 성능을 최적화하고 사용자 경험을 향상시키기 위한 기능을 내장하고 있습니다. 커서 기반 페이지네이션, 페이지 번호 기반 페이지네이션 및 사용자 정의 페이지네이션 옵션과 같은 다양한 페이지네이션 전략을 제공합니다.
6. 필터링과 정렬: DRF는 쿼리 매개변수를 사용하여 API 쿼리셋을 쉽게 필터링하고 정렬할 수 있도록 지원합니다. 완전히 일치하는, 부분 일치하는, 대소문자를 구분하지 않는 등의 일반적인 필터링 작업에 대한 필터 백엔드를 제공합니다. 또한 DRF는 여러 필드를 기준으로 정렬하고 사용자 정의 정렬 옵션을 지원합니다.
7. 콘텐츠 네고시에이션: DRF는 콘텐츠 네고시에이션을 지원하여 클라이언트가 JSON, XML 또는 HTML과 같은 다른 형식으로 데이터를 요청할 수 있도록 합니다. API는 클라이언트의 요청에 따라 적절한 콘텐츠 유형을 자동으로 결정할 수 있습니다.
8. 직렬화 유효성 검사: DRF는 직렬화 유효성 검사 기능을 제공하여 들어오는 데이터가 직렬화기에서 정의한 데이터 유형, 필드 제약 조건 및 유효성 검사 규칙을 준수하는지 확인할 수 있습니다.
9. 버전 관리: DRF는 API 버전 관리를 지원하여 다양한 API 버전을 관리하고 역호환성을 처리할 수 있도록 합니다.
10. 테스트 프레임워크: DRF는 API 테스트를 간소화하기 위해 테스트 클래스와 유틸리티를 제공하는 테스트 프레임워크를 제공합니다. 이를 통해 API 테스트를 생성하고 요청을 시뮬레이트하며 응답을 유효성 검사할 수 있습니다.
지금까지 Django 의 기본 요소를 익혀보았습니다.
기본 요소를 사용해보니 Django의 MTV구조에 익숙해질 수 있었습니다.
앞으로는 백엔드쪽 스택을 쌓기 위해 Django REST Framework를 학습해 볼 것입니다.
Django REST Framework의 기능을 살펴보니 앞으로 프로젝트에 있어서 꼭 필요한 기능이라는 것을 알 수 있었습니다.