๋ถ์ฐ ์์คํ ๊ตฌ์ฑ ์์ ์ ๋ํ ํฅ๋ฏธ๋ก์ด ๋ฉ์ปค๋์ฆ ํ๋๋ฅผ ๋ง์๋๋ฆฌ๊ณ ์ถ์ต๋๋ค. ๊ตฌ์ฑ์ ์์ ํ ์ ํ์ ์ฌ์ฉํ์ฌ ์ปดํ์ผ๋ ์ธ์ด(Scala)๋ก ์ง์ ํํ๋ฉ๋๋ค. ์ด ๊ฒ์๋ฌผ์์๋ ์ด๋ฌํ ๊ตฌ์ฑ์ ์๋ฅผ ์ ๊ณตํ๊ณ ์ปดํ์ผ๋ ๊ตฌ์ฑ์ ์ ์ฒด ๊ฐ๋ฐ ํ๋ก์ธ์ค์ ๊ตฌํํ๋ ๋ค์ํ ์ธก๋ฉด์ ๋ ผ์ํฉ๋๋ค.
(
์๊ฐ
์์ ์ ์ธ ๋ถ์ฐ ์์คํ ์ ๊ตฌ์ถํ๋ค๋ ๊ฒ์ ๋ชจ๋ ๋ ธ๋๊ฐ ๋ค๋ฅธ ๋ ธ๋์ ๋๊ธฐํ๋ ์ฌ๋ฐ๋ฅธ ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. DevOps ๊ธฐ์ (terraform, ansible ๋ฑ)์ ์ผ๋ฐ์ ์ผ๋ก ๊ตฌ์ฑ ํ์ผ(์ข ์ข ๊ฐ ๋ ธ๋์ ํน์ )์ ์๋์ผ๋ก ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ํ ๋ชจ๋ ํต์ ๋ ธ๋๊ฐ ๋์ผํ ํ๋กํ ์ฝ(๋์ผํ ๋ฒ์ ํฌํจ)์ ์ฌ์ฉํ๊ณ ์๋์ง ํ์ธํ๊ณ ์ถ์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ถ์ฐ ์์คํ ์ ๋นํธํ์ฑ์ด ๋ด์ฅ๋ฉ๋๋ค. JVM ์ธ๊ณ์์ ์ด ์๊ตฌ ์ฌํญ์ ํ ๊ฐ์ง ๊ฒฐ๊ณผ๋ ํ๋กํ ์ฝ ๋ฉ์์ง๊ฐ ํฌํจ๋ ๋์ผํ ๋ฒ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ชจ๋ ๊ณณ์์ ์ฌ์ฉํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
๋ถ์ฐ ์์คํ ์ ํ ์คํธํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? ๋ฌผ๋ก ํตํฉ ํ ์คํธ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ๋ชจ๋ ๊ตฌ์ฑ ์์์ ๋จ์ ํ ์คํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. (ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์์ ์ถ์ ํ๋ ค๋ฉด ํ ์คํธ ๋์ค๊ณผ ๋ฐํ์์ ๋์ผํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ธํธ๋ ์ ๊ณตํด์ผ ํฉ๋๋ค.)
ํตํฉ ํ ์คํธ๋ฅผ ์ํํ ๋ ๋ชจ๋ ๋ ธ๋์ ๋ชจ๋ ์์น์์ ๋์ผํ ํด๋์ค ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ฌ์ด ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ํด์ผ ํ ์ผ์ ๋ฐํ์์ ๋์ผํ ํด๋์ค ๊ฒฝ๋ก๊ฐ ์ฌ์ฉ๋๋์ง ํ์ธํ๋ ๊ฒ๋ฟ์ ๋๋ค. (๋ค๋ฅธ ํด๋์ค ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ๋ ธ๋๋ฅผ ์คํํ๋ ๊ฒ์ ์ ์ ์ผ๋ก ๊ฐ๋ฅํ์ง๋ง ์ด๋ก ์ธํด ์ ์ฒด ๊ตฌ์ฑ์ด ๋ณต์กํด์ง๊ณ ๋ฐฐํฌ ๋ฐ ํตํฉ ํ ์คํธ๊ฐ ์ด๋ ค์์ง๋๋ค.) ์ด ๊ฒ์๋ฌผ์ ๋ชฉ์ ์ ๋ฐ๋ผ ๋ชจ๋ ๋ ธ๋๊ฐ ๋์ผํ ํด๋์ค ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๊ตฌ์ฑ์ ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ํจ๊ป ๋ฐ์ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ฒ์ ์ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋จ ๋ฐ์ ์ ๋ค์ํ ๋จ๊ณ๋ฅผ ์๋ณํฉ๋๋ค. ๋ค์ํ ๋ฒ์ ์ ๊ตฌ์ฑ์ ์๋ณํ๋ ๊ฒ๋ ๋
ผ๋ฆฌ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ตฌ์ฑ ์์ฒด๋ฅผ ๋ฒ์ ์ ์ด ์์คํ
์ ๋ฐฐ์นํฉ๋๋ค. ํ๋ก๋์
์ ๊ตฌ์ฑ์ด ํ๋๋ง ์๋ ๊ฒฝ์ฐ ๊ฐ๋จํ ๋ฒ์ ๋ฒํธ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ง์ ํ๋ก๋์
์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ฌ๋ฌ ๊ฐ๊ฐ ํ์ํฉ๋๋ค.
๋ฒ์ ์ธ์ ๊ตฌ์ฑ ๋ถ๊ธฐ ๋ฐ ์ถ๊ฐ ๋ ์ด๋ธ(์: ๋ถ๊ธฐ ์ด๋ฆ)์ด ํฌํจ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ ํํ ๊ตฌ์ฑ์ ๋ช
ํํ๊ฒ ์๋ณํ ์ ์์ต๋๋ค. ๊ฐ ๊ตฌ์ฑ ์๋ณ์๋ ๋ถ์ฐ ๋
ธ๋, ํฌํธ, ์ธ๋ถ ๋ฆฌ์์ค ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ์ ์ ํน์ ์กฐํฉ์ ๊ณ ์ ํ๊ฒ ํด๋นํฉ๋๋ค. ์ด ๊ฒ์๋ฌผ์ ๋ชฉ์ ์ ์ํด ์ฐ๋ฆฌ๋ ๋ถ๊ธฐ๊ฐ ํ๋๋ง ์๋ค๊ณ ๊ฐ์ ํ๊ณ ์ ์ผ๋ก ๊ตฌ๋ถ๋ ์ธ ๊ฐ์ ์ซ์๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌ์ฑ์ ์๋ณํ ์ ์์ต๋๋ค(1.2.3).
ํ๋ ํ๊ฒฝ์์๋ ๊ตฌ์ฑ ํ์ผ์ด ์๋์ผ๋ก ์์ฑ๋๋ ๊ฒฝ์ฐ๊ฐ ๊ฑฐ์ ์์ต๋๋ค. ๋ฐฐํฌ ์ค์ ์์ฑ๋์ด ๋ ์ด์ ๊ฑด๋๋ฆฌ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ ๋ง์ต๋๋ค(๊ทธ๋์
์ด ๊ฒ์๋ฌผ์์๋ ์ปดํ์ผ๋ ์ํฐํฉํธ ๋ด๋ถ์ ๊ตฌ์ฑ์ ํํํ๋ ์์ด๋์ด๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ปดํ์ผ๋ ๊ตฌ์ฑ
์ด ์น์ ์์๋ ์ ์ ์ปดํ์ผ ๊ตฌ์ฑ์ ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ ๊ฐ์ง ๊ฐ๋จํ ์๋น์ค, ์ฆ ์์ฝ ์๋น์ค์ ์์ฝ ์๋น์ค ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌํ๋ฉ๋๋ค. ์ด ๋ ๊ฐ์ง ์๋น์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ ๊ฐ์ง ์์คํ ์ต์ ์ด ๊ตฌ์ฑ๋ฉ๋๋ค. ํ ์ต์ ์์๋ ๋ ์๋น์ค๊ฐ ๋ชจ๋ ๋์ผํ ๋ ธ๋์ ์๊ณ ๋ค๋ฅธ ์ต์ ์์๋ ์๋ก ๋ค๋ฅธ ๋ ธ๋์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ถ์ฐ ์์คํ
์๋ ์ฌ๋ฌ ๋
ธ๋๊ฐ ํฌํจ๋ฉ๋๋ค. ํน์ ์ ํ์ ๊ฐ์ ์ฌ์ฉํ์ฌ ๋
ธ๋๋ฅผ ์๋ณํ ์ ์์ต๋๋ค. NodeId
:
sealed trait NodeId
case object Backend extends NodeId
case object Frontend extends NodeId
๋๋
case class NodeId(hostName: String)
๋๋
object Singleton
type NodeId = Singleton.type
๋ ธ๋๋ ๋ค์ํ ์ญํ ์ ์ํํ๊ณ ์๋น์ค๋ฅผ ์คํํ๋ฉฐ ๋ ธ๋ ๊ฐ์ TCP/HTTP ์ฐ๊ฒฐ์ด ์ค์ ๋ ์ ์์ต๋๋ค.
TCP ์ฐ๊ฒฐ์ ์ค๋ช ํ๋ ค๋ฉด ์ต์ํ ํฌํธ ๋ฒํธ๊ฐ ํ์ํฉ๋๋ค. ๋ํ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ๋ชจ๋ ๋์ผํ ํ๋กํ ์ฝ์ ์ฌ์ฉํ๊ณ ์๋์ง ํ์ธํ๊ธฐ ์ํด ํด๋น ํฌํธ์์ ์ง์๋๋ ํ๋กํ ์ฝ์ ๋ฐ์ํ๊ณ ์ถ์ต๋๋ค. ๋ค์ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐ์ ์ค๋ช ํฉ๋๋ค.
case class TcpEndPoint[Protocol](node: NodeId, port: Port[Protocol])
์ด๋์์ Port
- ๊ทธ๋ฅ ์ ์ Int
ํ์ฉ ๊ฐ๋ฅํ ๊ฐ์ ๋ฒ์๋ฅผ ๋ํ๋
๋๋ค.
type PortNumber = Refined[Int, Closed[_0, W.`65535`.T]]
์ธ๋ จ๋ ์ ํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ณด๊ธฐ
HTTP(REST) โโํ๋กํ ์ฝ์ ๊ฒฝ์ฐ ํฌํธ ๋ฒํธ ์ธ์๋ ์๋น์ค ๊ฒฝ๋ก๊ฐ ํ์ํ ์๋ ์์ต๋๋ค.
type UrlPathPrefix = Refined[String, MatchesRegex[W.`"[a-zA-Z_0-9/]*"`.T]]
case class PortWithPrefix[Protocol](portNumber: PortNumber, pathPrefix: UrlPathPrefix)
ํฌํ ์ ํ
์ปดํ์ผ ํ์์ ํ๋กํ ์ฝ์ ์๋ณํ๊ธฐ ์ํด ํด๋์ค ๋ด์์ ์ฌ์ฉ๋์ง ์๋ ์ ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ๊ฒฐ์ ์ ๋ฐํ์์ ํ๋กํ ์ฝ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ์ง ์์ง๋ง ์ปดํ์ผ๋ฌ๊ฐ ํ๋กํ ์ฝ ํธํ์ฑ์ ํ์ธํ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ๋กํ ์ฝ์ ์ง์ ํ๋ฉด ๋ถ์ ์ ํ ์๋น์ค๋ฅผ ์ข ์์ฑ์ผ๋ก ์ ๋ฌํ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ธ ํ๋กํ ์ฝ ์ค ํ๋๋ Json ์ง๋ ฌํ๊ฐ ํฌํจ๋ REST API์ ๋๋ค.
sealed trait JsonHttpRestProtocol[RequestMessage, ResponseMessage]
์ด๋์์ RequestMessage
โ ์์ฒญ ์ ํ, ResponseMessage
โ ์๋ต ์ ํ.
๋ฌผ๋ก ์ฐ๋ฆฌ๊ฐ ์๊ตฌํ๋ ์ค๋ช
์ ์ ํ์ฑ์ ์ ๊ณตํ๋ ๋ค๋ฅธ ํ๋กํ ์ฝ ์ค๋ช
์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
์ด ๊ฒ์๋ฌผ์ ๋ชฉ์ ์ ์ํด ์ฐ๋ฆฌ๋ ํ๋กํ ์ฝ์ ๋จ์ํ๋ ๋ฒ์ ์ ์ฌ์ฉํฉ๋๋ค.
sealed trait SimpleHttpGetRest[RequestMessage, ResponseMessage]
์ฌ๊ธฐ์ ์์ฒญ์ URL์ ์ถ๊ฐ๋ ๋ฌธ์์ด์ด๊ณ ์๋ต์ HTTP ์๋ต ๋ณธ๋ฌธ์ ๋ฐํ๋ ๋ฌธ์์ด์ ๋๋ค.
์๋น์ค ๊ตฌ์ฑ์ ์๋น์ค ์ด๋ฆ, ํฌํธ, ์ข
์์ฑ์ผ๋ก ์ค๋ช
๋ฉ๋๋ค. ์ด๋ฌํ ์์๋ Scala์์ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ํํ๋ ์ ์์ต๋๋ค(์: HList
-s, ๋์ ๋ฐ์ดํฐ ์ ํ). ์ด ๊ฒ์๋ฌผ์ ๋ชฉ์ ์ ์ํด ์ผ์ดํฌ ํจํด์ ์ฌ์ฉํ๊ณ ๋ค์์ ์ฌ์ฉํ์ฌ ๋ชจ๋์ ๋ํ๋
๋๋ค. trait
'ov. (์ผ์ดํฌ ํจํด์ ์ด ์ ๊ทผ ๋ฐฉ์์ ํ์ ์์๋ ์๋๋๋ค. ๋จ์ง ๊ฐ๋ฅํ ๊ตฌํ ์ค ํ๋์ผ ๋ฟ์
๋๋ค.)
์๋น์ค ๊ฐ์ ์ข
์์ฑ์ ํฌํธ๋ฅผ ๋ฐํํ๋ ๋ฉ์๋๋ก ํํ๋ ์ ์์ต๋๋ค. EndPoint
๋ค๋ฅธ ๋
ธ๋์ ๊ฒ:
type EchoProtocol[A] = SimpleHttpGetRest[A, A]
trait EchoConfig[A] extends ServiceConfig {
def portNumber: PortNumber = 8081
def echoPort: PortWithPrefix[EchoProtocol[A]] = PortWithPrefix[EchoProtocol[A]](portNumber, "echo")
def echoService: HttpSimpleGetEndPoint[NodeId, EchoProtocol[A]] = providedSimpleService(echoPort)
}
์์ฝ ์๋น์ค๋ฅผ ์์ฑํ๋ ค๋ฉด ํฌํธ ๋ฒํธ์ ํด๋น ํฌํธ๊ฐ ์์ฝ ํ๋กํ ์ฝ์ ์ง์ํ๋ค๋ ํ์๋ง ์์ผ๋ฉด ๋ฉ๋๋ค. ํน์ ํฌํธ๋ฅผ ์ง์ ํ์ง ์์ ์๋ ์์ต๋๋ค. ์๋ํ๋ฉด... ํน์ฑ์ ์ฌ์ฉํ๋ฉด ๊ตฌํ ์์ด ๋ฉ์๋(์ถ์ ๋ฉ์๋)๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๊ตฌ์ฒด์ ์ธ ๊ตฌ์ฑ์ ์์ฑํ ๋ ์ปดํ์ผ๋ฌ๋ ์ถ์ ๋ฉ์๋์ ๊ตฌํ์ ์ ๊ณตํ๊ณ ํฌํธ ๋ฒํธ๋ฅผ ์ ๊ณตํ๋๋ก ์๊ตฌํฉ๋๋ค. ๋ฉ์๋๋ฅผ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ํน์ ๊ตฌ์ฑ์ ์์ฑํ ๋ ๋ค๋ฅธ ํฌํธ๋ฅผ ์ง์ ํ์ง ๋ชปํ ์๋ ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ด ์ฌ์ฉ๋ฉ๋๋ค.
ํด๋ผ์ด์ธํธ ๊ตฌ์ฑ์์ echo ์๋น์ค์ ๋ํ ์ข ์์ฑ์ ์ ์ธํฉ๋๋ค.
trait EchoClientConfig[A] {
def testMessage: String = "test"
def pollInterval: FiniteDuration
def echoServiceDependency: HttpSimpleGetEndPoint[_, EchoProtocol[A]]
}
์ข
์์ฑ์ ๋ด๋ณด๋ธ ์๋น์ค์ ๋์ผํ ์ ํ์
๋๋ค. echoService
. ํนํ, ์์ฝ ํด๋ผ์ด์ธํธ์์๋ ๋์ผํ ํ๋กํ ์ฝ์ด ํ์ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ ์๋น์ค๋ฅผ ์ฐ๊ฒฐํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ ์ ์์ต๋๋ค.
์๋น์ค ๊ตฌํ
์๋น์ค๋ฅผ ์์ํ๊ณ ์ค์งํ๋ ค๋ฉด ํจ์๊ฐ ํ์ํฉ๋๋ค. (์๋น์ค๋ฅผ ์ค์งํ๋ ๊ธฐ๋ฅ์ ํ
์คํธ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.) ์ด๋ฌํ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐ๋ ์ฌ๋ฌ ๊ฐ์ง ์ต์
์ด ์์ต๋๋ค(์: ๊ตฌ์ฑ ์ ํ์ ๋ฐ๋ผ ์ ํ ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ ์์). ์ด ๊ฒ์๋ฌผ์์๋ ์ผ์ดํฌ ํจํด์ ์ฌ์ฉํฉ๋๋ค. ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค๋ฅผ ํํํ๊ฒ ์ต๋๋ค. cats.Resource
, ์๋ํ๋ฉด ์ด ํด๋์ค๋ ๋ฌธ์ ๋ฐ์ ์ ๋ฆฌ์์ค ํด์ ๋ฅผ ์์ ํ๊ฒ ๋ณด์ฅํ๋ ์๋จ์ ์ด๋ฏธ ์ ๊ณตํฉ๋๋ค. ๋ฆฌ์์ค๋ฅผ ์ป์ผ๋ ค๋ฉด ๊ตฌ์ฑ๊ณผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง ๋ฐํ์ ์ปจํ
์คํธ๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค. ์๋น์ค ์์ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
type ResourceReader[F[_], Config, A] = Reader[Config, Resource[F, A]]
trait ServiceImpl[F[_]] {
type Config
def resource(
implicit
resolver: AddressResolver[F],
timer: Timer[F],
contextShift: ContextShift[F],
ec: ExecutionContext,
applicative: Applicative[F]
): ResourceReader[F, Config, Unit]
}
์ด๋์์
Config
โ ์ด ์๋น์ค์ ๊ตฌ์ฑ ์ ํAddressResolver
โ ๋ค๋ฅธ ๋ ธ๋์ ์ฃผ์๋ฅผ ์์๋ผ ์ ์๋ ๋ฐํ์ ๊ฐ์ฒด(์๋ ์ฐธ์กฐ)
๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค๋ฅธ ์ ํ cats
:
F[_]
โ ํจ๊ณผ ์ ํ(๊ฐ์ฅ ๊ฐ๋จํ ๊ฒฝ์ฐF[A]
๊ทธ๋ฅ ํจ์์ผ ์๋ ์์ด์() => A
. ์ด ๊ฒ์๋ฌผ์์ ์ฐ๋ฆฌ๋cats.IO
.)Reader[A,B]
- ๊ธฐ๋ฅ๊ณผ ๊ฑฐ์ ๋์์ดA => B
cats.Resource
- ํ๋ํ๊ณ ๊ณต๊ฐํ ์ ์๋ ์์Timer
โ ํ์ด๋จธ(์ ์ ์ ๋ค๊ณ ์๊ฐ ๊ฐ๊ฒฉ์ ์ธก์ ํ ์ ์์)ContextShift
- ์๋ ๋ก๊ทธExecutionContext
Applicative
โ ๊ฐ๋ณ ํจ๊ณผ๋ฅผ ๊ฒฐํฉํ ์ ์๋ ํจ๊ณผ ์ ํ ํด๋์ค(๊ฑฐ์ ๋ชจ๋๋) ๋ ๋ณต์กํ ์์ฉ ํ๋ก๊ทธ๋จ์์๋ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋์ ๊ฒ ๊ฐ์ต๋๋ค.Monad
/ConcurrentEffect
.
์ด ํจ์ ์๋ช ์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์๋น์ค๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์๋ฌด๊ฒ๋ ํ์ง ์๋ ์๋น์ค๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
trait ZeroServiceImpl[F[_]] extends ServiceImpl[F] {
type Config <: Any
def resource(...): ResourceReader[F, Config, Unit] =
Reader(_ => Resource.pure[F, Unit](()))
}
(์ผํฐ๋ฏธํฐ.
ะธ
๋ ธ๋๋ ์ฌ๋ฌ ์๋น์ค๋ฅผ ์์ํ ์ ์๋ ๊ฐ์ฒด์ ๋๋ค(๋ฆฌ์์ค ์ฒด์ธ์ ์์์ ์ผ์ดํฌ ํจํด์ ์ํด ๋ณด์ฅ๋ฉ๋๋ค).
object SingleNodeImpl extends ZeroServiceImpl[IO]
with EchoServiceService
with EchoClientService
with FiniteDurationLifecycleServiceImpl
{
type Config = EchoConfig[String] with EchoClientConfig[String] with FiniteDurationLifecycleConfig
}
์ด ๋ ธ๋์ ํ์ํ ์ ํํ ๊ตฌ์ฑ ์ ํ์ ์ง์ ํ๊ณ ์์ต๋๋ค. ํน์ ์๋น์ค์ ํ์ํ ๊ตฌ์ฑ ์ ํ ์ค ํ๋๋ฅผ ์ง์ ํ๋ ๊ฒ์ ์์ด๋ฒ๋ฆฌ๋ฉด ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ํ ํ์ํ ๋ชจ๋ ๋ฐ์ดํฐ์ ํจ๊ป ์ ์ ํ ์ ํ์ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ์ง ์์ผ๋ฉด ๋ ธ๋๋ฅผ ์์ํ ์ ์์ต๋๋ค.
ํธ์คํธ ์ด๋ฆ ํ์ธ
์๊ฒฉ ํธ์คํธ์ ์ฐ๊ฒฐํ๋ ค๋ฉด ์ค์ IP ์ฃผ์๊ฐ ํ์ํฉ๋๋ค. ์ฃผ์๋ ๋๋จธ์ง ๊ตฌ์ฑ๋ณด๋ค ๋์ค์ ์๋ ค์ง ์๋ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ ธ๋ ID๋ฅผ ์ฃผ์์ ๋งคํํ๋ ํจ์๊ฐ ํ์ํฉ๋๋ค.
case class NodeAddress[NodeId](host: Uri.Host)
trait AddressResolver[F[_]] {
def resolve[NodeId](nodeId: NodeId): F[NodeAddress[NodeId]]
}
์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
- ๋ฐฐํฌ ์ ์ ์ฃผ์๊ฐ ์๋ ค์ง๋ฉด ๋ค์์ ์ฌ์ฉํ์ฌ Scala ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์ฃผ์๋ฅผ ์ ๋ ฅํ ๋ค์ ๋น๋๋ฅผ ์คํํ์ธ์. ๊ทธ๋ฌ๋ฉด ํ ์คํธ๊ฐ ์ปดํ์ผ๋๊ณ ์คํ๋ฉ๋๋ค.
์ด ๊ฒฝ์ฐ ํจ์๋ ์ ์ ์ผ๋ก ์๋ ค์ง๋ฉฐ ์ฝ๋์์ ๋งคํ์ผ๋ก ํํ๋ ์ ์์ต๋๋ค.Map[NodeId, NodeAddress]
. - ์ด๋ค ๊ฒฝ์ฐ์๋ ์ค์ ์ฃผ์๋ ๋
ธ๋๊ฐ ์์๋ ํ์๋ง ์๋ ค์ง๋๋ค.
์ด ๊ฒฝ์ฐ ๋ค๋ฅธ ๋ ธ๋๋ณด๋ค ๋จผ์ ์คํ๋๋ "๊ฒ์ ์๋น์ค"๋ฅผ ๊ตฌํํ ์ ์์ผ๋ฉฐ ๋ชจ๋ ๋ ธ๋๋ ์ด ์๋น์ค์ ๋ฑ๋กํ๊ณ ๋ค๋ฅธ ๋ ธ๋์ ์ฃผ์๋ฅผ ์์ฒญํฉ๋๋ค. - ์์ ํ ์ ์๋ค๋ฉด
/etc/hosts
, ๊ทธ๋ฐ ๋ค์ ์ฌ์ ์ ์๋ ํธ์คํธ ์ด๋ฆ(์:my-project-main-node
ะธecho-backend
) ๊ฐ๋จํ ์ด ์ด๋ฆ์ ์ฐ๊ฒฐํ๋ฉด ๋ฉ๋๋ค.
๋ฐฐํฌ ์ค์ IP ์ฃผ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ด ๊ฒ์๋ฌผ์์๋ ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ๋ ์์ธํ ๊ณ ๋ คํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ฅผ ์ํด
์ฅ๋๊ฐ ์์์๋ ๋ชจ๋ ๋
ธ๋๊ฐ ๋์ผํ IP ์ฃผ์๋ฅผ ๊ฐ์ต๋๋ค. 127.0.0.1
.
๋ค์์ผ๋ก ๋ถ์ฐ ์์คํ ์ ๋ํ ๋ ๊ฐ์ง ์ต์ ์ ๊ณ ๋ คํฉ๋๋ค.
- ๋ชจ๋ ์๋น์ค๋ฅผ ํ๋์ ๋ ธ๋์ ๋ฐฐ์นํฉ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ์์ฝ ์๋น์ค์ ์์ฝ ํด๋ผ์ด์ธํธ๋ฅผ ๋ค๋ฅธ ๋ ธ๋์์ ํธ์คํ ํฉ๋๋ค.
๊ตฌ์ฑ
๋จ์ผ ๋ ธ๋ ๊ตฌ์ฑ
object SingleNodeConfig extends EchoConfig[String]
with EchoClientConfig[String] with FiniteDurationLifecycleConfig
{
case object Singleton // identifier of the single node
// configuration of server
type NodeId = Singleton.type
def nodeId = Singleton
/** Type safe service port specification. */
override def portNumber: PortNumber = 8088
// configuration of client
/** We'll use the service provided by the same host. */
def echoServiceDependency = echoService
override def testMessage: UrlPathElement = "hello"
def pollInterval: FiniteDuration = 1.second
// lifecycle controller configuration
def lifetime: FiniteDuration = 10500.milliseconds // additional 0.5 seconds so that there are 10 requests, not 9.
}
๊ฐ์ฒด๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๋ชจ๋์ ๊ตฌ์ฑ์ ๊ตฌํํฉ๋๋ค. TTL(Time-To-Live) ๊ตฌ์ฑ๋ ์ฌ์ฉ๋๋ฏ๋ก ๊ฐ๊ฒฉ์ด ์ง๋๋ฉด lifetime
ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํฉ๋๋ค. (Ctrl-C๋ ์๋ํ์ฌ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ํด์ ํฉ๋๋ค.)
๋์ผํ ๊ตฌ์ฑ ๋ฐ ๊ตฌํ ํน์ฑ ์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์์ผ๋ก ๊ตฌ์ฑ๋ ์์คํ
์ ๋ง๋ค ์ ์์ต๋๋ค.
XNUMX๋ ธ๋ ๊ตฌ์ฑ
object NodeServerConfig extends EchoConfig[String] with SigTermLifecycleConfig
{
type NodeId = NodeIdImpl
def nodeId = NodeServer
override def portNumber: PortNumber = 8080
}
object NodeClientConfig extends EchoClientConfig[String] with FiniteDurationLifecycleConfig
{
// NB! dependency specification
def echoServiceDependency = NodeServerConfig.echoService
def pollInterval: FiniteDuration = 1.second
def lifetime: FiniteDuration = 10500.milliseconds // additional 0.5 seconds so that there are 10 request, not 9.
def testMessage: String = "dolly"
}
์ค์ํ! ์๋น์ค๊ฐ ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋์ด ์๋์ง ํ์ธํ์ธ์. ์ฐ๋ฆฌ๋ ํ ๋ ธ๋๊ฐ ๊ตฌํํ๋ ์๋น์ค๋ฅผ ๋ค๋ฅธ ๋ ธ๋์ ์ข ์์ฑ ๋ฐฉ๋ฒ ๊ตฌํ์ผ๋ก ์ง์ ํฉ๋๋ค. ์ข ์์ฑ ์ ํ์ ์ปดํ์ผ๋ฌ์์ ํ์ธ๋ฉ๋๋ค. ํ๋กํ ์ฝ ์ ํ์ ํฌํจํฉ๋๋ค. ์คํํ๋ฉด ์ข ์์ฑ์ ์ฌ๋ฐ๋ฅธ ๋์ ๋ ธ๋ ID๊ฐ ํฌํจ๋ฉ๋๋ค. ์ด ์ฒด๊ณ ๋๋ถ์ ํฌํธ ๋ฒํธ๋ฅผ ์ ํํ ํ ๋ฒ ์ง์ ํ๊ณ ํญ์ ์ฌ๋ฐ๋ฅธ ํฌํธ๋ฅผ ์ฐธ์กฐํ๋๋ก ๋ณด์ฅ๋ฉ๋๋ค.
๋ ๊ฐ์ ์์คํ ๋ ธ๋ ๊ตฌํ
์ด ๊ตฌ์ฑ์์๋ ๋ณ๊ฒฝ ์์ด ๋์ผํ ์๋น์ค ๊ตฌํ์ ์ฌ์ฉํฉ๋๋ค. ์ ์ผํ ์ฐจ์ด์ ์ ์ด์ ์๋ก ๋ค๋ฅธ ์๋น์ค ์ธํธ๋ฅผ ๊ตฌํํ๋ ๋ ๊ฐ์ ๊ฐ์ฒด๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค.
object TwoJvmNodeServerImpl extends ZeroServiceImpl[IO] with EchoServiceService with SigIntLifecycleServiceImpl {
type Config = EchoConfig[String] with SigTermLifecycleConfig
}
object TwoJvmNodeClientImpl extends ZeroServiceImpl[IO] with EchoClientService with FiniteDurationLifecycleServiceImpl {
type Config = EchoClientConfig[String] with FiniteDurationLifecycleConfig
}
์ฒซ ๋ฒ์งธ ๋
ธ๋๋ ์๋ฒ๋ฅผ ๊ตฌํํ๋ฉฐ ์๋ฒ ๊ตฌ์ฑ๋ง ํ์ํฉ๋๋ค. ๋ ๋ฒ์งธ ๋
ธ๋๋ ํด๋ผ์ด์ธํธ๋ฅผ ๊ตฌํํ๊ณ ๊ตฌ์ฑ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ฌ์ฉํฉ๋๋ค. ๋ํ ๋ ๋
ธ๋ ๋ชจ๋ ์๋ช
๊ด๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. ์๋ฒ ๋
ธ๋๋ ์ค์ง๋ ๋๊น์ง ๋ฌด๊ธฐํ ์คํ๋ฉ๋๋ค. SIGTERM
'om, ํด๋ผ์ด์ธํธ ๋
ธ๋๋ ์ผ์ ์๊ฐ ํ์ ์ข
๋ฃ๋ฉ๋๋ค. ์ผํฐ๋ฏธํฐ.
์ผ๋ฐ์ ์ธ ๊ฐ๋ฐ ํ๋ก์ธ์ค
์ด ๊ตฌ์ฑ ์ ๊ทผ ๋ฐฉ์์ด ์ ์ฒด ๊ฐ๋ฐ ํ๋ก์ธ์ค์ ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๊ตฌ์ฑ์ ๋๋จธ์ง ์ฝ๋์ ํจ๊ป ์ปดํ์ผ๋๊ณ ์ํฐํฉํธ(.jar)๊ฐ ์์ฑ๋ฉ๋๋ค. ๊ตฌ์ฑ์ ๋ณ๋์ ์ํฐํฉํธ์ ๋ฃ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ ๋์ผํ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๋ฌ ๊ตฌ์ฑ์ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ค์ ๋งํ์ง๋ง, ๋ค์ํ ๊ตฌ์ฑ ๋ถ๊ธฐ์ ํด๋นํ๋ ์ํฐํฉํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ํน์ ๋ฒ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์ข ์์ฑ์ ๊ตฌ์ฑ๊ณผ ํจ๊ป ์ ์ฅ๋๋ฉฐ ํด๋น ๋ฒ์ ์ ํด๋น ๋ฒ์ ์ ๊ตฌ์ฑ์ ๋ฐฐํฌํ๊ธฐ๋ก ๊ฒฐ์ ํ ๋๋ง๋ค ์์ํ ์ ์ฅ๋ฉ๋๋ค.
๋ชจ๋ ๊ตฌ์ฑ ๋ณ๊ฒฝ์ ์ฝ๋ ๋ณ๊ฒฝ์ผ๋ก ์ด์ด์ง๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ฐ
๋ณ๊ฒฝ ์ฌํญ์ ์ผ๋ฐ์ ์ธ ํ์ง ๋ณด์ฆ ํ๋ก์ธ์ค์ ๋ฐ๋ผ ์ฒ๋ฆฌ๋ฉ๋๋ค.
๋ฒ๊ทธ ํธ๋์ปค ํฐ์ผ -> ํ๋ณด -> ๊ฒํ -> ๊ด๋ จ ๋ธ๋์น์ ๋ณํฉ ->
ํตํฉ -> ๋ฐฐํฌ
์ปดํ์ผ๋ ๊ตฌ์ฑ ๊ตฌํ์ ์ฃผ์ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
-
๊ตฌ์ฑ์ ๋ถ์ฐ ์์คํ ์ ๋ชจ๋ ๋ ธ๋์์ ์ผ๊ด๋ฉ๋๋ค. ๋ชจ๋ ๋ ธ๋๊ฐ ๋จ์ผ ์์ค๋ก๋ถํฐ ๋์ผํ ๊ตฌ์ฑ์ ์์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
-
๋ ธ๋ ์ค ํ๋๋ง ๊ตฌ์ฑ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ "๊ตฌ์ฑ ๋๋ฆฌํํธ"๊ฐ ๋ฐ์ํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
-
์์ ๊ตฌ์ฑ ๋ณ๊ฒฝ์ด ๋ ์ด๋ ค์์ง๋๋ค.
-
๋๋ถ๋ถ์ ๊ตฌ์ฑ ๋ณ๊ฒฝ์ ์ ์ฒด ๊ฐ๋ฐ ํ๋ก์ธ์ค์ ์ผ๋ถ๋ก ๋ฐ์ํ๋ฉฐ ๊ฒํ ๋์์ด ๋ฉ๋๋ค.
ํ๋ก๋์ ๊ตฌ์ฑ์ ์ ์ฅํ๋ ค๋ฉด ๋ณ๋์ ์ ์ฅ์๊ฐ ํ์ํฉ๋๊น? ์ด ๊ตฌ์ฑ์๋ ์ก์ธ์ค๋ฅผ ์ ํํ๋ ค๋ ๋น๋ฐ๋ฒํธ ๋ฐ ๊ธฐํ ๋ฏผ๊ฐํ ์ ๋ณด๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. ์ด๋ฅผ ํ ๋๋ก ์ต์ข ๊ตฌ์ฑ์ ๋ณ๋์ ์ ์ฅ์์ ์ ์ฅํ๋ ๊ฒ์ด ํ๋นํ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ๊ตฌ์ฑ์ ๋ ๋ถ๋ถ์ผ๋ก ๋ถํ ํ ์ ์์ต๋๋ค. ํ๋๋ ๊ณต๊ฐ์ ์ผ๋ก ์ก์ธ์ค ๊ฐ๋ฅํ ๊ตฌ์ฑ ์ค์ ์ ํฌํจํ๊ณ ๋ค๋ฅธ ํ๋๋ ์ ํ๋ ์ค์ ์ ํฌํจํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋๋ถ๋ถ์ ๊ฐ๋ฐ์๋ ์ผ๋ฐ ์ค์ ์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ถ๋ฆฌ๋ ๊ธฐ๋ณธ๊ฐ์ด ํฌํจ๋ ์ค๊ฐ ํน์ฑ์ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
๊ฐ๋ฅํ ๋ณํ
์ปดํ์ผ๋ ๊ตฌ์ฑ์ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ๋์๊ณผ ๋น๊ตํด ๋ณด๊ฒ ์ต๋๋ค.
- ๋์ ์ปดํจํฐ์ ํ ์คํธ ํ์ผ์ ๋๋ค.
- ์ค์ ์ง์ค์ ํค-๊ฐ ์ ์ฅ์(
etcd
/zookeeper
). - ํ๋ก์ธ์ค๋ฅผ ๋ค์ ์์ํ์ง ์๊ณ ๋ ์ฌ๊ตฌ์ฑ/๋ค์ ์์ํ ์ ์๋ ํ๋ก์ธ์ค ๊ตฌ์ฑ ์์์ ๋๋ค.
- ์ํฐํฉํธ ๋ฐ ๋ฒ์ ์ ์ด ์ธ๋ถ์ ๊ตฌ์ฑ์ ์ ์ฅํฉ๋๋ค.
ํ ์คํธ ํ์ผ์ ์์ ๋ณ๊ฒฝ ์ฌํญ์๋ ์๋นํ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค. ์์คํ ๊ด๋ฆฌ์๋ ์๊ฒฉ ๋ ธ๋์ ๋ก๊ทธ์ธํ์ฌ ์ ์ ํ ํ์ผ์ ๋ณ๊ฒฝํ๊ณ ์๋น์ค๋ฅผ ๋ค์ ์์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๊ท๋ชจ ์์คํ ์ ๊ฒฝ์ฐ ์ด๋ฌํ ์ ์ฐ์ฑ์ ๋ฐ๋์งํ์ง ์์ ์ ์์ต๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ๋ค๋ฅธ ์์คํ ์ ํ์ ์ ๋จ๊ธฐ์ง ์์ต๋๋ค. ์๋ฌด๋ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฒํ ํ์ง ์์ต๋๋ค. ์ ํํ ๋๊ฐ ์ด๋ค ์ด์ ๋ก ๋ณ๊ฒฝ์ ํ๋์ง ํ์ ํ๊ธฐ๋ ์ด๋ ต์ต๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ํ ์คํธ๋์ง ์์ต๋๋ค. ์์คํ ์ด ๋ถ์ฐ๋ ๊ฒฝ์ฐ ๊ด๋ฆฌ์๋ ๋ค๋ฅธ ๋ ธ๋์์ ํด๋น ๋ณ๊ฒฝ์ ์ํํ๋ ๊ฒ์ ์์ด๋ฒ๋ฆด ์ ์์ต๋๋ค.
(๋ํ ์ปดํ์ผ๋ ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ค๊ณ ํด์ ๋์ค์ ํ
์คํธ ํ์ผ์ ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ์ด ๋ซํ๋ ๊ฒ์ ์๋๋๋ค. ์ถ๋ ฅ๊ณผ ๋์ผํ ์ ํ์ ์์ฑํ๋ ํ์ ๋ฐ ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค. Config
, ํ
์คํธ ํ์ผ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ปดํ์ผ๋ ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ ์์คํ
์ ๋ณต์ก์ฑ์ ํ
์คํธ ํ์ผ์ ์ฌ์ฉํ๋ ์์คํ
์ ๋ณต์ก์ฑ๋ณด๋ค ๋ค์ ์ ์ต๋๋ค. ํ
์คํธ ํ์ผ์๋ ์ถ๊ฐ ์ฝ๋๊ฐ ํ์ํฉ๋๋ค.)
์ค์ ์ง์ค์ ํค-๊ฐ ์ ์ฅ์๋ ๋ถ์ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฉํ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐฐํฌํ๊ธฐ ์ํ ์ข์ ๋ฉ์ปค๋์ฆ์
๋๋ค. ๊ตฌ์ฑ ๋งค๊ฐ๋ณ์๊ฐ ๋ฌด์์ธ์ง, ๋ฐ์ดํฐ๊ฐ ๋ฌด์์ธ์ง ๊ฒฐ์ ํด์ผ ํฉ๋๋ค. ํจ์๋ฅผ ํ๋ ๊ฐ์ง์ C => A => B
๋ฐ ๋งค๊ฐ๋ณ์ C
๊ฑฐ์ ๋ณ๊ฒฝ๋์ง ์์ผ๋ฉฐ ๋ฐ์ดํฐ A
- ์์ฃผ. ์ด ๊ฒฝ์ฐ์ ์ฐ๋ฆฌ๋ ์ด๋ ๊ฒ ๋งํ ์ ์์ต๋๋ค. C
- ๊ตฌ์ฑ ๋งค๊ฐ๋ณ์ ๋ฐ A
- ๋ฐ์ดํฐ. ๊ตฌ์ฑ ๋งค๊ฐ๋ณ์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ณด๋ค ๋ ์์ฃผ ๋ณ๊ฒฝ๋๋ค๋ ์ ์์ ๋ฐ์ดํฐ์ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. ๋ํ ๋ฐ์ดํฐ๋ ์ผ๋ฐ์ ์ผ๋ก ํ ์์ค(์ฌ์ฉ์)์์ ๊ฐ์ ธ์ค๊ณ ๊ตฌ์ฑ ๋งค๊ฐ๋ณ์๋ ๋ค๋ฅธ ์์ค(์์คํ
๊ด๋ฆฌ์)์์ ๊ฐ์ ธ์ต๋๋ค.
ํ๋ก๊ทธ๋จ์ ๋ค์ ์์ํ์ง ์๊ณ ๊ฑฐ์ ๋ณ๊ฒฝ๋์ง ์๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ๋ ๊ฒฝ์ฐ, ์ด๋ป๊ฒ๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ๊ณ , ์๋ชป๋ ๊ฐ์ ์ ์ฅํ๊ณ , ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ํ์ธํ๊ณ , ์ฒ๋ฆฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋จ์ด ๋ณต์กํด์ง ์ ์์ต๋๋ค. ๋ฐ๋ผ์, ํ๋ก๊ทธ๋จ์ ๋ณต์ก๋๋ฅผ ์ค์ด๋ ๊ด์ ์์๋, ํ๋ก๊ทธ๋จ ๋์ ์ค์ ๋ณ๊ฒฝ๋ ์ ์๋ ๋งค๊ฐ๋ณ์์ ์๋ฅผ ์ค์ด๋ ๊ฒ(ํน์ ๊ทธ๋ฌํ ๋งค๊ฐ๋ณ์๋ฅผ ์ ํ ์ง์ํ์ง ์๋ ๊ฒ)์ด ํฉ๋ฆฌ์ ์ด๋ค.
์ด ๊ฒ์๋ฌผ์ ๋ชฉ์ ์ ๋ฐ๋ผ ์ ์ ๋งค๊ฐ๋ณ์์ ๋์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ตฌ๋ถํ๊ฒ ์ต๋๋ค. ์๋น์ค ๋ ผ๋ฆฌ๋ก ์ธํด ํ๋ก๊ทธ๋จ ์๋ ์ค์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ ํด๋น ๋งค๊ฐ๋ณ์๋ฅผ ๋์ ์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ต์ ์ ์ ์ ์ด๋ฉฐ ์ปดํ์ผ๋ ๊ตฌ์ฑ์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ๋์ ์ฌ๊ตฌ์ฑ์ ๊ฒฝ์ฐ ์ด์ ์ฒด์ ํ๋ก์ธ์ค๋ฅผ ๋ค์ ์์ํ๋ ๋ฐฉ๋ฒ๊ณผ ์ ์ฌํ๊ฒ ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋จ์ ์ผ๋ถ๋ฅผ ๋ค์ ์์ํ๋ ๋ฉ์ปค๋์ฆ์ด ํ์ํ ์ ์์ต๋๋ค. (์ค์๊ฐ ์ฌ๊ตฌ์ฑ์ ์์คํ ์ ๋ณต์ก์ฑ์ ์ฆ๊ฐ์ํค๋ฏ๋ก ํผํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ฐ๋ฅํ๋ค๋ฉด ํ๋ก์ธ์ค๋ฅผ ๋ค์ ์์ํ๊ธฐ ์ํด ํ์ค OS ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.)
์ฌ๋๋ค์ด ๋์ ์ฌ๊ตฌ์ฑ์ ๊ณ ๋ คํ๊ฒ ๋ง๋๋ ์ ์ ๊ตฌ์ฑ ์ฌ์ฉ์ ์ค์ํ ์ธก๋ฉด ์ค ํ๋๋ ๊ตฌ์ฑ ์
๋ฐ์ดํธ(๋ค์ดํ์) ํ ์์คํ
์ ์ฌ๋ถํ
ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์
๋๋ค. ์ค์ ๋ก ์ ์ ๊ตฌ์ฑ์ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ ์ ๊ฐ์ ์ ์ฉํ๋ ค๋ฉด ์์คํ
์ ๋ค์ ์์ํด์ผ ํฉ๋๋ค. ๊ฐ๋ ์ค์ง ์๊ฐ ๋ฌธ์ ๋ ์์คํ
๋ง๋ค ์ฌ๊ฐ๋๊ฐ ๋ค๋ฆ
๋๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋ ๋ก๋๊ฐ ์ต์์ผ ๋ ์ฌ๋ถํ
์ ์์ฝํ ์ ์์ต๋๋ค. ์ง์์ ์ธ ์๋น์ค ์ ๊ณต์ด ํ์ํ ๊ฒฝ์ฐ ๊ตฌํํ ์ ์์ต๋๋ค.
์ด์ ์ํฐํฉํธ ๋ด๋ถ ๋๋ ์ธ๋ถ์ ๊ตฌ์ฑ์ ์ ์ฅํ๋ ๋ฌธ์ ๋ฅผ ๊ณ ๋ คํด ๋ณด๊ฒ ์ต๋๋ค. ๊ตฌ์ฑ์ ์ํฐํฉํธ ๋ด๋ถ์ ์ ์ฅํ๋ค๋ฉด ์ ์ด๋ ์ํฐํฉํธ๋ฅผ ์กฐ๋ฆฝํ๋ ๋์ ๊ตฌ์ฑ์ ์ ํ์ฑ์ ํ์ธํ ๊ธฐํ๊ฐ ์์์ต๋๋ค. ๊ตฌ์ฑ์ด ์ ์ด๋ ์ํฐํฉํธ ์ธ๋ถ์ ์๋ ๊ฒฝ์ฐ ์ด ํ์ผ์ ๋ณ๊ฒฝํ ์ฌ๋๊ณผ ๊ทธ ์ด์ ๋ฅผ ์ถ์ ํ๊ธฐ ์ด๋ ต์ต๋๋ค. ์ผ๋ง๋ ์ค์ํฉ๋๊น? ์ฐ๋ฆฌ์ ์๊ฒฌ์ผ๋ก๋ ๋ง์ ์์ฐ ์์คํ ์์ ์์ ์ ์ด๊ณ ๊ณ ํ์ง์ ๊ตฌ์ฑ์ ๊ฐ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ํฐํฉํธ ๋ฒ์ ์ ์ฌ์ฉํ๋ฉด ์์ฑ ์๊ธฐ, ํฌํจ๋ ๊ฐ, ํ์ฑํ/๋นํ์ฑํ๋๋ ๊ธฐ๋ฅ, ๊ตฌ์ฑ ๋ณ๊ฒฝ์ ๋ํ ์ฑ ์์ด ์๋ ์ฌ๋์ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ๋ฌผ๋ก ๊ตฌ์ฑ์ ์ํฐํฉํธ ๋ด๋ถ์ ์ ์ฅํ๋ ค๋ฉด ์ฝ๊ฐ์ ๋ ธ๋ ฅ์ด ํ์ํ๋ฏ๋ก ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ๊ฒฐ์ ์ ๋ด๋ ค์ผ ํฉ๋๋ค.
์ฐฌ๋ฐ ์๋ก
์ ์๋ ๊ธฐ์ ์ ์ฅ๋จ์ ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์ถ์ต๋๋ค.
์ฅ์
๋ค์์ ์ปดํ์ผ๋ ๋ถ์ฐ ์์คํ ๊ตฌ์ฑ์ ์ฃผ์ ๊ธฐ๋ฅ ๋ชฉ๋ก์ ๋๋ค.
- ์ ์ ๊ตฌ์ฑ ํ์ธ. ํ์ ํ ์ ์๊ฒ ํด์ค๋ค
๊ตฌ์ฑ์ด ์ ํํฉ๋๋ค. - ํ๋ถํ ๊ตฌ์ฑ ์ธ์ด. ์ผ๋ฐ์ ์ผ๋ก ๋ค๋ฅธ ๊ตฌ์ฑ ๋ฐฉ๋ฒ์ ์ต๋ ๋ฌธ์์ด ๋ณ์ ๋์ฒด์ผ๋ก ์ ํ๋ฉ๋๋ค. Scala๋ฅผ ์ฌ์ฉํ๋ฉด ๊ตฌ์ฑ์ ๊ฐ์ ํ๊ธฐ ์ํด ๋ค์ํ ์ธ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ฐ๋ฆฌ๋ ๋ค์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ๊ฐ์ ๋ํ ํน์ฑ, ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋งค๊ฐ๋ณ์๋ฅผ ๊ทธ๋ฃนํํ๋ฉด ๋๋ฌ์ธ๋ ๋ฒ์์์ ํ ๋ฒ๋ง ์ ์ธ๋(DRY) ๊ฐ์ ์ฐธ์กฐํ ์ ์์ต๋๋ค. ๊ตฌ์ฑ ๋ด์์ ์ง์ ๋ชจ๋ ํด๋์ค๋ฅผ ์ธ์คํด์คํํ ์ ์์ต๋๋ค(Seq
,Map
, ์ฌ์ฉ์ ์ ์ ํด๋์ค). - DSL. Scala์๋ DSL์ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ ๋ค์ํ ์ธ์ด ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ ํ์ฉํ๊ณ ๋์ ์ฌ์ฉ์ ๊ทธ๋ฃน์ ๋ณด๋ค ํธ๋ฆฌํ ๊ตฌ์ฑ ์ธ์ด๋ฅผ ๊ตฌํํ์ฌ ์ต์ํ ๋๋ฉ์ธ ์ ๋ฌธ๊ฐ๊ฐ ๊ตฌ์ฑ์ ์ฝ์ ์ ์๋๋ก ํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ ๋ฌธ๊ฐ๋ ๊ตฌ์ฑ ๊ฒํ ํ๋ก์ธ์ค์ ์ฐธ์ฌํ ์ ์์ต๋๋ค.
- ๋ ธ๋ ๊ฐ ๋ฌด๊ฒฐ์ฑ ๋ฐ ๋๊ธฐํ. ์ ์ฒด ๋ถ์ฐ ์์คํ ์ ๊ตฌ์ฑ์ ๋จ์ผ ์ง์ ์ ์ ์ฅํ๋ ๊ฒ์ ์ฅ์ ์ค ํ๋๋ ๋ชจ๋ ๊ฐ์ด ์ ํํ ํ ๋ฒ ์ ์ธ๋ ๋ค์ ํ์ํ ๋๋ง๋ค ์ฌ์ฌ์ฉ๋๋ค๋ ๊ฒ์ ๋๋ค. ํฌํ ์ ํ์ ์ฌ์ฉํ์ฌ ํฌํธ๋ฅผ ์ ์ธํ๋ฉด ๋ ธ๋๊ฐ ๋ชจ๋ ์ฌ๋ฐ๋ฅธ ์์คํ ๊ตฌ์ฑ์์ ํธํ ๊ฐ๋ฅํ ํ๋กํ ์ฝ์ ์ฌ์ฉํ๊ณ ์์์ ๋ณด์ฅํฉ๋๋ค. ๋ ธ๋ ๊ฐ์ ๋ช ์์ ์ธ ํ์ ์ข ์์ฑ์ด ์์ผ๋ฉด ๋ชจ๋ ์๋น์ค๊ฐ ์ฐ๊ฒฐ๋ฉ๋๋ค.
- ๊ณ ํ์ง์ ๋ณํ. ๊ณตํต ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ์ ๋ณ๊ฒฝํ๋ฉด ๊ตฌ์ฑ์ ๋ํ ๋์ ํ์ง ํ์ค์ ๋ฌ์ฑํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.
- ๋์ ๊ตฌ์ฑ ์ ๋ฐ์ดํธ. ๊ตฌ์ฑ ๋ณ๊ฒฝ ํ ์๋ ์์คํ ๋ฐฐํฌ๋ฅผ ํตํด ๋ชจ๋ ๋ ธ๋๊ฐ ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ๋จ์ํ. ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๊ตฌ๋ฌธ ๋ถ์, ๊ตฌ์ฑ ํ์ธ ๋๋ ์๋ชป๋ ๊ฐ ์ฒ๋ฆฌ๊ฐ ํ์ํ์ง ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ก์ฑ์ด ์ค์ด๋ญ๋๋ค. (์ด ์์ ์์ ๊ด์ฐฐ๋ ๊ตฌ์ฑ ๋ณต์ก์ฑ ์ค ์ผ๋ถ๋ ์ปดํ์ผ๋ ๊ตฌ์ฑ์ ์์ฑ์ด ์๋๋ผ ๋ ํฐ ์ ํ ์์ ์ฑ์ ์ ๊ณตํ๋ ค๋ ์๊ตฌ์ ๋ฐ๋ฅธ ์์์ ์ธ ๊ฒฐ์ ์ผ ๋ฟ์ ๋๋ค.) ์ผ๋ฐ์ ์ธ ๊ตฌ์ฑ์ผ๋ก ๋์๊ฐ๋ ๊ฒ์ ๋งค์ฐ ์ฝ์ต๋๋ค. ๋๋ฝ๋ ๋ถ๋ถ์ ๊ตฌํํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๋ถ์. ๋ฐ๋ผ์ ์๋ฅผ ๋ค์ด ์ปดํ์ผ๋ ๊ตฌ์ฑ์ผ๋ก ์์ํ์ฌ ์ค์ ๋ก ํ์ํ ๋๊น์ง ๋ถํ์ํ ๋ถ๋ถ์ ๊ตฌํ์ ์ฐ๊ธฐํ ์ ์์ต๋๋ค.
- ํ์ธ๋ ๊ตฌ์ฑ. ๊ตฌ์ฑ ๋ณ๊ฒฝ์ ๋ค๋ฅธ ๋ณ๊ฒฝ์ ์ผ๋ฐ์ ์ธ ์ด๋ช ์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ์ป๋ ์ถ๋ ฅ์ ๊ณ ์ ํ ๋ฒ์ ์ ์ํฐํฉํธ์ ๋๋ค. ์๋ฅผ ๋ค์ด ํ์ํ ๊ฒฝ์ฐ ์ด๋ฅผ ํตํด ์ด์ ๋ฒ์ ์ ๊ตฌ์ฑ์ผ๋ก ๋์๊ฐ ์ ์์ต๋๋ค. XNUMX๋ ์ ์ ๊ตฌ์ฑ์ ์ฌ์ฉํ ์๋ ์์ผ๋ฉฐ ์์คํ ์ ์ ํํ ๋์ผํ๊ฒ ์๋ํฉ๋๋ค. ์์ ์ ์ธ ๊ตฌ์ฑ์ ๋ถ์ฐ ์์คํ ์ ์์ธก ๊ฐ๋ฅ์ฑ๊ณผ ์ ๋ขฐ์ฑ์ ํฅ์์ํต๋๋ค. ๊ตฌ์ฑ์ ์ปดํ์ผ ๋จ๊ณ์์ ๊ณ ์ ๋๋ฏ๋ก ํ๋ก๋์ ์์ ์ด๋ฅผ ์์กฐํ๋ ๊ฒ์ ๋งค์ฐ ์ด๋ ต์ต๋๋ค.
- ๋ชจ๋์ฑ. ์ ์๋ ํ๋ ์์ํฌ๋ ๋ชจ๋์์ด๋ฉฐ ๋ชจ๋์ ๋ค์ํ ๋ฐฉ์์ผ๋ก ๊ฒฐํฉํ์ฌ ๋ค์ํ ์์คํ ์ ๋ง๋ค ์ ์์ต๋๋ค. ํนํ, ํ ์ค์์์์๋ ๋จ์ผ ๋ ธ๋์์ ์คํ๋๊ณ ๋ค๋ฅธ ์ค์์์์๋ ์ฌ๋ฌ ๋ ธ๋์์ ์คํ๋๋๋ก ์์คํ ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์์คํ ์ ํ๋ก๋์ ์ธ์คํด์ค์ ๋ํด ์ฌ๋ฌ ๊ตฌ์ฑ์ ์์ฑํ ์ ์์ต๋๋ค.
- ํ ์คํธ. ๊ฐ๋ณ ์๋น์ค๋ฅผ ๋ชจ์ ๊ฐ์ฒด๋ก ๋์ฒดํ๋ฉด ํ ์คํธ์ ํธ๋ฆฌํ ์ฌ๋ฌ ๋ฒ์ ์ ์์คํ ์ ์ป์ ์ ์์ต๋๋ค.
- ํตํฉ ํ ์คํธ. ์ ์ฒด ๋ถ์ฐ ์์คํ ์ ๋ํด ๋จ์ผ ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ฉด ํตํฉ ํ ์คํธ์ ์ผ๋ถ๋ก ํต์ ๋ ํ๊ฒฝ์์ ๋ชจ๋ ๊ตฌ์ฑ ์์๋ฅผ ์คํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ผ๋ถ ๋ ธ๋์ ์ก์ธ์คํ ์ ์๋ ์ํฉ์ ์๋ฎฌ๋ ์ดํธํ๋ ๊ฒ์ ์ฝ์ต๋๋ค.
๋จ์ ๋ฐ ์ ํ ์ฌํญ
์ปดํ์ผ๋ ๊ตฌ์ฑ์ ๋ค๋ฅธ ๊ตฌ์ฑ ์ ๊ทผ ๋ฐฉ์๊ณผ ๋ค๋ฅด๋ฉฐ ์ผ๋ถ ์ ํ๋ฆฌ์ผ์ด์ ์๋ ์ ํฉํ์ง ์์ ์ ์์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ๋จ์ ์ ๋๋ค.
- ์ ์ ๊ตฌ์ฑ. ๋๋ก๋ ๋ชจ๋ ๋ณดํธ ๋ฉ์ปค๋์ฆ์ ์ฐํํ์ฌ ํ๋ก๋์ ํ๊ฒฝ์์ ๊ตฌ์ฑ์ ์ ์ํ๊ฒ ์์ ํด์ผ ํ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ต์ํ ์ปดํ์ผ๊ณผ ์๋ ๋ฐฐํฌ๋ ์ฌ์ ํ ํ์ํฉ๋๋ค. ์ด๋ ์ ๊ทผ ๋ฐฉ์์ ์ ์ฉํ ๊ธฐ๋ฅ์ธ ๋์์ ์ด๋ค ๊ฒฝ์ฐ์๋ ๋จ์ ์ด๊ธฐ๋ ํฉ๋๋ค.
- ๊ตฌ์ฑ ์์ฑ. ์๋ ๋๊ตฌ๋ก ๊ตฌ์ฑ ํ์ผ์ ์์ฑํ ๊ฒฝ์ฐ ๋น๋ ์คํฌ๋ฆฝํธ๋ฅผ ํตํฉํ๊ธฐ ์ํด ์ถ๊ฐ ๋ ธ๋ ฅ์ด ํ์ํ ์ ์์ต๋๋ค.
- ๋๊ตฌ. ํ์ฌ ๊ตฌ์ฑ ์์ ์ ์ํด ์ค๊ณ๋ ์ ํธ๋ฆฌํฐ์ ๊ธฐ์ ์ ํ ์คํธ ํ์ผ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ์ด๋ฌํ ์ ํธ๋ฆฌํฐ/๊ธฐ์ ์ค ์ผ๋ถ๋ ์ปดํ์ผ๋ ๊ตฌ์ฑ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ํ๋์ ๋ณํ๊ฐ ํ์ํฉ๋๋ค. ๊ฐ๋ฐ์์ DevOps๋ ํ ์คํธ ํ์ผ์ ์ต์ํฉ๋๋ค. ๊ตฌ์ฑ์ ์ปดํ์ผํ๋ค๋ ์์ด๋์ด๋ ๋ค์ ์์์น ๋ชปํ ์ด๋ก์ ์ผ ์ ์์ผ๋ฉฐ ๊ฑฐ๋ถ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค.
- ๊ณ ํ์ง์ ๊ฐ๋ฐ ํ๋ก์ธ์ค๊ฐ ํ์ํฉ๋๋ค. ์ปดํ์ผ๋ ๊ตฌ์ฑ์ ํธ์ํ๊ฒ ์ฌ์ฉํ๋ ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์ (CI/CD) ๊ตฌ์ถ ๋ฐ ๋ฐฐํฌ ํ๋ก์ธ์ค์ ์ ์ฒด ์๋ํ๊ฐ ํ์ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋นํ ๋ถํธํ ๊ฒ์ ๋๋ค.
๋ํ ์ปดํ์ผ๋ ๊ตฌ์ฑ์ ์์ด๋์ด์ ๊ด๋ จ์ด ์๋ ๊ณ ๋ ค๋ ์์ ์ฌ๋ฌ ๊ฐ์ง ์ ํ ์ฌํญ์ ๋ํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
- ๋
ธ๋์์ ์ฌ์ฉ๋์ง ์๋ ๋ถํ์ํ ๊ตฌ์ฑ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ฉด ์ปดํ์ผ๋ฌ๋ ๋๋ฝ๋ ๊ตฌํ์ ๊ฐ์งํ๋ ๋ฐ ๋์์ ์ฃผ์ง ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ ์ผ์ดํฌ ํจํด์ ๋ฒ๋ฆฌ๊ณ ๋ณด๋ค ์๊ฒฉํ ์ ํ์ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด,
HList
๋๋ ๊ตฌ์ฑ์ ๋ํ๋ด๋ ๋์์ ๋ฐ์ดํฐ ์ ํ(์ผ์ด์ค ํด๋์ค)์ ๋๋ค. - ๊ตฌ์ฑ ํ์ผ์๋ ๊ตฌ์ฑ ์์ฒด์ ๊ด๋ จ๋์ง ์์ ์ค์ด ์์ต๋๋ค. (
package
,import
,๊ฐ์ฒด ์ ์ธ;override def
๊ธฐ๋ณธ๊ฐ์ด ์๋ ๋งค๊ฐ๋ณ์์ ๊ฒฝ์ฐ). ์์ฒด DSL์ ๊ตฌํํ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ๋ถ๋ถ์ ์ผ๋ก ํผํ ์ ์์ต๋๋ค. ๋ํ ๋ค๋ฅธ ์ ํ์ ๊ตฌ์ฑ(์: XML)๋ ํ์ผ ๊ตฌ์กฐ์ ํน์ ์ ํ์ ์ ์ฉํฉ๋๋ค. - ์ด ๊ฒ์๋ฌผ์ ๋ชฉ์ ์ ๋ฐ๋ผ ์ ์ฌํ ๋ ธ๋ ํด๋ฌ์คํฐ์ ๋์ ์ฌ๊ตฌ์ฑ์ ๊ณ ๋ คํ์ง ์์ต๋๋ค.
๊ฒฐ๋ก
์ด ๊ฒ์๋ฌผ์์ ์ฐ๋ฆฌ๋ Scala ์ ํ ์์คํ ์ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์์ค ์ฝ๋์์ ๊ตฌ์ฑ์ ํํํ๋ ์์ด๋์ด๋ฅผ ํ๊ตฌํ์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ XML ๋๋ ํ ์คํธ ํ์ผ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ธฐ์กด ๊ตฌ์ฑ ๋ฐฉ๋ฒ์ ๋์ฒดํ์ฌ ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ์ ์์ ๋ Scala๋ก ๊ตฌํ๋์์ง๋ง ๋์ผํ ์์ด๋์ด๊ฐ ๋ค๋ฅธ ์ปดํ์ผ๋ ์ธ์ด(์: Kotlin, C#, Swift ๋ฑ)๋ก ์ฎ๊ฒจ์ง ์ ์์ต๋๋ค. ๋ค์ ํ๋ก์ ํธ ์ค ํ๋์์ ์ด ์ ๊ทผ ๋ฐฉ์์ ์๋ํด ๋ณผ ์ ์์ผ๋ฉฐ, ์๋ํ์ง ์์ผ๋ฉด ํ ์คํธ ํ์ผ๋ก ์ด๋ํ์ฌ ๋๋ฝ๋ ๋ถ๋ถ์ ์ถ๊ฐํ์ธ์.
๋น์ฐํ ์ปดํ์ผ๋ ๊ตฌ์ฑ์๋ ๊ณ ํ์ง ๊ฐ๋ฐ ํ๋ก์ธ์ค๊ฐ ํ์ํฉ๋๋ค. ๊ทธ ๋๊ฐ๋ก ๊ตฌ์ฑ์ ๋์ ํ์ง๊ณผ ์ ๋ขฐ์ฑ์ด ๋ณด์ฅ๋ฉ๋๋ค.
๊ณ ๋ ค๋ ์ ๊ทผ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ด ํ์ฅ๋ ์ ์์ต๋๋ค.
- ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํ์ผ ํ์ ๊ฒ์ฌ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
- DSL์ ๊ตฌํํ์ฌ ์ต์ข ์ฌ์ฉ์๊ฐ ์ก์ธ์คํ ์ ์๋ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ์๋ ๊ตฌ์ฑ ์กฐ์ ์ ํตํด ๋์ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํด๋ฌ์คํฐ์ ๋ ธ๋ ์๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด (1) ๊ฐ ๋ ธ๋๊ฐ ์ฝ๊ฐ ๋ค๋ฅธ ๊ตฌ์ฑ์ ๋ฐ์์ผ ํฉ๋๋ค. (2) ํด๋ฌ์คํฐ ๊ด๋ฆฌ์๋ ์ ๋ ธ๋์ ๋ํ ์ ๋ณด๋ฅผ ๋ฐ์์ต๋๋ค.
๊ฐ์ฌ์ ๋ง
๋๋ ์ด์ ๊ธฐ์ฌ์ ๋ํ ๊ฑด์ค์ ์ธ ๋นํ์ ๋ํด Andrei Saksonov, Pavel Popov ๋ฐ Anton Nekhaev์๊ฒ ๊ฐ์ฌ๋ฅผ ํํ๊ณ ์ถ์ต๋๋ค.
์ถ์ฒ : habr.com