Post

Twitter Server

Twitter Server 는 관리자 페이지, 로깅 등 애플리케이션의 공통적인 요소들을 제공합니다.

개요

Twitter Finatra 는 Twitter Server 와 Finagle 을 사용합니다. Twitter Finatra 를 이해하기 위해서는 Twitter Server 에 대해 알아야합니다. Twitter Server 는 관리자 페이지, 로깅 등 애플리케이션의 공통적인 요소들을 제공합니다.

다음 명령어를 통해 의존성을 추가합니다.

1
LibraryDependencies += "com.twitter" %% "twitter-server" % "24.2.0"

Twitter Server 를 상속하고 main 메서드를 정의해야 합니다.

1
2
3
4
5
6
7
8
import com.twitter.server.TwitterServer

object MyServer extends TwitterServer {

  def main(): Unit = {
    print("Hello World!")
  }
}

Life Cycle

Twitter Server 는 com.twitter.app.App 을 상속하기 때문에 c.t.a.App 의 Life Cycle 과 매우 유사합니다.
Twitter Server 는 c.t.a.App Life Cycle 에 WarmUp 단계를 추가합니다.

WarmUp 단계에서 외부 트래픽을 수용하기 전, 서버를 워밍업하는 로직을 추가할 수 있습니다.
warmupComplete() 를 통해 WarmUp 단계 종료 여부를 알 수 있습니다.

Flags

서버 설정, 조건에 따른 동작 제어에 Flag 를 사용할 수 있습니다.

Type Safety

Flag 는 Scala Type Safety 를 보장합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import com.twitter.app.Flag
import com.twitter.server.TwitterServer

import java.net.InetSocketAddress

object MyServer extends TwitterServer {

  val what: Flag[String] = flag(name = "what", default = "hello", help = "String to return")
  val addr: Flag[InetSocketAddress] = flag(name = "bind", default = new InetSocketAddress(0), help = "Bind address")
  
  def main(): Unit = {
    print("Hello World!")
  }
}

Help

Flag 를 추가하면, 자동으로 help 을 통해 정보를 표시합니다.

1
2
3
4
5
$ java -jar target/myserver-1.0.0-SNAPSHOT.jar -help

MyServer
  -what='hello': String to return
  -bing=':0': Bind address

Phase parsing args

Flag 는 parseArgs 단계에서 값이 정해지기 때문에,
생성자 혹은 onInit 단계에서 flag 를 정의해야 합니다. 동일하게, Flag 는 preMain 단계부터 읽을 수 있습니다.

failfastOnFlagsNotParsed 옵션을 키는 것이 좋습니다.
이 옵션을 키면 Flag 가 파싱되기 전에, Flag 에 접근하면 IllegalStateException 가 발생합니다.

1
override def failfastOnFlagsNotParsed: Boolean = true

Logging

Twitter Server 는 로깅을 위해 SLF4J 를 사용합니다.

  • Logback 은 Twitter Server 에서 권장하는 SLF4J 구현체입니다.
1
LibraryDependencies += "ch.qos.logback" % "logback-classic" % "1.4.7"

Log Format

로그 출력 형식을 변경하려면, defaultFormatter 를 오버라이딩합니다.

1
2
3
4
override def defaultFormatter = new Formatter(
  timezone = Some("KST"),
  prefix = "[yyyy-MM-dd HH:mm:ss.SSS] [%.3s] %s: "
)

로그 레벨 동적 변경

관리자 인터페이스의 로깅 핸들러를 통해 로그 레벨을 동적으로 변경할 수 있습니다.
이를 위해, SLF4J 로깅 라이브러리에 직접 의존하는 대신, Twitter Server 의 로깅 구현에 의존해야 합니다.

ImplementationDependency
java.util.logging (JUL)twitter-server/slf4j-jdk14
Log4jtwitter-server/slf4j-log4j12
Logback (recommended)twitter-server/logback-classic

References

This post is licensed under CC BY 4.0 by the author.

Trending Tags