티스토리 뷰
Django로 RESTful API 서버 구축해보기 (3) - DELETE와 PUT을 사용한 수정, 삭제 기능 구현
하눤석 2022. 4. 25. 19:11
이번 포스팅에서는 지난 포스팅에 이어 DELETE와 PUT를 사용한 데이터의 수정, 삭제 기능을 구현해보겠습니다.
https://recordofwonseok.tistory.com/363
pk를 이용한 단건조회 기능 구현
REST API를 사용한 수정과 삭제를 구현하기 위해, 먼저 단건 조회를 구현해야 합니다.
지금까지 구현한 GET 방식의 데이터 조회에선 특정 데이터만을 응답하는 것이 아닌 데이터베이스에 있는 모든 정보를 응답하였습니다. 수정이나 삭제를 위해선 특정 데이터를 선택할 수 있도록 구현해야 하기 때문에 단건 조회 기능을 추가한 후에 수정과 삭제를 구현하겠습니다.
Django에서는 models.py에 오브젝트 모델을 구축할 때, 따로 PK(Primary Key) 값을 지정하지 않아도 자동으로 id값이 생성되어 pk로 적용됩니다. 따라서, 제가 생성한 모델의 pk값은 id이며 이는 mySQL의 AUTO_INCREAMENT와 같이 오름차순의 인덱스 순서로 접근할 수 있습니다.
위는 지난 포스팅에서 생성했던 Users 데이터입니다. 단건 조회 구현을 위해 테스트 데이터를 몇 개 삽입해 보겠습니다.
POST방식으로 임의 데이터 2개를 추가하여 총 3개의 데이터를 만들어 주었습니다.
단건 조회는 pk인 id값으로 접근하기 때문에 http://127.0.0.1:8000/users/(ID값) 의 형태로 GET 방식을 보내면 단건 조회가 가능하도록 해주어야 합니다.
urls.py로 가서 urlpatterns에 아래 코드를 추가해주면 users 뒤에 오는 값을 int형태로 pk에 매핑하여 views의 user_select를 실행하겠다는 의미입니다.
path('users/<int:pk>',views.user_select),
해당 코드를 추가하고 dataTest 앱의 views.py로 가서 user_select를 구현해보겠습니다.
def user_select(request, pk):
object = Users.objects.get(pk=pk)
if request.method == "GET":
serializer = userSerializer(object)
return JsonResponse(serializer.data,safe =False)
views.py에 위 코드를 추가하여 전달받은 pk값을 통해 오브젝트를 갖고오고, JSON 타입으로 변환하여 리턴하도록 하였습니다.
이제 Insomnia를 켜서 http://127.0.0.1:8000/users/ 뒤에 1, 2, 3을 붙여 각각 전송하면
와우! 정상적으로 응답이 돌아오는 것을 확인할 수 있습니다.
그렇다면 4번 인덱스로 요청을 보내면 어떻게 될까요 ?
네. 다들 예측하셨다시피 당연히 에러가 발생합니다. ㅎㅎ
그럼 단건조회 기능을 구현하였으니 데이터의 수정, 삭제기능을 user_select에 추가해주어 데이터를 수정할 수 있도록 해보겠습니다.
PUT, DELETE를 사용한 수정, 삭제
PUT과 DELETE는 단건조회 기능에 PUT 요청과 DELETE 케이스를 추가하여 구현하면 됩니다.
먼저 수정을 요청하는 PUT의 경우 수정할 데이터를 JSON 타입으로 파싱해야 합니다.
파싱한 데이터와 원래 데이터를 Serializer를 사용해 변환한 후, 정상적으로 변환되었다면,
반드시 save()함수를 통해 모델에 적용해주어야 합니다!!
정상적으로 처리되었을 때 변환한 데이터와 201 상태코드를 반환하도록 했습니다.
PUT 요청시 작동하는 코드
elif request.method == "PUT":
update_data = JSONParser().parse(request)
serializer = userSerializer(object, data= update_data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, ststus=400)
다음은 DELETE입니다. DELETE는 정말 간단합니다. 모델에서 delete() 함수를 사용하여 삭제하면 끝입니다.
DELETE 요청시 작동하는 코드
elif request.method == "DELETE":
object.delete()
return HttpResponse(status=204)
user_select 전체 소스코드
def user_select(request, pk):
object = Users.objects.get(pk=pk)
if request.method == "GET":
serializer = userSerializer(object)
return JsonResponse(serializer.data,safe =False)
elif request.method == "PUT":
update_data = JSONParser().parse(request)
serializer = userSerializer(object, data= update_data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, ststus=400)
elif request.method == "DELETE":
object.delete()
return HttpResponse(status=204)
이제 PUT과 DELETE 를 테스트해 보겠습니다.
Insomnia로 3번째 데이터에 수정할 데이터를 JSON 타입으로 입력하고 이를 PUT 방식으로 전송하면 201 Created 응답과 함께 수정된 데이터가 전송된 것을 확인할 수 있습니다.
GET 방식으로 전체 데이터를 조회해보니 정상적으로 잘 수정되었네요
다음은 DELETE입니다. 3번 데이터에게는 미안하지만 DELETE요청을 보내보겠습니다.
정상적으로 204 응답이 반환되었습니다.
다시 GET으로 전체 데이터를 조회하면,
삭제도 정상적으로 잘 동작하네요 ㅎㅎ
여기까지 진행하여 Django를 사용한 RESTful API의 구현 토이프로젝트는 마무리 하도록 하겠습니다.
전체 소스코드는 깃을 참고하세요.
https://github.com/wonseok22/Django_REST_API
드디어 2주간 진행했던 간단한 토이 프로젝트를 마치게 되었습니다.
최근 API를 사용하여 데이터를 쓰는 일이 잦았는데 클라이언트 입장에서 사용만 하다 서버를 구현해보니 또 색다른 경험인 것 같습니다.
처음 진행한 토이프로젝트라 진짜 자투리 시간만 사용해야지 하고 2주라는 기간을 잡았는데 생각보다 일찍 끝났네요.
얻은 것이 참 많은 프로젝트였던 것 같습니다.
우선, 가장 기본적으로 REST API, RESTful API, CRUD Operation에 대해 다시 한 번 구체적으로 공부할 수 있는 좋은 계기가 되었습니다.
또한, 서버사이드에서 작업하는 백엔드 개발자가 어떤 일을 하는지 수박 겉핥기로나마 알게 되었습니다.
책으로, 이론으로만 공부하다 실제로 구현해보며 이런 저런 에러도 겪어보고 하다보니 훨씬 남는 것이 많은 것 같습니다.
다음번은 프로세스간 메모리 할당이나 네트워크 할당 관련하여 간단하게 공부해보고 싶어 그쪽으로 프로젝트를 잡게 될 것 같습니다. ^^
포스팅이 도움 되셨거나 무언가 마음에 안드는 점, 개선할 점이 있다면 공감과 댓글 작성해주시면 언제든 환영입니다. 감사합니다 :D
'Toy Projects > Django - RESTful API서버 구축해보기' 카테고리의 다른 글
Django로 RESTful API 서버 구축해보기 (2) - 가상 데이터를 사용한 REST API의 동작방식의 이해 (1) | 2022.04.21 |
---|---|
Django로 RESTful API 서버 구축해보기 (1) - API서버 구축과 API Test tool (0) | 2022.04.18 |
Django로 RESTful API 서버 구축해보기 (0) - Django 설치와 가상환경설정 (0) | 2022.04.14 |