[TIL] CRUD (2)

Hailee·2020년 12월 2일
0

[ TIL ]

목록 보기
24/40
post-thumbnail

API 서버 만들기

  • 화면정보를 주는 것이 아닌, 화면 구성에 필요한 데이터를 주는 것!

백엔드의 주요한 역할, 웹브라우저를 구성하는데 필요한 데이터를 잘 주고받을 수 있도록 하는 것!
java에서 DAO에 담아서 사용하였다면, dJango/python에서는 views.py를 통해 로직을 작성해서 주고받는다.

지금까지 접한 아이들의 대략적인 역할은?

  • models.py
    : DB와 소통하기 위한 파일
    테이블 생성, 추가, 삭제 등의 관리를 할 수 있다.
  • urls.py
    : 경로를 설정해주는 파일
    웹 브라우저 내에서 접속할 경로를 설정한다.
    application, 최상위 프로젝트의 작업 경로를 지정해줄 수 있다.
  • views.py
    : 기능 구현을 위한 로직을 작성하는 파일
    내가 처리하고 싶은 로직을 해당 파일 내에 메서드를 선언해서 작업한다.
    get(), post, put, delete
  • manage.py
    : 사이트 관리를 도와주는 스크립트
    다른 설치 작업 없이 웹 서버를 구동할 수 있다
    migrate 작동도 함!
  • settings.py
    : 웹사이트 설정이 있는 파일
    해당 파일 내에 웹 프로젝트 관련 설정을 할 수 있다
    DB연동, 접근허용하는 ip 주소, 등..

1. httpie 설치하기

  • 프로토콜을 이용할 수 있도록 해주는 도구
  • http 웹 서비스 송, 수신을 해볼 수 있는 도구!

2. 가상환경 세팅하기

conda -n
conda activate
pip install django
pip install mysqlclient

app 생성하기

app 생성하고 파이썬 파일들을 수정해주자 (안하면 에러남!)

./manage.py startapp user
  • settings.py 파일 내 INSTALLED_APPS 수정하기
  • urls.py 내 urlpatterns 수정하기 (경로에 대한 것을 담당)
    : settings.py에서 주석처리 해준 부분은 같이 주석처리 해주어야 runserver 시 에러나지 않음!

views.py(동작에 대한 것 담당)


코딩 시작!

1) GET 메서드

1. models.py 작성

class Category(models.Model):
	name = models.CharField(max_length=20)
    
    class Meta:
    	db_table = 'categories'

Q. Meta 클래스 정보를 주는 이유는?

  • 지금까지는, application명 + models.py 내 작성한 클래스명으로 테이블 이름이 자동으로 생성되었는데,
    위와 같이 Meta 클래스 정보를 주면 내가 설정한 이름으로 테이블을 생성할 수 있기 때문!

2. views.py 작성

  • 화면 그려주는 로직 처리, 렌더링
  1	import json
  2 from django.views import View
  3 from django.views import JsonResponse
  • json 형식으로 프론트와 통신하는데, dictionary 자료구조만이 json으로 바로 변환이 가능하다.
    getAll()메서드를 사용하면 딕셔너리 형태로와서 바로 쓸 수 있어서 편하지만,
    다양한 연습을 위해 all()메서드를 사용한 뒤, response 구간에서 자료구조를 바꾸어 주도록 하자!
 import json
 from django.http        import JsonResponse

 from django.views       import View
 from products.models    import Category, Drinks

 # Create your views here.
 class CategoryView(View):

     def get(self, request):
         categories_data = Category.objects.all()
         categories = []
         # Drinks_data = Drinks.objects.all()
         for i in categories_data:
             categories.append({
                 "name" : i.name,
                 "menu_id": i.menu_id
             })
         print(categories)

우선은 print만 사용해서 값이 넘어오는지 확인해보기!

3. urls.py 작성

  1. products/urls.py
from django.urls        import path
 from products.views      import CategoryView

 urlpatterns = [
     path('/category', CategoryView.as_view()),
 ]

우선, 내가 작업하고있는 application의 경로를 잡아주기!
url 규칙을 지키면서 작성해주는게 편하다.
주소의 가장 마지막이 될 곳에는 slash 금지..!

  1. westarbucks/urls.py
#from django.contrib import admin
 from django.urls import path, include

 urlpatterns = [
     path('products', include('products.urls')),
 ]

이제 최상위 프로젝트 폴더 내의 urls.py에서 경로 잡아주기
해당 urls.py에 적힌 경로는 가장 최상위 경로이기 때문에, slash 를 붙여주지 않는다.
혹시라도 slash를 붙여줄 경우, 하위 경로의 slash와 중첩되어 경로 오류가 나기 때문이다

4. httpie로 검사하기


products/views.py 내 print() 함수만 작성해두었기 때문에
httpie 상에서는 에러가 뜨지만, 내 콘솔에는 가져온 값이 dictionary 형태로 보인다

from products.models    import Category, Drinks

 # Create your views here.
 class CategoryView(View):

     # 가져오는 것
     def get(self, request):
         categories_data = Category.objects.all()
         categories = []
         # Drinks_data = Drinks.objects.all()
         for i in categories_data:
             categories.append({
                 "name" : i.name,
                 "menu_id": i.menu_id
             })
         return JsonResponse({'data':categories}, status=200)

이제 리턴값, 메세지를 주고, 다시 시도를 해 보면

httpie 상으로 출력되는 데이터를 확인할 수 있다. 👆🏻👆🏻


2) POST 메서드

models.py는 위와 동일한 조건에서 진행!
우리에게 중요한건 views.py 내 로직이니까 ><

1. views.py에 넘어오는 데이터 확인 로직 작성

    # 입력받는 것
     def post(self, request):
         data = json.loads(request.body)
         print(data)

우선 views.py 내 http에게서 입력받은 json 데이터를 출력하는 post 메서드 관련 로직을 작성한 뒤
httpie로 데이터를 넘기면서 테스트해보자!

2. httpie로 넘겨받는 데이터 테스트하기


콘솔을 확인해보니, 넘어오는 데이터는 있는데
관련 POST 처리 로직이 없으므로 500에러가 나는 상황!

3. views.py 작성

     # 입력받는 것
     def post(self, request):
         data = json.loads(request.body)
         Category.objects.create(name=data['name'], menu_id=data['menu_id'])

         return JsonResponse({'message' : 'SUCCESS'},status=200)

이제 진짜로 POST 처리 로직을 적어보자
물론 나중에는 try, catch, exception 다 작성 해주어야하는데 우선 간략하게 테스트!

이 때 null 허용하지 않는 컬럼의 경우, 잘 확인하고 넘겨주어야 한다. 넘겨받는 값이 없으면 null 관련 에러가 납니당 ㅎㅅㅎ
(특히 외래키 주의)

4. httpie로 검사하기


입력한 값이 무사히 잘 넘어가는 것을 확인할 수 있다.


DB 확인해보면 무사히 넘겨받은 값이 insert 되어있는 것을 확인할 수 이쎠!!! ><

profile
웹 개발 🐷😎👊🏻🔥

0개의 댓글