tomatophobia / allowance-chart

다수의 증권 계좌로 구성된 포트폴리오 관리 서비스
1 stars 0 forks source link

tapir multipartBody에서 Serializalbe 타입 인퍼런스로 wartremover 걸리는 문제 #52

Open tomatophobia opened 2 years ago

tomatophobia commented 2 years ago

슬랙에 질문 올린 것

안녕하세요! wartremover를 켜고 scala로 코딩 중에 있습니다. tapir를 이용해 엔드포인트를 만드는 중 multipartBody를 넣어주는 부분에서 JavaSerializable로 타입 인퍼런스가 되는 것 때문에 에러가 발생하고 있는데요. 되도록이면 suppress warning을 안쓰고 싶은 마음에 여러가지 수정을 해보았는데요. (case class 뒤에 extends Product with Serializable 을 붙여본다던가..) 정확한 원인을 이해하지 못해 헛다리 짚고 있는 느낌입니다. :sweat_smile: (sttp, tapir의 코드를 제가 잘 이해하지 못한 점도 있을 것 같습니다.) 혹시 wartremover 쓰시는 분께서는 Serializable, JavaSerializable 옵션 등을 이 경우 어떻게 하시는 편이신가요? 고쳐야 하는 부분인지 false positive 정도로 생각하고 무시해도 되는 것인지 확신이 들지 않아 질문드립니다!

final case class NameWithFile(name: String, file: Part[TapirFile])

val someEndpoint = 
    endpoint.post
      .in("post-file")
      .in(multipartBody[NameWithFile]) // [wartremover:JavaSerializable] Inferred type containing Serializable: sttp.model.Part[Comparable[_ >: java.io.File with String <: java.io.Serializable] with java.io.Serializable]

구삼: 아마 MultipartCodec 인스턴스를 유도하는 매크로 때문이 아닐까 싶은데요, 저라면

  1. suppress warning 했을 때 정상작동하는지부터 보고
  2. 작동을 하면 NameWithFile의 암시적 MultipartCodec 인스턴스를 직접 만들어 보거나
  3. MultipartCodecDerivation 코드를 복붙해서 조금씩 고쳐보면서 실제 원인을 파악하거나 할 것 같네요. 서버에서만 쓰실거면 TapirFile 타입 앨리어스 대신 java.io.File 이나 java.io.InputStream 등을 직접 쓰는 것도 고려해 보세요.