원문: Effective Scala - Acknowledgments 여기서 배운 교훈들은 Twitter의 Scala 커뮤니티에서 얻은 것입니다. 저는 충실한 기록자가 되기를 바랍니다.Blake Matheny, Nick Kallen, Steve Gury, 그리고 Raghavendra Prabhu는 많은 유익한 지침과 훌륭한 제안을 제공해 주었습니다.
원문: Effective Scala - Twitter's standard libraries LocalsUtil의 Local은 특정 Future 디스패치 트리에 국한된 참조 셀을 제공합니다. Local의 값을 설정하면, 동일한 스레드에서 Future에 의해 지연된 모든 계산에서 해당 값을 사용할 수 있습니다. 이들은 스레드 로컬과 유사하지만, 범위가 Java 스레드가 아닌 "Future 스레드"의 트리입니다.trait User { def name: String def incrCost(points: Int)}val user = new Local[User]...user() = currentUserrpc() ensure { user().incrCost(10)}위 코드에서 ensure 블록의 user()는 ..
원문: Effective Scala - Twitter's standard libraries Twitter에서 가장 중요한 표준 라이브러리는 Util과 Finagle입니다. Util은 Scala와 Java 표준 라이브러리를 확장하여, 누락된 기능이나 더 적절한 구현을 제공합니다. Finagle은 Twitter의 RPC 시스템으로, 분산 시스템의 핵심 컴포넌트입니다. FuturesFutures는 이전의 Concurrency 부분에서 간략히 다루어 보았습니다. Futures는 비동기 프로세스를 조정하는 주요 메커니즘으로 Twitter의 코드베이스에서 널리 사용되며, Finagle의 핵심입니다. Futures는 동시성 이벤트를 조합할 수 있게 해주고, 동시성 높은 작업에 대한 사고를 단순화해줍니다. 이들은 또한..
원문: Effective Scala - Java compatibility 우리는 Java에서 사용하기 위해 Scala 코드를 작성할 때 Java 입장에서 코드의 사용이 관용적으로 여겨지도록 작성합니다. 대부분의 경우 이를 위해서 특별한 노력이 필요하지 않습니다. 클래스와 순수한 트레이트는 Java에서 대응되는 것과 완전히 동일합니다. 하지만 때로는 별도의 Java API를 제공해야 할 때도 있습니다. 당신이 작성한 라이브러리가 Java에서 어떠한 느낌인지 확인하기 위한 좋은 방법은 Java로 단위 테스트를 작성하는 것입니다. 이를 통해 Java 입장에서 보여지는 당신의 라이브러리가 시간이 지나도 안정적으로 유지되도록 보장할 수 있습니다. Scala 컴파일러는 시간이 지나면서 변동이 생기므로 Java에 대..
원문: Effective Scala - Garbage collection 우리는 운영 환경에서 가비지 컬렉션(GC) 튜닝에 많은 시간을 할애합니다. 가비지 컬렉션에 대한 우려는 대부분 자바와 유사하지만, 관용적인 스칼라 코드는 관용적인 자바 코드보다 더 많은(단기적인) 가비지를 생성하는 경향이 있습니다. 이는 함수형 스타일의 부산물입니다. 일반적으로 HotSpot의 세대별 가비지 컬렉션은 이러한 문제를 해결하며, 대부분의 경우 단기 가비지는 사실상 비용이 들지 않습니다. GC 성능 문제를 이야기하기 전에, Attila가 GC 튜닝에 대한 우리(twitter)의 경험을 설명한 프레젠테이션을 시청하세요. 스칼라 자체에서 GC 문제를 완화하기 위한 유일한 도구는 가비지 생성을 줄이는 것입니다. 하지만 데이터로..
원문: Effective Scala - Error Handling 스칼라는 예외 처리를 위한 기능을 제공하지만, 정확성이 요구되며 프로그래머가 직접 오류를 처리해야 하는 일반적인 오류들에는 사용하지 않는 것이 좋습니다. 스칼라의 예외 처리 기능을 사용하는 대신 이러한 오류를 명시적으로 감싸서 표현하세요. Option 클래스나 com.twitter.util.Try를 사용하는 것이 적합한 선택입니다. 이들은 타입 시스템을 사용하여 사용자가 적절히 오류를 처리하도록 보장합니다. 예를 들어, 저장소(repository)를 설계할 때 다음과 같이 API를 설계하고픈 유혹이 있을 수 있습니다.trait Repository[Key, Value] { def get(key: Key): Value}그러나 이러한 구현은 ..
원본: Effective Scala - Functional Programming 값 지향 프로그래밍(Value oriented programming)은 많은 이점을 제공하는데, 특히 함수형 프로그래밍 구조와 함께 사용될 때 그 이점이 더욱 두드러집니다. 이 스타일은 상태의 변형(stateful mutation)보다 값의 변환(transformation)에 중점을 두어 참조 투명성을 유지하고, 더 강력한 불변성을 제공하며 논리적으로 이해하기 쉬운 코드를 작성하게 해줍니다. 케이스 클래스(Case class), 패턴 매칭(Pattern matching), 구조 분해 바인딩(Destructuring bindings), 타입 추론(Type inference), 경량 클로저(Lightweight closure) ..
원문: Effective Scala - Control structures 프로그램을 함수형 스타일로 작성할 경우 일반적으로 전통적인 제어 구조가 더 적게 필요하게 되며, 선언형 스타일로 작성할 때 가독성이 더 좋아집니다. 이는 일반적으로 당신이 작성한 로직을 여러 개의 작은 메소드나 함수로 나누고, 이를 match 표현식으로 연결하는 것을 의미합니다. 함수형 프로그램은 종종 표현 중심적이 되는 경향이 있습니다. 조건문의 각 분기는 동일한 타입의 값을 계산하고, for (..) yield 표현은 comprehension을 계산하며, 흔하게 재귀 구조가 사용됩니다. Recursion (재귀)문제를 재귀적으로 표현하면 종종 더 간단하게 표현될 때가 있습니다. 심지어 꼬리 재귀 최적화가 적용되면 (이는 @tai..