[tts-input-service] 프로젝트 회고

그냥·2022년 9월 29일
0

1. 구성

1) 설명

TTS에 input으로 들어오는 텍스트를 전처리 하고 오디오 파일을 생성하여 저장하고, 이후 프로젝트 수정 및 삭제를 할 수 있는 API를 구현한 프로젝트이다.


2) 개발 기간

2022.09.22 ~ 2022.09.28



2. Blocker

1) Serializer 설계(1)

API 구현 시 Serializer를 설계하는 것이 가장 까다로웠다.
이번 프로젝트에서 ERD를 아래와 같이 설계 하였다.

여기서 프로젝트 생성 POST 요청을 보낼 때 body data로 아래 세 개를 받는다.

{
 	"project_title": "test1",
  	"speed": 1,
  	"text": ["Hi! I am user1."]
}

speed와 text는 Project에 없는 컬럼이다. 그렇다 보니 ProjectSerializer를 구성할 때 speed와 text를 받을 수 있는 serializers.CharField(write_only=True)나 serializers.FloatField(write_only=True)를 선언해주어야 한다. write_only=True를 해주어야 Project 모델에 컬럼이 없음에도 Serializer에 에러가 발생하지 않는다.

하지만 이렇게 했을 때 문제점은 이후 text나 speed라는 이름으로 데이터를 반환해줄 수 없다는 것이다. 지금처럼 text = serializers.CharField(write_only=True)로 선언할 경우 write_only=True 조건이 붙어 있으므로 데이터를 반환해줄 수 없다. 그러므로 text 외에 다른 변수명으로 선언 후에나 가능하다. 현재 해당 부분에 대해서는 어떻게 해야 더 효율적으로 만들 수 있을지 지속적인 고민 중이다.


2) Serializer 설계(2)

두 번째 블로커는 API별로 Serializer를 새로 만들어야 하는 문제이다. 위에서 프로젝트를 생성하는 POST를 처리하는 API의 경우 반환값으로 텍스트가 [[id1, sentence1], [id2, sentence2], ...] 이와 같은 형식으로 나와야 한다. 그렇지만 프로젝트 상세 GET 요청의 반환 값은 [sentence1, senetence2, ...]와 같이 나와야 한다. 즉, 서로 다른 반환값을 요구하고 있으므로 하나의 Serializer에서는 처리할 수 없다고 생각하였다. 그러므로 프로젝트 생성 Serializer와 프로젝트 상세 Serializer 두 개를 생성하는 비효율적인 상황에 놓였다. 결국은 해결하지 못한 상태이며, 어떻게 해결할 수 있을지 고민 중이다.



3. 얻은 점

1) Unit Test

DRF 내에 있는 APITestCase 라이브러리를 사용하여 유닛 테스트를 구현해 보았다. 확실히 퓨어 장고 유닛 테스트 케이스보다 편리한 점이 많았다.

reverse

from django.urls import reverse

해당 라이브러리는 장고 라이브러리로 유닛 테스트에서 url을 설정하는 데에 도움을 준다.
예를 들어 아래와 같이 urls.py에 라우팅을 해두었다고 하자.

urlpatterns = [
    path("users/signup/", SignupAPIView.as_view(), name='signup'),
]

여기서 name의 값을 url = reverse(signup) 받아서 url로 라우팅 해준다.
프로젝트 진행 중 url이 바뀌더라도 name의 값만 바뀌지 않는다면 그대로 유닛 테스트를 할 수 있기 때문에 매우 유용하다.


2. ListField

Serailizer 내부에 선언할 수 있는 필드 중 하나이다. 이는 POST body data 값으로 배열이 들어올 때 받을 수 있게 해주는 필드이다. 이번에 프로젝트를 할 때 배열로 들어오는 API가 있어서 해당 필드를 사용하게 되었다.

serializers.ListField(child=serializers.IntegerField(), write_only=True)

serializers.ListField(child=serializers.CharField(), write_only=True)

만약 정수 원소를 갖는 배열이면 위와같이 child=erializers.IntegerField()를 문자 원소를 갖는 배열이면 child=serializers.CharField()를 옵션값으로 넣어주면 된다.

0개의 댓글