GitLab 유틸리티
개발 편의를 위해 제공되는 MergeHash, Override, StrongMemoize, RequestCache, ReactiveCaching, TokenAuthenticatable, CircuitBreaker 등 GitLab 개발 유틸리티를 설명합니다.
개발을 돕기 위해 여러 유틸리티를 만들어 두었습니다. Executable # executable.rb 를 참고합니다. 서비스 클래스에 클래스 수준 execute 메서드를 추가합니다. 이 메서드는 주어진 인수로 새 인스턴스를 만들고 그 인스턴스에서 execute 를 호출합니다. # Before class MyService def self .execute(project, user) new(project, user).execute end end # After class MyService include Gitlab::Utils::Executable end 두 방식 모두 MyService.new(project, user).execute 의 단축 표현으로 MyService.execute(project, user) 를 지원합니다. 호출 후에 서비스 인스턴스가 필요하지 않은 경우 이 믹스인을 사용합니다. 인스턴스가 필요한 호출자는 new 를 그대로 사용할 수 있습니다. 이 메서드는 ... 로 인수를 전달하므로 initialize 와 어긋날 일이 없습니다. 인수 목록을 다시 적는 위임 메서드는 initialize 가 바뀌면 어긋납니다. include 는 싱글턴 조상 체인에서 모듈을 상위 클래스보다 앞에 둡니다. 따라서 이 믹스인은 상위 클래스에서 상속한 클래스 수준 execute 를 재정의합니다. MergeHash # merge_hash.rb 를 참고합니다. 해시, 배열, 그 밖의 객체가 담긴 배열을 깊게 병합합니다. Gitlab : :Utils : :MergeHash .merge( [{ hello: [ "world" ] }, { hello: "Everyone" }, { hello: { greetings: [ 'Bonjour' , 'Hello' , 'Hallo' , 'Dzien dobry' ] } }, "Goodbye" , "Hallo" ] ) 결과는 다음과 같습니다. [ { hello: [ "world" , "Everyone" , { greetings: [ 'Bonjour' , 'Hello' , 'Hallo' , 'Dzien dobry' ] } ] }, "Goodbye" ] 해시의 모든 키와 값을 배열로 추출합니다. Gitlab : :Utils : :MergeHash .crush( { hello: "world" , this: { crushes: [ "an entire" , "hash" ] } } ) 결과는 다음과 같습니다. [ :hello , "world" , :this , :crushes , "an entire" , "hash" ] Override # override.rb 를 참고합니다. 이 유틸리티는 어떤 메서드가 다른 메서드를 재정의하는지 확인하는 데 도움이 됩니다. Java의 @Override 애너테이션이나 Scala의 override 키워드와 같은 개념입니다. 다만 프로덕션 런타임 부담을 피하기 위해 ENV['STATIC_VERIFICATION'] 이 설정된 경우에만 이 검사를 실행합니다. 다음을 확인할 때 유용합니다. 재정의 메서드에 오타가