상태관리와 npm 라이브러리 래핑하는 법도 얼추 알겠으니 풀스택을 해봅시다.
백엔드는 자주 쓰는 Spring Webflux이다.
프로젝트 구조는 루트 프로젝트 밑에 backend (Spring Boot) + frontend (Kotlin/JS React) + shared library (공통 모델 정의) 이다.
가장 막혔던 부분은 shared library에 모델을 어떻게 정의해야하는가이다. 처음에는 인터페이스로 정의하고 각 프로젝트에서 재정의해야하나 했는데 그럴거면 시발 왜 이걸 씀하는 생각이 들었는데 다행히 그럴 필요는 없다.
그래서 같이 쓰려면 kotlinx.serialization을 모든 프로젝트에서 써야하는가? 그러려면 백엔드쪽에 이미 jackson이 있기 때문에 충돌이 나거나 경우에 따라 직렬화 로직을 변경해야하나…? 싶었는데 그것도 아니었다. shared에서 kotlin serialization의 @Serialization 어노테이션으로 데이터클래스를 정의하면 frontend에서는 kotlin serialization을 쓰면 되고 (직접 쓸 일은 없다) backend에서는 그냥 가져다가 jackson이 쓰도록 하면 된다. 즉, backend에는 kotlin serialization을 추가할 필요가 없다.
그리고 다음은, 1번에서 인터페이스로 정의하려는 생각을 했던 계기인데, 코틀린의 프로퍼티는 기본적으로 필드가 아니라 getter와 setter(var 인 경우)가 있기 때문에 코틀린 클래스를 그냥 Kotlin/JS 에서 썼다가는 이름이 불일치하는 경우가 있다. 그래서 프론트엔드에서 백엔드로 API 호출 시에는 자바스크립트의 기본 fetch를 쓰면 안되고, ktor client를 써야한다. ContentNegotiation에 json을 추가해두면 json을 알아서 역직렬화하니 2번에서 직접쓸일은 없다고 한 것이다.
네번째로, kotlin serialization이 jackson에 비해 기능이 많이 딸려서 기능 테스트? 를 했는데 일단, Primitive Type들은 당연히 되는거고, 멤버에 직렬화 가능한 애가 있으면 잘 되는 것 같다. enum class 는 @Serialization 어노테이션이 없어도 잘 되는 것 같다. 아 그런데, data class에 기본값이 있는 프로퍼티로 되어 있는 건 걍 무시하는 듯 하다. 이건 뭔가 옵션 조절하는 어노테이션이 따로 있을 듯.
그래서 오늘의 코드는 다음이다.
https://github.com/Aosamesan/kotlin-spring-react
이제 빌드 Task만 제대로 짜면 될 듯
답글 남기기