[Django] 장고로 MySQL에 있는 데이터 웹상에서 보여주기

업데이트:

장고로 MySQL에 있는 데이터 웹상에서 보여주기

참고 링크

DB

백엔드

프론트엔드

1. 실습 준비

1.1. rest_framework 설치

본 예제는 맥OS 환경에서 실행했습니다.

이번 실습에서는 장고의 API 기능을 사용할 것이므로 다음과 같이 djangorestframework을 설치해줍니다.

$ pip install djangorestframework

1.2. 테스트 프로젝트 생성

이번 실습을 위해 간단한 App을 생성해보겠습니다.

$ python manage.py startapp test01

1.3. settings.py 수정

이제 test01이라느 앱을 생성했고, 앞서 djangorestframework도 설치했으니 다음고 같이 settings.py파일에 INSTALLED_APPS부분에 추가해줍니다.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'test01',
    'rest_framework',
]

1.4. models.py 위치 이동

앞선 포스팅에서 만들어 최상위 폴더에 두었던 models.py를 test01/models.py로 이동시킵니다. 당연히 기존에 존재하던 test01/models.py는 삭제됩니다.

2. 특정 테이블의 데이터 모두 읽어들이기

2.1. test01/serializers.py 파일 생성

test01 앱 내부에 serializer.py 파일을 생성하고 다음고 같이 코드를 작성해줍니다. 이때 serializers란 데이터 직렬화를 의미하는데, 쉽게 말하면 DB에서 불러온 데이터를 json으로 보여주기 위해 가공하는 기능을 한다고 보면 됩니다.

from rest_framework.serializers import ModelSerializer
from .models import Test01

class TestDataSerializer(ModelSerializer):
    class Meta:
        model = Test01
        fields = '__all__'

위 코드에서 두번쨰 줄을 보면 .models는 현재 폴더(test01) 내부에 있는 models.py를 의미합니다. 그리고 Test01models.py에 존재하는 테이블 클래스 의미합니다.

2.2. test01/views.py 파일 수정

이제 화면단을 만들어보겠습니다. test01 디렉토리 내에 있는 views.py을 다음과 같이 수정합니다.

from rest_framework.response import Response
from rest_framework.decorators import api_view
from .models import Test01
from .serializers import TestDataSerializer


@api_view(['GET'])
def getTestDatas(request):
    datas = Test01.objects.all()
    serializer = TestDataSerializer(datas, many=True)
    return Response(serializer.data)

위 코드를 보면 네번째 줄에서 앞서만든 serializers를 불러오는 것을 볼 수 있습니다. @api_view는 데코레이션으 의미하며 get 메소드를 사용하는 것을 볼 수 있습니다. Test01.objects.all()은 Test01 테이블에 있는 데이터를 모두 읽어들이겠다는 의미입니다. 이렇게 데이터르 읽어오고 serializer를 이용해 데이터 직렬화를 통해 마지막으로 Response를 이용해 결과를 보여줍니다.

2.3. test01/urls.py 파일 만들기

지금까지 필요한 model과 view를 만들었으니 라우팅을 설정해주겠습니다. test01 디렉토리에 urls.py파일을 생성하고 다음과 같이 작성해줍니다.

from django.urls import path
from . import views

urlpatterns = [
    path('test01datas/', views.getTestDatas, name="test01datas"),
]

위 코드에서 views.getTestDatas는 앞서 제가 만든 함수입니다.

2.4. urls.py 파일 수정

이번에는 상위폴더에 있는 urls.py를 다음과 같이 수정해보겠습니다.

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('test/', include('test01.urls')),
]

위 코드에서 주의해야하 점은 두번째 줄에 import include를 반드시 포함시켜야한다는 점입니다. 그리고 path에서 앞서 생성한 test01.urls를 추가해줍니다.

2.5. 실행!

이제 모든 준비가 끝났습니다. 먼저 makemigrations을 해주고…

$ python manage.py makemigrations

Migrations for 'test01':
  test01/migrations/0001_initial.py
    - Create model AuthGroup
    - Create model AuthGroupPermissions
    - Create model AuthPermission
    - Create model AuthUser
(..생략)

다음으로 migrate를 해줍니다.

$ python manage.py migrate       

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, test01
Running migrations:
  Applying test01.0001_initial... OK

그리고 서버를 실행하고

$ python manage.py runserver     

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
June 02, 2022 - 05:26:39
Django version 4.0.2, using settings 'dbcontest.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

웹 브라우저로 가서 주소창에 http://127.0.0.1:8000/test/test01datas/를 입력하면

위와 같이 test01 테이블에 존재하는 데이터를 읽어오는 것을 볼 수 있습니다.

3. 특정 조건의 데이터만 읽어들이기

앞선 실습에서는 특정 테이블의 데이터를 모두 가지고 오는 경우를 보았습니다. 그렇다면 이번에는 특정 조건을 만족하는 데이터만 골라서 가지고 오는 경우를 보겠습니다.

3.1. test01/views.py 파일 수정

먼저 test01/views.py에 다음과 같은 함수를 추가해줍니다.

@api_view(['GET'])
def getTestData(request, name):
    data = Test01.objects.get(name=name)
    serializer = TestDataSerializer(data, many=False)
    return Response(serializer.data)

위 함수에서 앞선 실습과 다른 부분은 우선 함수의 입력값부터 request 뿐만 아니라 name도 받습니다. 이 name은 자신이 원하는 변수 이름으로 설정할 수 있습니다. 그리고 Test01.objects.all이 아닌 Test01.objects.get을 사용한다는 것입니다. name=name에서 앞의 name은 test01 테이블의 name 컬럼을 의미하는 것이며 뒤의 name은 우리가 요청 값으로 전달하는 name입니다. 즉, 우리는 test01 테이블에서 name필드값이 name인 데이터를 가지고 오겠다는 것입니다. 그리고 serializer에서 우리는 하나의 레코드만 가지고 올 것이믈 many=False를 설정해줍니다.

3.2. test01/urls.py 파일 수정

다음을 url을 설정합니다. test01/urls.py파일에 다음과 같이 추가해줍니다.

path('test01data/<str:name>', views.getTestData, name="test01data"),

위 코드처럼 urls.py파일에서 꺽쇠를 사용하면 해당 부분으 변수로 받겠다는 의미입니다. 그리고 <str:name>은 우리가 전달할 name을 의미합니다. 참고로 우리가 보내 name은 문자열이므로 str을 써야 작동하지 만약 <int:name>이라고 작성하면 작동안합니다.

3.3. 결과 확인

잘되는지 한번확인해보겠니다. 다음과같이 먼저 migrate를 해줍니다. 변동사항은 없지만 습관처러 하는게 좋습니다.

$ python manage.py makemigrations

No changes detected
$ python manage.py migrate

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, test01
Running migrations:
  No migrations to apply.

그리고 서버를 올립니다.

$ python manage.py runserver

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
June 03, 2022 - 03:50:47
Django version 4.0.2, using settings 'dbcontest.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

브라우저 주소창에 http://127.0.0.1:8000/test/test01data/cheolwon라고 입력해줍니다. 이는 test01 테이블의 name컬럼값이 cheolwon인 데이터를 가져 오라는 말입니다.

결과르 보면 제대로 불러오는 것을 볼 수 있습니다.