1/10: Scala 3 마이그레이션 팁과 요령. A 🧵. 중요: 마이그레이션 가이드를 꼼꼼히 읽고 Scalafix를 활용하여 구문을 업데이트하세요. 수작업으로 인한 시간 낭비를 줄여줍니다!
2/10: 모든 것을 새 구문으로 성급히 바꾸지 마세요! 먼저 코드베이스를 이전 구문으로 컴파일하되 Scala 3 컴파일러를 사용하세요. 새 구문에는 자체 규칙이 있으므로 익숙하지 않으면 혼란스러운 오류가 발생할 수 있습니다. 특히 이전 구문과 함께 사용하면 더욱 그렇습니다.
3/10 암시적 매개변수를 `using`으로 바꿀 때 호출 사이트에서 전달되는 모든 명시적 매개변수에도 `using` 키워드가 필요하다는 점을 기억하세요! getUserInfo(userId)(using Tracing.noop) // 정답
4/10: `using` 키워드를 빼먹으면 난해한 오류가 발생합니다. 컴파일러가 코드의 완전히 다른 부분을 강조해서 디버깅을 어렵게 만들 수도 있습니다. 무슨 일이 일어나고 있는지 알아내려고 애쓰느라 정말 많은 시간을 허비했습니다.
5/10: circe에 대한 경고: `deriveConfiguredCodec`과 같은 반자동 파생에서 `Codec.derived`로 마이그레이션할 때는 주의하세요! `Decoder.derived`는 `Configuration`을 암시적 매개변수로 허용하지 않습니다. 대신 `Decoder.derivedConfigured`를 사용하세요.
6/10: 새로운 derives 구문을 사용하면 circe 문제를 완전히 피할 수 있습니다. case class MyClass(...) derives ConfiguredCodec Decoder.derived도 동일하게 동작할 것이라고 생각했기 때문에 버그를 prod에 푸시할 뻔했습니다. 다른 문제 덕분에 충분히 일찍 발견할 수 있었습니다.
7/10: Doobie 사용자: Get/Put 인스턴스 누락에 대한 거대한 오류 메시지에 주의하세요. 제 경우에는 AnyVal 클래스가 원인이었습니다. 컴파일러가 이전처럼 인스턴스를 파생시킬 수 없었던 것입니다.
8/10: 담배 문제에 대한 해결책: AnyVal 클래스를 불투명 유형으로 변환하고 동반 객체에서 주어진 인스턴스를 제공합니다.
9/10: 형태가 없는 튜플 구문(Scala 3에서 제거됨)을 사용하는 레거시 코드에서 문제에 직면했습니다. 튜플 요소를 추가하고 케이스 클래스로 변환하는 방법이 필요했습니다. 먼저 Scala 3의 네이티브 튜플 구문을 시도했지만, CaseClass.tupled와 호환되지 않았습니다.
10/10: 튜플에 대한 사용자 지정 확장 기능(런타임 실패 위험이 있음)을 시도해 본 결과, Chimney 라이브러리가 튜플과 추가 값을 연결하는 데 가장 좋은 솔루션이라는 것을 알게 되었습니다. 보너스: Chimney의 최신 릴리스에서 버그를 발견하기도 했습니다!
어떤 마이그레이션 팁을 발견하셨나요? 아래에 공유해 주세요! #Scala #Scala3
보너스 #1: someContextualResource.flatMap { implicit tracing => ... }을 someContextualResource.flatMap { case given TracingCtx => ... }으로 바꿀 수 있습니다. 완벽하지는 않지만 작동합니다. 같은 파일과 코드베이스에서 givens과 implicits를 섞는 것보다 낫습니다.