액터 시스템 설계
액터 계층을 설계하고 구현하며 액터 동작을 정의하고 메시지를 송수신하는 방법을 배웁니다.
액터 시스템 설계은(는) CoddyKit의 무료 Scala for Backend Engineering & Functional Programming 강의입니다. 이것은 3개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Scala for Backend Engineering & Functional Programming 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Scala for Backend Engineering & Functional Programming 강의에는 총 3개의 강의가 포함되어 있습니다.
액터 시스템 설계: 소개
레슨 2에 오신 것을 환영합니다! 이전 레슨에서는 Akka 액터 모델의 기초를 배웠습니다. 이제 Akka 액터 시스템 설계를 자세히 살펴보겠습니다.
잘 설계된 액터 시스템은 견고하고 확장성이 높으며 유지 관리하기 쉽습니다. 액터를 구성하고 동작을 정의하며 효과적으로 통신하도록 만드는 방법을 알아보겠습니다.
액터 계층 이해하기
Akka 액터는 파일 시스템과 매우 비슷한 트리 형태의 계층 구조로 구성됩니다. '루트' 액터를 제외한 모든 액터에는 부모가 있습니다.
- 부모-자식 관계: 다른 액터를 생성한 액터가 해당 액터의 부모가 됩니다.
- 감독: 이 계층 구조는 Akka의 장애 허용에 매우 중요합니다. 부모는 자식을 감독할 책임이 있습니다(자세한 내용은 다음 레슨에서 다룹니다!).
- 경로 기반 주소 지정: 각 액터에는 계층 구조에서의 위치를 나타내는
/user/parentActor/childActor와 같은 고유한 경로가 있습니다.
ActorSystem 설정하기
ActorSystem은 모든 Akka 애플리케이션의 진입점입니다. 액터에 필요한 스레드 풀과 스케줄러를 비롯한 리소스를 관리합니다.
애플리케이션마다 한 번 생성한 다음, 이를 사용하여 최상위 액터를 생성합니다. 전체 액터 애플리케이션을 담는 컨테이너와 같다고 생각하면 됩니다.
ActorSystem을 생성하는 다음의 간단한 코드를 실행해 보세요.
import akka.actor.ActorSystem
object AkkaSystemApp {
def main(args: Array[String]): Unit = {
// Create an ActorSystem with a unique name
val system = ActorSystem("MyFirstActorSystem")
println("ActorSystem created: " + system.name)
// Remember to terminate the system when done!
system.terminate()
}
}액터 동작 정의하기
액터의 동작은 액터가 다양한 메시지에 어떻게 반응하는지를 결정합니다. Scala에서는 Actor 트레이트를 확장하고 receive 메서드를 구현하여 동작을 정의합니다.
receive메서드는 들어오는 메시지를 특정 작업에 연결하는 부분 함수입니다.- 각 액터는 메시지를 한 번에 하나씩 순차적으로 처리하므로 내부 상태의 스레드 안전성이 보장됩니다.
ActorRef: 액터의 주소
액터 인스턴스와 직접 상호 작용하지는 않습니다. 대신 ActorRef에 메시지를 보냅니다. ActorRef를 액터의 우편 주소라고 생각해 보세요.
- 시스템 내 특정 액터를 나타내는 핸들입니다.
ActorRef로 보낸 메시지는 액터의 우편함에 들어갑니다.actorOf를 사용하여 액터를 생성할 때ActorRef를 얻습니다.
액터에 메시지 보내기
액터가 통신하는 주된 방법은 메시지를 보내는 것입니다. 메시지를 보내는 가장 일반적인 방법은 !('텔'이라고 읽음) 메서드를 사용하는 것입니다.
receiverActorRef ! "Your message here"
tell 메서드는 비동기적이며 전송 후 잊기 방식으로 동작합니다. 메시지를 보내고 응답을 기다리지 않습니다.
액터를 생성하고 메시지를 보내는 과정을 함께 살펴보겠습니다.
import akka.actor.{Actor, ActorRef, Props, ActorSystem}
// 1. Define the actor's behavior
class GreeterActor extends Actor {
def receive = {
case "hello" => println(s"Greeter: Hello from ${self.path.name}!")
case msg: String => println(s"Greeter: Received message: '$msg'")
case _ => println("Greeter: Received something unexpected!")
}
}
object SimpleActorApp {
def main(args: Array[String]): Unit = {
// 2. Create the ActorSystem
val system = ActorSystem("GreeterSystem")
// 3. Create a top-level actor and get its ActorRef
val greeter: ActorRef = system.actorOf(Props[GreeterActor], "myGreeter")
// 4. Send messages to the actor using '!'
greeter ! "hello"
greeter ! "How are you doing today?"
greeter ! 123 // This will match the _ case
// Give actors time to process messages, then terminate
Thread.sleep(1000)
system.terminate()
}
}자식 액터 생성하기
액터는 다른 액터를 생성하여 앞에서 살펴본 계층을 구성할 수 있습니다. 부모 액터는 context.actorOf를 사용하여 자식 액터를 생성합니다.
context.actorOf: 액터가 자식 액터를 생성할 때 사용합니다.system.actorOf: 애플리케이션이 최상위(보호자) 액터를 생성할 때 사용합니다.
자식 액터를 생성하면 시스템을 구성하고 작업을 위임하며 실패를 격리하는 데 도움이 됩니다.
부모와 자식 간 통신
액터는 서로의 ActorRef에 메시지를 보내며 통신합니다. 자식 액터는 context.parent를 통해 부모의 ActorRef를 가져올 수 있습니다. 메시지를 보낸 사람에게 응답하려면 액터에서 sender()를 사용할 수 있습니다.
부모가 자식을 생성하고 작업을 지시한 다음, 자식이 작업을 완료했을 때 결과를 보고하는 예제를 살펴보겠습니다.
import akka.actor.{Actor, ActorRef, Props, ActorSystem}
import scala.concurrent.ExecutionContext.Implicits.global
// Child Actor Definition: Does work and replies to sender
class ChildActor extends Actor {
def receive = {
case "work" =>
println(s"ChildActor (${self.path.name}): Doing work from ${sender().path.name}")
sender() ! "done" // Reply 'done' to the sender (parent)
}
}
// Parent Actor Definition: Creates child, sends work, receives reply
class ParentActor extends Actor {
// Create a child actor when the parent starts
val child: ActorRef = context.actorOf(Props[ChildActor], "myChild")
def receive = {
case "start" =>
println("ParentActor: Kicking off child's work.")
child ! "work" // Tell the child to do 'work'
case "done" =>
println(s"ParentActor: Child ${sender().path.name} reported 'done'.")
context.stop(child) // Stop the child actor
context.stop(self) // Stop the parent actor
}
}
object HierarchyApp {
def main(args: Array[String]): Unit = {
val system = ActorSystem("HierarchySystem")
val parent: ActorRef = system.actorOf(Props[ParentActor], "parentActor")
parent ! "start" // Start the interaction
// Wait for the system to terminate (actors will stop themselves)
system.whenTerminated.onComplete(_ => println("ActorSystem terminated."))
}
}액터를 안전하게 중지하기
더 이상 필요하지 않은 액터는 리소스를 해제할 수 있도록 안전하게 중지해야 합니다. 액터를 중지하는 방법은 다음과 같습니다.
context.stop(self): 액터가 스스로 중지합니다.context.stop(childRef): 부모가 자식 중 하나를 중지합니다.system.stop(actorRef): 최상위 액터에 사용하지만, 일반적으로는 전체 시스템을 중지합니다.
액터가 중지되면 종료되기 전에 우편함에 있는 모든 메시지를 처리합니다. 자식 액터도 재귀적으로 중지됩니다.
빠른 확인: 액터 설계
다음 Akka 액터 코드 일부를 살펴보세요. MyParentActor가 최초의 'request' 메시지를 보낸 사람인 경우, MyChildActor가 자신을 생성한 부모인 MyParentActor에게 메시지를 돌려보내는 올바른 방법은 무엇일까요?
복습: 액터 시스템 설계
잘하셨습니다! 이번 레슨에서는 Akka 액터 시스템 설계의 다음 핵심 내용을 다뤘습니다.
- 액터는 계층으로 구성되며, 이는 감독과 구조화에 매우 중요합니다.
ActorSystem은 애플리케이션에서 Akka로 들어가는 진입점입니다.receive메서드를 사용하여 액터의 동작을 정의합니다.ActorRef는 메시지를 보내기 위한 주소입니다.- 액터는
!(tell) 메서드를 사용하여 비동기적으로 통신합니다. - 부모는
context.actorOf로 자식을 생성하고, 자식은sender()를 사용하여 응답할 수 있습니다. - 액터는
context.stop()을 사용하여 안전하게 중지할 수 있습니다.
다음에는 Akka의 강력한 감독 전략과 실패를 안전하게 처리하는 방법을 더 자세히 알아보겠습니다!
AI 튜터와 함께 Scala을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 39
- 레슨
- 143
자주 묻는 질문
“액터 시스템 설계” 강의는 무료인가요?
네 — “액터 시스템 설계” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Scala for Backend Engineering & Functional Programming 강의 전체를 잠금 해제할 수 있습니다. Scala for Backend Engineering & Functional Programming 강의에는 총 3개의 강의가 포함되어 있습니다.
“액터 시스템 설계”에서 뭘 배우나요?
액터 계층을 설계하고 구현하며 액터 동작을 정의하고 메시지를 송수신하는 방법을 배웁니다. 브라우저에서 직접 실행하는 실습 코드로 Scala for Backend Engineering & Functional Programming을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Scala for Backend Engineering & Functional Programming을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Scala for Backend Engineering & Functional Programming은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 3개 중 2번째 강의입니다.
“액터 시스템 설계” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Scala for Backend Engineering & Functional Programming 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Scala for Backend Engineering & Functional Programming 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Akka 액터 모델 기초
- 액터 시스템 설계
- 감독과 내결함성