원문: 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 - Object oriented programming 스칼라의 방대한 기능들은 대부분 객체 시스템을 통해 제공됩니다. 스칼라는 모든 값이 객체인 순수한 언어입니다. 달리 말하면 원시 타입과 복합 타입 간에 구분이 없습니다. 또한 스칼라는 믹스인(mixin)을 지원하여 더 직관적이고 세부적인 모듈 구성을 가능하게 하며, 컴파일 타임에 정적으로 타입 검사를 받으면서 유연하게 결합할 수 있습니다. 믹스인 시스템의 동기는 전통적인 의존성 주입의 필요성을 없애는 데 있습니다. 이러한 "컴포넌트 스타일" 프로그래밍의 정점은 케이크 패턴(cake pattern)입니다. Dependency injection (의존성 주입)우리가 지금까지 사용한 바로, 스칼라는 "고전적인" 생성자 기..
원본: 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..
원문: Effective Scala - Concurrency 현대의 서비스는 매우 높은 동시성을 유지합니다. 서버가 수만에서 수십만개까지 동시 작업을 조정하는 것은 흔한 일이며, 이러한 복잡성을 처리하는 것은 견고한 시스템 소프트웨어를 작성하는 데 필수적인 요소입니다. 쓰레드는 동시성을 표현하는 수단을 제공합니다. 쓰레드는 독립적이고 힙을 공유하는 실행 컨텍스트를 제공하며, 이는 운영 체제가 스케줄링합니다. 그러나 쓰레드의 생성은 Java에 있어서 매우 비용이 많이 드는 작업으로, 반드시 리소스 풀을 이용해 관리되어야 합니다. 이는 프로그래머에게 추가적인 복잡성을 야기하며, 높은 수준의 커플링을 일으킵니다. 특히, 어플리케이션의 로직을 쓰레드 사용에서 분리하기 어렵게 합니다. 이러한 복잡성은 특히 서비스..