multi-module 방식으로 대대적인 리팩토링을 진행하였습니다. 물론 로직 자체는 방대하지 않기에 대대적이라고 표현할 정도는 아니긴 하지만, 결과적으로는 패키지를 모두 뜯어 고쳤습니다.
기존 고안은 Ktor server, client에서 사용되는 공통 request, response 모델을 common-data 패키지에 두고 이를 server, plugin에서 사용하는 방식으로 구상하였습니다. 이를 통해 모델이 중복 생성되는 일종의 보일러플레이트를 방지할 것이라 생각하였습니다.
안드로이드 개발하면서 멀티모듈로 분리하는 것은 매번 하던 것이기에 별다른 걱정을 하지 않았으나 각 플랫폼에서 타 모듈을 인식하지 못하는 이슈가 발생하여 끙끙 고생하다 알게 된 사실은, 기존 백엔드와 플러그인 프로젝트를 생성할 때 한 프로젝트 안에서 생성은 하였지만, 제너레이터
를 통해 만들어진 모듈은 타 모듈을 인식하지 못한다는 것 이였습니다. 개인적으로 완전 독립된 프로젝트로 인식하면서 발생한 이슈가 아닐까 추측하고 있습니다.
그렇기에 기존 프로젝트를 아카이브하고 신규 프로젝트를 생성하여 gradle 모듈로 plugin, server, common-data 3가지로 setup을 한 후 하나하나 수동으로 마이그레이션을 진행하였습니다.
백엔드 구축도 어느 정도 끝나 플러그인에 연결된 API도 구축한 백엔드로 마이그레이션을 진행하고 있는데 여러모로 오류가 펑펑 터지네요. 제한된 환경에서 테스트 시 에는 문제 없지만 실제 연결하는 과정에서 발생하는 오류들이라 하나하나 수정해나가고 있습니다.
기존 PHP에서는 러프하게 되었던 간단한 API임에도 불구하고 Ktor에서는 무언가 하나하나 토닥여 주면서 설정
해주어야하는 것 같은... 그렇지만 대부분 한번 겪고 나면 이후에는 간단하게 수정, 인지 및 방지 할 수 있는 부분들이였습니다.
한 예시로 API 테스트 툴에서 요청하면 정상적으로 처리되지만 플러그인에서 요청 시 415 Unsupported Media Type
이슈가 발생하였는데, 이는 당연할 수 도 있지만 Content-Type을 form-data, x-www-form-urlencoded으로 요청하면receiveParameters
함수로 받아야하고, application/json으로 넘어오는 경우에는 receive
함수로 처리를 해야하는 이슈였습니다.
또한 보안상의 이슈인지 receive와 관련된 함수를 2번 이상 사용 시 Request body has already been consumed (received).
오류가 발생하네요
Extension을 만들면 앞으로도 간단하게 분기 처리할 수 있을 것 같은데 실질적으로 플러그인에서 POST하는 API는 한 개 임으로 우선 간단하게 분기 처리하여 수정하였습니다.
val request = if (call.request.contentType() == ContentType.Application.Json)
call.receive<NamingRequest>()
else
call.receiveParameters().let {
NamingRequest(
original = it.getOrFail("original"),
type = it.getOrFail("type"),
language = it.getOrFail("language")
)
}
이제 발생하는 오류도 이제 한 개정도 남았고 남은 기능들은 Form과 관련된 기능들이기에 빠르면 오늘, 늦어도 내일 모레쯤이면 배포 가능할 것 같습니다.
'개발 > 개발 일기' 카테고리의 다른 글
Compose iOS 첫 성공 (0) | 2023.03.27 |
---|---|
Compose Web - Skiko (0) | 2023.02.23 |
NamingFox - 변수, 함수 이름 짓는 플러그인 개발기2 (0) | 2023.02.10 |
NamingFox - 변수, 함수 이름 짓는 플러그인 개발기1 (0) | 2023.02.07 |
Compose Web - M1 맥 node gradle 오류 (0) | 2022.08.26 |
상상하는 것을 소프트웨어로 구현하는 것을 좋아하는 청년
게시글이 마음에 드시나요? [ 공감❤️ ] 눌러주시면 큰 힘이 됩니다!