[기술면접] 9일차 문답 | Django-DRF, serializer
Django 와 DRF를 통한 개발의 차이점은 어떤 것이 있습니까?
DRF는 Django 안에서 restful API를 쉽게 구축할 수 있도록 도와주는 오픈소스 라이브러리
Django는 views.py에 모든 코드를 작성하며 양방향 통신을 담당하므로 코드의 가독성이 떨어질 수 있다
DRF는 serializer로 CRUD등의 기능을 나누어 부담하고 정보를 쉽게 serialize, deserialize할 수 있어 django의 기능을 보완하는 프레임워크이다
풀스택 개발이 목적인 순수 Django와 달리 DRF는 백엔드 API 서버 개발을 위한 목적을 가진다
Django User 모델과 DRF Custom User 모델의 차이는 무엇입니까?
Django User모델은 django에서 기본 제공하는 기본 사용자 인증 모델이며 유저의 이름, 비밀번호, 이메일 등의 기본 기능을 지원하여 기본적인 기능을 충분히 처리할 수 있도록 작성되어있다. DRF Custom User모델은 기획에서의 요구 사항을 반영하여 DRF에서 사용하는 사용자 인증과 관련 기능을 확장하기 위해 사용할 수 있다.
DRF Serializer는 무엇이며, 어떤 기능을 수행합니까?
파이썬 형식의 코드를 다른 네트워크 환경과의 통신을 위해 직렬화할 때, DRF에서 직렬화를 담당하는 클래스
queryset이나 model instance등 복잡한 데이터를 python 데이터타입으로 변환시켜
이후 json, xml등의 컨텐츠 타입으로의 변환을 쉽게 만들어준다
- 기능
- 직렬화/역직렬화 과정을 통해 DB 데이터를 다루기 쉽게 만들어줌
- 필요한 필드를 커스터마이징하여 추가할 수 있음
- 데이터의 유효성검사로 API 디버깅을 쉽게 만들어줌
- 코드정리로 보안 이슈를 해결
- 사용방법
- 모델을 정의하고 migration으로 DB테이블을 업데이트, serializer에 필드를 정의하고 views.py에 필요한 http method를 정의함. 해당 method를 정의한 view로 url을 연결하고 요청에 따라 api엔드포인트로 해당 정보를 보낸다.
- 직렬화 과정
- 요청 JSON 등의 데이터 -> Deserialize -> Django 객체(DB 저장)-> Serialize -> 응답 JSON 등의 데이터 serializer사용
JSON 형식으로 데이터를 받고, Serializer를 통해서 JSON형식으로 데이터를 반환하는 이유는 무엇인가요?
JSON으로 데이터를 주고받음으로써 데이터의 표준화, 직렬화 및 역직렬화, 유효성 검사, 코드 재사용성 및 유지 보수, 쿼리 최적화에서의 이점을 얻을 수 있다.
- 데이터의 표준화 : 읽기 쉬운 형식으로 데이터를 표현, 여러 프로그래밍 언어에서 지원한다
- 직렬화 / 역직렬화 : serializer는 데이터를 JSON형식으로 변환하거나(직렬화), JSON데이터를 원래의 데이터 구조로 변환하는 과정(역직렬화)를 담당한다. 데이터 형식의 일관성을 유지하고 입출력시의 오류와 문제를 예방할 수 있다
- 유효성 검사 : 데이터를 받을 때 올바른 형식과 값이 들어왔는지 확인이 가능하다. 유효하지 않을 경우 오류메세지를 전달, 수정 요청을 처리한다
- 코드 재사용성 및 유지 보수 : 데이터 처리 로직을 분리, 모듈화하여 코드 가독성, 재사용성을 향상시키고 유지보수를 쉽게 한다.
- 쿼리 최적화 : 필요한 필드만 쿼리하고 서버의 부하를 줄여 효율적인 프로그램을 구현할 수 있다.
💡 JSON: JavaScript Object Notation의 약어 텍스트 기반 데이터를 기술하고 교환
[참고, JSON 데이터 포맷의 이해] https://www.itworld.co.kr/news/252478#csidxa91b85ca5ac9da09b550cb129d26937
Serializer를 통해서 특정 모델에 존재하지 않지만, 관계 있는 테이블의 필드 레코드를 반환하는 방법에 대해서 설명하시오
Serializer에서 관련 테이블의 필드 레코드를 반환하려면 SerializerMethodField와 사용자 정의 메소드를 사용하면 됩니다. 이 메소드는 관계된 필드를 통해 데이터에 액세스하고 SerializerMethodField에 반환값을 설정합니다. 이렇게 함으로써 필요한 데이터를 선택적으로 가져올 수 있습니다.
[공식문서] : https://www.django-rest-framework.org/api-guide/relations/
SerializerMethodField()
StringRelatedField()
PrimaryKeyRelatedField()
SlugRelatedField()
hyperlinkedrelatedfield()
hyperlinkedIdentifyfield()
Serializer를 통해서 역참조 하는 방법에 대해서 설명하시오
Serializer를 통한 역참조는 관계 필드(ForeignKey, OneToOneField, ManyToManyField 등)를 사용해 관련 객체를 참조합니다. Serializer 클래스 내에서 관계 필드를 정의하고, many=True 등의 옵션을 설정하여 관련된 객체의 정보를 포함시킵니다. 이를 통해 직렬화 과정에서 한 번에 관련 데이터를 가져와 애플리케이션에서 쉽게 처리할 수 있습니다.