TIL(39일차)

김규현·2022년 10월 27일
0

📝 오늘 배운 것

📌 REST API 설계하기

인스타그램 기능을 클론 코딩하기 위해서 이전에 Django로 구현해보았고,
이번에는 Django Rest Framework로 REST API 설계하여 서비스를 구현해보는 것이 목표이다.

어제 만들었던 users 앱에 이어 오늘은 articles 앱을 생성하고, 게시글의 CRUD를 만드는 것 까지 진행했다.
REST API를 설계 하면서 느낀 점은 Djang로 구현했을 때 보다 url이 깔끔하고 serializers를 사용하면서 API 로직을 짜는 것이 간결해졌다.

그리고 REST는 세션 정보나 쿠키를 별도로 서버에 저장하지 않고, 서버 API에 들어오는 요청에 따라 단순히 처리하여 불필요한 정보를 관리하지 않아 구현이 단순하고, 클라이언트와 서버가 분리되어 자유롭다.

pure django로 구현한 urls

REST API의 urls

위의 첫 번째 url처럼 자원(resource)에 대한 행위 마다 url을 만드는 것은 비효율적이며, 아래 처럼 REST한 API를 설계하여 각 자원에 대한 행위를 HTTP METHOD로 표현하면 깔끔하다.

📌 Media/Static 파일

Static File : 개발 리소스의 정적인 파일 (js, css, image etc)
앱 단위로 저장/서빙
프로젝트 단위로 저장/서빙
Media File : 유저가 업로드 한 모든 정적인 파일 (image, pdf etc)
프로젝트 단위로 저장/서빙

FileField : 파일 저장을 지원하는 모델 필드
ImageField : 이미지 저장을 지원하는 모델 필드 (FileField 상속)

제출된 파일, 이미지는 settings.MEDIA_ROOT 경로에 파일을 저장
DB 필드에는 settings.MEDIA_ROOT 내 저장된 하위 경로를 저장

Static과 Media의 root는 저장될 기본 경로이고, url은 제출한 파일에 접근하기 위한 URL 경로
ImageField의 Upload_to는 media가 저장될 기본 경로에 하위의 저장 공간을 설정

static 파일과는 다르게 개발 환경에서 기본 서빙을 지원하지 않는다.
개발 편의성 목적으로 서빙 rule 추가가 가능하다.
settings.DEBUG = False 일때는 static 함수에서 빈 리스트 리턴하고 True일 때만 서빙한다.


# settings.py
STATIC_ROOT = BASE_DIR / 'static'
STATIC_URL = '/static/'

MEDIA_ROOT = BASE_DIR / 'media'
MEDIA_URL = '/media/'

# models.py
image = models.ImageField(blank=True, upload_to='%Y/%m/%d/')

# urls.py
from django.conf import settings
from django.conf.urls.static import static

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

📌 Serializer에서 사용할 fields만 선택하기

Serializer를 필요한 정보만 받을 수 있도록 커스터마이징하여 클라이언트에서 데이터를 전달할 때 필요한 데이터만 받을 수 있게 위와 같이 설정할 수 있다.

그리고 serializer의 object를 SerializerMethodField를 통해서 원하는 값으로 변환시킬 수 있다.
ex) user = (user_id:1) -> user.email = ({"user" : "abc@def.com"})

profile
웹개발 회고록

0개의 댓글