[Django] Django로 API를 만들어보자 (1) - 프로젝트 세팅, 데이터 api화

데구르르·2024년 2월 25일
0

Backend

목록 보기
1/1

Django REST framework의 공식 사이트를 참조하여 만들었다. 하지만 그대로 따라하니 잘 되지 않는 경우도 있어서 따로 정리한다.

1. 가상환경 설정

가상환경이 필수는 아닌 것 같지만 나의 경우에는 가상환경을 세팅하지 않은 상태에서는 Django 프로젝트를 생성할 수 없었다...

파이썬이 설치되어 있다는 가정 하에 진행된다.
콘솔에 python3 -m venv env 를 입력하면 현재 폴더에 env라는 이름의 가상환경이 생성될 것이다.

여기서 주목해야하는 부분은 Scripts 폴더 내에 activate와 deactivate 파일이 있다는 점이다.

2. Django, REST framework 설치

가상환경에 Django를 설치한다. env의 상위 폴더로 이동한 후 아래 명령어를 입력하자.

env/Scripts/activate

경로 앞에 (env)가 붙으면 성공적으로 가상환경이 실행된 것이다. 이 상태에서 아래 명령어로 Django를 설치하자.

pip install Django

api를 만들기 위해서는 django rest framework를 설치해야 한다. 아래 명령어를 입력하자.

pip install djangorestframework

3. django 프로젝트 생성

프로젝트를 만들고 싶은 위치에서 아래 명령어로 django 프로젝트를 만들자.

django-admin startproject 프로젝트_이름

생성된 프로젝트로 이동한 후 아래 명령어로 앱을 생성하자.

python manage.py startapp 앱이름

여기까지 한 후 프로젝트 폴더 안의 settings.py에 가서 INSTALLED_APPS에 아래 코드를 추가하자.

INSTALLED_APPS = [
    ...
    'rest_framework',
    '앱이름',
]

4. 서버 실행

아래 명령어를 입력하면 서버 실행이 된다.

python manage.py runserver

빨간글씨는 일단 무시해도 된다. model migration을 안해서 그렇다.
알려준 주소로 가보면 아래와 같은 창이 뜬다.

🎉성공적으로 django 프로젝트 세팅을 마쳤다🎉

5. model 생성

모델은 데이터베이스와 상호 작용하고 데이터의 구조를 정의하는 역할을 한다.

모델은 models.py에 생성한다.

from django.db import models

class Users(models.Model):
    user_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)
    loc = models.ForeignKey(Area, on_delete=models.RESTRICT, related_name='location', db_column='loc')

필드는 db프로퍼티와 동일하게 설정한다. pk, fk도 고려해야 한다!

  • String은 CharField()를 사용한다.
    ⚠️ 주의 - max_length를 꼭 정의해줘야 한다.
  • Int는 IntegerField(), Float는 FloatField()를 사용한다. 디폴트값을 정하고 싶으면 괄호 안에 default=값 을 넣어주면 된다.
  • primary key: 대부분 자동생성되게 설정하기 때문에 AutoField()를 사용하고, 괄호 안에 primary_key=True를 넣어 pk임을 정의하자.
  • foreign key: ForeignKey()를 사용해 정의된다.
    ✨ 필수 인자는 3가지로 참조하는 테이블 이름, 삭제시 제약 (constraints), 역참조시 사용할 이름을 넣어야 한다.
    db_column은 이미 만들어놓은 데이터베이스에 모델을 연결할 경우 필수로 넣어야 한다. 필드와 일치하는 db 프로퍼티의 이름을 넣어주면 된다.

데이터베이스 구축을 안 했을 경우 model만 생성하면 sqlite로 데이터베이스가 만들어진다!

만약 이미 구축된 데이터베이스가 있다면:
1. settings.py의 DATABASE에서 데이터베이스와 django 프로젝트를 연결해야 한다. 기본은 프로젝트 내의 sqlite3 파일과 연결되어 있으므로 현재 사용중인 DB의 정보를 넣어주자.
2. class Meta에서 managed=False를 추가하고 db_table에 연결되는 데이터베이스 테이블 이름을 넣자.

아래는 이미 구축된 데이터베이스와 연결한 모델 클래스의 완성본이다. 이걸 각 테이블별로 만들면 된다 🤗.

from django.db import models

class Users(models.Model):
    user_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)
    loc = models.ForeignKey(Area, on_delete=models.RESTRICT, related_name='location', db_column='loc')
    
    class Meta:
            managed = False
            db_table = 'admins'

모델을 다 만들었으면 데이터베이스와 모델을 동기화해야한다. 아래 명령어를 입력하면 데이터베이스에 변화가 생길 것이다.
python manage.py makemigrations snippets
python manage.py migrate snippets

6. Serializer 생성

serializer는 모델을 json화해준다. restframework 라이브러리에서 제공하기 때문에 import해서 사용하면 된다. serializer에서 model에서 정의하지 않은 필드를 추가해서 json화할 수도 있다.

serializer.py 파일을 생성해서 아래와 같이 코드를 작성해보자.

# serializer.py
from rest_framework import serializers
from .models import Users

class UsersSerializer(serializers.ModelSerializer):
    class Meta:
        model = Users
        fields = '__all__'

이런 형식으로 각 모델별 serializer를 만들면 된다.

7. views 생성

views는 데이터를 어떻게 화면에 나타낼지를 정의한다. view.py에서 다음과 같이 코드를 작성해보자.

from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.parsers import JSONParser
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer

@csrf_exempt
def user(request):
    if request.method == 'GET':
        snippets = Users.objects.all()
        serializer = UsersSerializer(snippets, many=True)
        return JsonResponse(serializer.data, safe=False)

    elif request.method == 'POST':
        data = JSONParser().parse(request)
        serializer = UsersSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, status=201)
        return JsonResponse(serializer.errors, status=400)

restframework 공식문서의 코드인데, 요청이 GET일 경우 Users 모델의 모든 데이터를 json 형태로 화면에 나타내고, POST일 경우 데이터를 추가하는 코드이다.

url에서 parameter를 받아와서 해당하는 데이터만 화면에 보이게 할 수 있는데, 이건 포스트를 따로 작성할 예정이다! (일단 데이터가 잘 보이게 하는 것에 집중하자)

8. 각 테이블에 해당하는 url 생성

프로젝트 구조가 이런 형태일 것이다. 앱 폴더에서 urls.py 파일을 만들자.

├─griffin   // 프로젝트 이름
│  └─__pycache__
└─griffin_flight  // 앱 이름
    ├─migrations
    │  └─__pycache__
    └─__pycache__

프로젝트 폴더 내에 있는 urls.py는 상위 url이고, 앱 폴더 내에 있는 urls.py는 하위 url을 정의하는 곳이다.

프로젝트 폴더 내의 urls.py에서 아래 코드를 넣자.

from django.urls import path, include

urlpatterns = [
    path('/griffin', include('앱이름.urls')),
]

앱이름에 본인의 앱 이름을 넣으면 된다. 나의 경우는 griffin_flight이다. 경로에 아무것도 넣지 않아도 되고, 넣어도 된다. 위 코드의 경우 https://localhost.127.0.0.1:8000/griffin/ 형태로 url이 만들어질 것이다.


앱 폴더 내의 urls.py에서 아래와 같이 코드를 넣자.
from django.urls import path
from . import views

urlpatterns = [
    path('users/', views.user),
]

https://localhost.127.0.0.1:8000/griffin/ 에서 세부 url을 정의하는 것으로, user 데이터에 접근하기 위한 url을 정의했다. 위 코드로 생성된 url은 다음과 같은 형태이다: https://localhost.0.0.1:8000/griffin/users

9. 서버 실행 후 url 접속

프로젝트 폴더로 이동 후 다음 명령어로 서버를 실행하자.

python manage.py runserver

만약 로컬서버가 아닌 상황에서 위 명령어로 실행이 안 된다면 python manage.py 0.0.0.0 runserver로 서버를 실행해보자.

이후 정의한 url에 접속하면 데이터가 잘 보일 것이다 🎉🎉🎉

회고

api를 만들고 싶었는데 많은 자료들이 웹서버 구동을 위한 것이어서 참고자료를 찾기 어려웠다. 시작할때 조금 헤맸어서 과정을 꼭 정리해둬야겠다고 생각했다.

profile
개발 기록

0개의 댓글