일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- resful
- migrate
- djangorest
- 웹
- virtual environment
- 서버설계
- migrations
- restapi
- 파이썬
- 장고
- http
- restfulapi
- REST
- url
- server
- 사용자인증
- 환경분리
- secretkey
- SOAP API
- API
- web
- django 시간 설정
- rest framework
- 서버 만들기
- 서버구동
- 환경설정하기
- 분리설정
- Django
- restful
- PYTHON
- Today
- Total
grape
Django로 RESTful API 서버 설계하기 (4) 본문
개발환경
window + Python 3.8 + PyCharm
목표
Django rest framework 튜토리얼 학습
간단한 주소록 구현
Serializers란 ?
튜토리얼 소스를 보면 Serializer가 있는데 이 Serializer란 기존 Django를 이용한 웹 개발에서 Django ORM의 Queryset은 Django template로 넘겨지며 HTML로 렌더링 되어 Response로 보내지게 된다. 하지만 JSON으로 데이터를 보내야 하는 RESTful API는 HTML로 렌더링 되는 Django template를 사용할 수 없다. 그래서 Queryset이 내포된 JSON으로 매핑하는 과정을 거쳐야 하는데, 이 작업을 Serializer가 하게 된다.
즉, Queryset과 모델 인스턴스와 같은 복잡한 데이터를 JSON, XML 또는 다른 콘텐츠 유형으로 쉽게 변환할 수 있다.
받은 데이터의 유효성을 검사한 다음, JSON, XML 또는 다른 콘텐츠 유형으로 형 변환할 수 있도록 Serialezeation을 제공하는 것
- 추가설명
데이터베이스에 생성된 User란 데이터 정보가 있을텐데 그것은 컬럼이기 때문에 string으로 데이터를 빼왔을때 JSON으로 보내주기 위해서는 JSON 덤프 같은 JSON 라이브러리를 사용해야 하는데 Django rest framework 안에서는 Serializer라는 것을 제공해서 특정 모델의 어떤 필드를 명시를 하면 그 데이터를 JSON형식으로 바꿔주는 것이다.
- 샘플 소스에 User 라는 Model이 있는데 이것은 Django를 이용해서 Project를 처음에 만들게 되면 기본적으로 생성되는 Model 이다.
- 이 User라는 Model 안에 id, pw, email, url, is_staff 등등의 컬럼들이 존재하는데 그 여러가지 컬럼들 중에서 url, username, email, is_staff 컬럼들 만 JSON 형태로 만들기 위해 지정한 것이다. 즉, 원래는 컬럼이 더 많지만 4개의 컬럼만 Serializer로 사용하겠다 미리 정의를 해둔 것
UserViewSet 같은 경우에는 실제적으로 "로컬주소/users/" 경로로 GET을 호출하면 UserViewSet 가 실행이 되는데
Queryset를 지정하고 JSON 형태로 응답을 주기 위해 해당 Queryset에 위에 작성한 Serializer인 UserSerializer를 지정해 준 것
- queryset = User.objects.all() <= 이란 User 모델안에 들어있는 objects(객체)들 모두를 queryset에 담는 코드 이다. .all() <= 이 부분이 객체 모두를 뜻하는것
- 객체 전체를 queryset에 담고 Serializer를 지정해 줌으로써 Serializer에서 지정한 fields만 JSON 형태로 변경 돼서 전달 된다.
- 보여주는 방식은 Serializer로 지정 된 것
- 여기까지가 튜토리얼 코드 분석 및 학습
- TIP
개발 공부를 하다 보면 MVC 모델이라는 말을 자주 듣게 된다. 이는 Model, View, Controller라는 디자인 패턴인데, 데이터 모델과, 화면에 보이는 뷰, 그리고 데이터를 가공하고 처리하는 컨트롤러 영역으로 나누어서 프로그램을 설계하는 방식이다. 하지만 Django는 조금 다르다. Django 에서는 MVT 패턴이라고 부르며 이는 Model, View, Template라고 한다 일단 Model 은 똑같은 개념이다. 대신 Django에서의 View는 MVC 패턴에서의 Controller 역할 즉, 데이터를 가공하고 처리하는 역할을 한다. 그리고 Template에서 MVC 패턴에서의 View 역할, 화면에 보이는 뷰 부분을 담당한다.
- 튜토리얼에서 샘플로 준 코드는 Model, View, Contrller를 한곳에 만든 코드이다. (빠르게 테스트 해보기 위해) 실제로는 튜토리얼 의 샘플 코드 처럼 한곳에 MVC 를 한곳에 작성하면 안돼고 Django 프로젝트 또한 이런식으로 구성 되어 있지 않다.
주소록 만들기
1. App(앱) 생성
주소록 기능을 만들기 위해 가장 먼저 app를 만들어 준다. 앱 설치는 터미널에서 "python manage.py startapp app이름" 을 입력하면 된다. Django는 app 단위로 프로젝트를 관리하기 때문에 새로운 서비스가 있으면 app를 하나 만드는게 좋다. 그리고 app를 만들고 나서는 app를 settings.py => INSTALLED_APPS에 app를 명시해 준다.
- app를 만들고 나서 INSTALLED_APPS에 등록하지 않고 실행 및 사용할 시 에러 발생
2. 모델 생성
모델 소스는 간단하게 이름, 핸드폰 번호, 주소, 생성 날짜 필드를 만든다. 각 필드는 models.XXXX를 이용해 데이터 타입을 정의한다. pk를 지정하지 않으면 id라는 필드가 자동으로 생기며 pk역할을 하게 된다.
- 모델을 만든 후 가장 먼저 migration 해주는게 좋다. 현재 app를 새로 만들고 모델을 만들었는데 이게 현재 소스코드에만 있기 때문에 이것을 DB에 만들어야 한다 (DB에 등록)
- 변경 사항 (모델 생성 및 app 생성)을 먼저 migrations 한 뒤 migrate로 등록 하면 된다.
3. Seralizer 생성
시리얼라이저(serializer)는 Django에서 기본적으로 생성되는 .py 파일이 아니다. 따라서 serializers.py 파일을 새로 생성한 다음 models.py에서 만든 Addresses 모델을 가져 온다. 그 다음 Serializer를 만드는데, class Meta에 사용할 모델이랑 사용할 필드를 적으면 끝이다. 이제 이 Serializer는 객체 데이터를 넣으면 name, phone_number, address 필드만 JSON으로 바꿔서 출력해주는 역할을 하게 된다.
4. View 생성
addresses/views.py
from django.shortcuts import render
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.parsers import JSONParser
from addresses.models import Addresses
from addresses.serializers import AddressesSerializer
@csrf_exempt
def address_list(request):
if request.method == 'GET':
query_set = Addresses.objects.all()
serializer = AddressesSerializer(query_set, many=True)
return JsonResponse(serializer.data, safe=False)
elif request.method == 'POST':
data = JSONParser().parse(request)
serializer = AddressesSerializer(data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400)
address_list는 주소록 전체를 조회(GET)하거나 신규 주소를 생성(POST)하는 역할을 하게 된다. 함수 안에 if문을 통해 올라온 요청이 GET or POST 인지 구분하기 때문에 GET이면 전체 조회, POST면 신규 데이터 생성 역할을 하게 된다.
GET으로 조회 시 Address.object.all()로 DB안에 저장되어 있는 모든 Addresses의 객체를 읽어 온다. 이 읽어온 객체를 이전에 만든 Serializer안에 넣으면 JSON 형태로 반환 된다. 그리고 return 으로 JsonResponse으로 serializer.data를 파라미터 값으로 작성해 주면 된다. POST로 생성 시 JSON Parser를 통해 request를 읽어 오는 코드가 있는데, POST는 Create기능이기 때문에 만들어야 하는 객체 데이터를 담아서 올라온다. JSON형태로 올라오기 때문에 request에서 데이터를 뽑아 오기 위해 JSON Parser를 사용한 것이다. 이렇게 파싱한 데이터를 Serializer에 넣는다. 그럼 Serializer에서 선언했던 모델, 필드와 비교해서 일치하면(is_valid)이면 save()를 통해 객체를 생성한다. 틀리면 에러(400)를 출력한다.
5. URL 생성
간단하게 구현하기 위해 addresses에 따로 urls.py 파일을 만들지 않고 메인 폴더(restapi_django)안에 생성되어 있는 urls.py에서 기존의 튜토리얼 코드를 삭제하고 현재 만들고 있는 addresses app에 맞춰서 url을 설정해 준다.
6. 테스트 실행
Insomnia를 이용해서 저번에 했던거 처럼 GET 으로 설정한 뒤 "http://127.0.0.1:8000/addresses/"를 입력하고 요청을 보내면 아무것도 없는 "[]" 응답을 볼 수 있다. 이건 정상적이다 왜냐면 아직 데이터가 없기 때문에 아무것도 안나오는 것 !
- 생성
데이터 생성(POST)을 하기 위해서 요청 방식(Method)를 POST로 변경한 뒤 Body 부분을 클릭하여 JSON 으로 변경한다.
그 후 serializer 지정한 모델과 fields에 맞게 데이터를 설정 한 뒤 Send(요청)을 보내면 데이터가 정상적으로 생성 되어 응답이 돌아오는 것을 확인할 수 있다.
- 조회
데이터를 여러개 생성한 후 다시 GET요청으로 변경한 뒤 "http://127.0.0.1:8000/addresses/"를 입력하고 요청하면 주소록(데이터) 전체가 조회 되어 응답이 돌아오는 것을 확인할 수 있다.
- 해당 글은 유튜브 mychew__ 님의 채널의 동영상을 보고 학습 및 정리한 글 입니다.
참고
https://www.youtube.com/watch?v=lKDw_xqo-Ro&t=1350s
'웹 프로그래밍 > Django' 카테고리의 다른 글
[Django 01] - 동작 원리 및 기본 설정 (0) | 2021.05.27 |
---|---|
Django로 RESTful API 서버 설계하기 (5) (0) | 2021.05.24 |
Django로 RESTful API 서버 설계하기 (3) (0) | 2021.05.20 |
Django로 RESTful API 서버 설계하기 (2) (0) | 2021.05.13 |
Django로 RESTful API 서버 설계하기 (1) (2) | 2021.05.11 |