이전 글에서 설명했다시피 일반적으로 사용되는 프로그래밍 언어인 C 계얼 언어, Java나 Kotlin 같은 프로그래밍 언어에서는 생성자 주입, setter 함수를 이용해 가장 일반적인 DI 패턴을 활용할 수 있습니다.Scala 언어에서는 이 두 가지 방법 외에도 trait와 self type을 이용해 Cake Pattern을 구현하고, 이를 통해 DI를 활용할 수 있습니다. TraitTrait는 자바의 interface와 매우 비슷하지만 몇 가지 추가적인 기능들을 제공해줍니다.먼저 다중 상속을 지원해주고, 메서드를 직접 구현할 수도 있으며, 특정 필드를 포함할 수 있습니다.자바8 이후의 interface는 이러한 기능들을 지원해주지만, scala는 훨씬 이전부터 이러한 기능들을 trait를 통해 지원해주..
Dependency injection (의존성 주입)DI는 dependency injection의 줄임말입니다. 프로그래밍을 하면서 모두 들어봤을 단어이고, Spring을 사용한다면 알든 모르든 모두가 사용하고 있는 개념입니다.DI를 번역하면 의존성 주입이라는 뜻이고, 개념을 말하자면 객체 지향 프로그래밍에서 객체 간의 의존성을 관리하는 설계 패턴 중 하나로, 객체가 자신의 의존성을 직접 생성하는 대신 외부에서 주입받는 방식입니다. 이 패턴을 사용하면 코드의 유연성과 재사용성을 높일 수 있으며, 테스트가 용이해집니다. Dependency injection의 주요 개념의존성 주입은 의존성과 주입의 두 가지 개념으로 나눠서 설명할 수 있습니다.의존성 (dependency) 정의 의존성은 한 객체가 다른 객체..
원문: 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}그러나 이러한 구현은 ..