๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

ยฉ 2026 Molayo

Dev.toํ—ค๋“œ๋ผ์ธ2026. 06. 15. 11:01

๐Ÿงฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™œ์šฉํ•œ AWS Strands ์—์ด์ „ํŠธํ˜• Planner-Generator-Evaluator ํŒจํ„ด: ๊ฐ„๋‹จํ•œ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ ์ž‘์„ฑ๊ธฐ

์š”์•ฝ

AWS Strands๋ฅผ ํ™œ์šฉํ•˜์—ฌ Planner-Generator-Evaluator ํŒจํ„ด์˜ ์ž์œจํ˜• ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ๊ณ ์ •๋œ ์›Œํฌํ”Œ๋กœ์šฐ ๋Œ€์‹  ํ”Œ๋ž˜๋„ˆ ์—์ด์ „ํŠธ๊ฐ€ ์ƒํƒœ๋ฅผ ํ‰๊ฐ€ํ•˜๊ณ  ๋„๊ตฌ๋ฅผ ๋™์ ์œผ๋กœ ์„ ํƒํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ํฌ์ธํŠธ

  • Planner ์—์ด์ „ํŠธ๊ฐ€ ๋Ÿฐํƒ€์ž„์— ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜์—ฌ ๋™์  ์›Œํฌํ”Œ๋กœ์šฐ ์ œ์–ด
  • ์—์ด์ „ํŠธ๋ฅผ ๋„๊ตฌ๋กœ ์‚ฌ์šฉํ•˜๋Š” 'agents-as-tools' ํŒจํ„ด ์ ์šฉ
  • Planner-Generator-Evaluator ๊ตฌ์กฐ๋ฅผ ํ†ตํ•œ ์ž์œจ์  ์ฝ˜ํ…์ธ  ์ƒ์„ฑ ๋ฃจํ”„ ๊ตฌํ˜„
  • AWS Strands๋ฅผ ์ด์šฉํ•œ ์—์ด์ „ํŠธ ์ค‘์‹ฌ์˜ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์•„ํ‚คํ…์ฒ˜

@ AWS Builder Center์—์„œ ๊ฒŒ์‹œ๋จ

์ด์ „ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ์—์„œ, ์ €๋Š” LangGraph๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‰๊ฐ€์ž ์—์ด์ „ํŠธ(Evaluator Agent)๊ฐ€ ์ƒ์„ฑ์ž ์—์ด์ „ํŠธ(Generator Agent)๊ฐ€ ์ƒ์„ฑํ•œ ์ฝ˜ํ…์ธ ๋ฅผ ๊ฒ€ํ† ํ•˜๊ณ  ๊ฐœ์„ ํ•˜๋Š” ๊ฐ„๋‹จํ•œ Generatorโ€“Evaluator ํŒจํ„ด์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํšจ๊ณผ์ ์ด์—ˆ์ง€๋งŒ, ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ์ œํ•œ๋œ ์ž์œจ์„ฑ์„ ๊ฐ€์ง„ ์‚ฌ์ „ ์ •์˜๋œ ์‹œํ€€์Šค๋ฅผ ๋”ฐ๋ž์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ๋ฐ˜๋ณต์—์„œ๋Š” ๋‹ค์Œ์— ์ˆ˜ํ–‰ํ•  ์ž‘์—…์„ ๋™์ ์œผ๋กœ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” **Planner Agent (ํ”Œ๋ž˜๋„ˆ ์—์ด์ „ํŠธ)**๋ฅผ ๋„์ž…ํ•˜์—ฌ ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ•œ ๋‹จ๊ณ„ ๋” ๋ฐœ์ „์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. **๊ณ ์ •๋œ ์›Œํฌํ”Œ๋กœ์šฐ (fixed workflow)**๋ฅผ ๋”ฐ๋ฅด๋Š” ๋Œ€์‹ , ํ”Œ๋ž˜๋„ˆ๋Š” ํ˜„์žฌ ์ƒํƒœ๋ฅผ ํ‰๊ฐ€ํ•˜๊ณ , ์–ด๋–ค ์—์ด์ „ํŠธ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋ฉฐ, ์ „์ฒด ํ”„๋กœ์„ธ์Šค๋ฅผ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜(orchestrate)ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด **๋” ์—์ด์ „ํŠธ ์ค‘์‹ฌ์ ์ด๊ณ  ์ž์œจ์ ์ธ ์‹œ์Šคํ…œ (more agentic and autonomous system)**์„ ๊ตฌ์ถ•ํ•˜์—ฌ, ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ๋‹จ์ˆœํžˆ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์‹คํ–‰ ๊ฒฝ๋กœ์— ์˜์กดํ•˜๋Š” ๋Œ€์‹  ๋ฌธ๋งฅ์— ๋”ฐ๋ผ ๋™์ž‘์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ž‘์€ ๊ฐœ๋… ์ฆ๋ช…(Proof-of-Concept) ํ”„๋กœ์ ํŠธ์—์„œ, ์ €๋Š” AWS Strands Agents๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—์ด์ „ํŠธํ˜• ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ ์ž‘์„ฑ๊ธฐ๋ฅผ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค. ์›Œํฌํ”Œ๋กœ์šฐ๋Š” Plannerโ€“Generatorโ€“Evaluator ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋”ฐ๋ฅด๋ฉฐ, ์—ฌ๊ธฐ์„œ ํ”Œ๋ž˜๋„ˆ ์—์ด์ „ํŠธ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ํ•˜๊ณ , ์ƒ์„ฑ์ž ์—์ด์ „ํŠธ๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, ํ‰๊ฐ€์ž ์—์ด์ „ํŠธ๋Š” ๋ฐ˜๋ณต์ ์ธ ํ”ผ๋“œ๋ฐฑ์„ ํ†ตํ•ด ๊ฒฐ๊ณผ๋ฌผ์„ ๊ฒ€ํ† ํ•˜๊ณ  ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.

์•„ํ‚คํ…์ฒ˜ (Architecture):

PlannerAgent: ๋‹ค์Œ์— ๋ฌด์—‡์„ ํ• ์ง€ ๊ฒฐ์ • (๋™์ ์œผ๋กœ plan / replan)
       - @tool: generate_blog ํ˜ธ์ถœ  โ†’  GeneratorAgent (๋ฆฌ์„œ์น˜ + ์ž‘์„ฑ)
       - @tool: evaluate_blog ํ˜ธ์ถœ  โ†’  EvaluatorAgent (ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ)
...

ํŒŒ์ดํ”„๋ผ์ธ๊ณผ์˜ ์ฃผ์š” ์ฐจ์ด์ :

  • **Planner์˜ ์ถ”๋ก  ๋ฃจํ”„ (Strands ์—์ด์ „ํŠธ ๋ฃจํ”„๋ฅผ ํ†ตํ•ด)**๋Š” ๋Ÿฐํƒ€์ž„(runtime)์— ๋„๊ตฌ(tool)๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์žฌ๊ฒ€์ƒ‰, ์ถ”๊ฐ€ ์†Œ์Šค ์š”์•ฝ, ๋‹ค์‹œ ์“ฐ๊ธฐ, ํ‰๊ฐ€ ๊ฑด๋„ˆ๋›ฐ๊ธฐ ๋˜๋Š” ์กฐ๊ธฐ ์ข…๋ฃŒ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • GeneratorAgent์™€ EvaluatorAgent๋Š” ๊ทธ ์ž์ฒด๋กœ @tool ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ Strands ์—์ด์ „ํŠธ์ž…๋‹ˆ๋‹ค (์—์ด์ „ํŠธ๋ฅผ ๋„๊ตฌ๋กœ ์‚ฌ์šฉํ•˜๋Š” agents-as-tools ํŒจํ„ด).
  • SummarizerAgent๋Š” ์ „์šฉ ์ €์˜จ๋„(low-temperature) ์—์ด์ „ํŠธ๋กœ, ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ ธ์˜จ ๋’ค ์ž‘์„ฑ์ž์—๊ฒŒ ์ „๋‹ฌํ•˜๊ธฐ ์ „ ๊ธฐ์‚ฌ๋‹น 5~10๊ฐœ์˜ ํ•ต์‹ฌ ๊ธฐ์ˆ  ๋ถˆ๋ › ํฌ์ธํŠธ๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณ ์ •๋œ ์—ฃ์ง€(edge)๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค: Planner๋Š” EvalResult ํ”ผ๋“œ๋ฐฑ๊ณผ ๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์Œ์— evaluate_blog๋ฅผ ํ˜ธ์ถœํ• ์ง€ ๋˜๋Š” generate_blog๋ฅผ ํ˜ธ์ถœํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

Achitecture

Code GitHub Link: Project on GitHub

์—์ด์ „ํŠธ ์„ค๊ณ„๋ฅผ ํƒ๊ตฌ ์ค‘์ด๋“  ์ž์‹ ๋งŒ์˜ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ• ์ค‘์ด๋“ , ์ด ๋‚ด์šฉ์€ ๋ช…ํ™•ํ•˜๊ณ  ์‹ค์šฉ์ ์ธ ์‹œ์ž‘์ ์„ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿ˜‰

๋ชฉ์ฐจ

  • ์˜์กด์„ฑ ๋ฐ ์„ค์ • (Dependencies & Configuration)
  • ๋ฉ”๋ชจ๋ฆฌ ๊ตฌํ˜„ (Implementing Memory)
  • ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ ์š”์•ฝ ์—์ด์ „ํŠธ (Fetching Information & Summary Agent)
  • ์—์ด์ „ํŠธ ์ƒํƒœ ๋ฐ ์—์ด์ „ํŠธ ๋„๊ตฌ (Agents State & Agent Tools)
  • Generator ๋ฐ Evaluator ์—์ด์ „ํŠธ (Generator & Evaluator Agents)
  • Planner ์—์ด์ „ํŠธ ๋ฐ ๋ฉ”์ธ ์‹คํ–‰ (Planner Agent & Main Run)
  • ์ „์ฒด ์ฝ”๋“œ ๋ฐ ๋ฐ๋ชจ (All Code & Demo)
  • Memory.MD ํŒŒ์ผ (Memory.MD File)
  • ์ƒ์„ฑ๋œ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ (Generated Blog Post)
  • ๊ฒฐ๋ก  (Conclusion)
  • ์ฐธ๊ณ  ๋ฌธํ—Œ (References)

์˜์กด์„ฑ ๋ฐ ์„ค์ • (Dependencies & Configuration)

  • ๋‹ค์Œ ์˜์กด์„ฑ์„ ์„ค์น˜ํ•ด ์ฃผ์„ธ์š”:
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
...

Requirements.txt:

strands-agents>=0.1.0
strands-agents-tools>=0.1.0
boto3>=1.34.0
...
  • ์‚ฌ์šฉ ์ค‘์ธ ๋ฆฌ์ „(์˜ˆ: eu-central-1, us-east-1)์—์„œ AWS Bedrock ๋ชจ๋ธ ์•ก์„ธ์Šค๋ฅผ ํ™œ์„ฑํ™”ํ•˜์„ธ์š”.

    • AWS Bedrock > Bedrock Configuration > Model Access > AWS Nova-Pro ๋˜๋Š” Claude Sonnet, Opus
  • ์ด ์ฝ”๋“œ์—์„œ๋Š” AWS๊ฐ€ ๋‹ค์–‘ํ•œ ๋ฆฌ์ „์—์„œ ์ œ๊ณตํ•˜๋Š” AWS Nova-Pro๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ๋ชจ๋ธ ์•ก์„ธ์Šค ํ›„, IAM์—์„œ AWS Bedrock ์„œ๋น„์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก AmazonBedrockFullAccess ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜์„ธ์š”.

  • AWS ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜์—ฌ AWS Bedrock ๋ชจ๋ธ์— ๋„๋‹ฌํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์˜ต์…˜:

    • AWS Config: aws configure๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ config ๋ฐ credentials ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • .env ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜ ๊ฐ€์ ธ์˜ค๊ธฐ: .env ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค:
AWS_ACCESS_KEY_ID=์—ฌ๊ธฐ์—_์•ก์„ธ์Šค_ํ‚ค_ID๋ฅผ_๋ถ™์—ฌ๋„ฃ์œผ์„ธ์š”
AWS_SECRET_ACCESS_KEY=์—ฌ๊ธฐ์—_๋น„๋ฐ€_์•ก์„ธ์Šค_ํ‚ค๋ฅผ_๋ถ™์—ฌ๋„ฃ์œผ์„ธ์š”
  • Bedrock API ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋Œ€์•ˆ์ ์ธ ๋ฐฉ๋ฒ• (์žฅ๊ธฐ ๋˜๋Š” ๋‹จ๊ธฐ).

๋ฉ”๋ชจ๋ฆฌ(Memory) ๊ตฌํ˜„

  • ๋ฉ”๋ชจ๋ฆฌ ํ•จ์ˆ˜ (init, read, append):
import re, sys, json, datetime, requests
from pathlib import Path
from dotenv import load_dotenv
...

์ •๋ณด ๊ฒ€์ƒ‰ ๋ฐ ์š”์•ฝ ์—์ด์ „ํŠธ (Fetching Information & Summary Agent)

  • ๋ฆฌ์„œ์น˜ ํ•จ์ˆ˜ (ํ‚ค์›Œ๋“œ ์ƒ์„ฑ, DuckDuckGo ๊ฒ€์ƒ‰, ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ ์ˆ˜์ง‘):
from strands import Agent, tool
from strands.models.bedrock import BedrockModel

...

์—์ด์ „ํŠธ ์ƒํƒœ(Agents State) ๋ฐ ์—์ด์ „ํŠธ ๋„๊ตฌ(Agent Tools)

  • ์ƒํƒœ(State)๋Š” ์—์ด์ „ํŠธ ๊ฐ„์— ํ†ต์‹ ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (EvalResult). Planner ์—์ด์ „ํŠธ๋Š” ์—์ด์ „ํŠธ ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
from strands import Agent, tool
from typing import Optional
from pydantic import BaseModel, Field
...

์ƒ์„ฑ(Generator) ๋ฐ ํ‰๊ฐ€(Evaluator) ์—์ด์ „ํŠธ

  • Generator๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋ฆฌ์„œ์น˜๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ(๋งํฌ, ์š”์•ฝ)๋ฅผ ๋ฉ”๋ชจ๋ฆฌ(Memory)์— ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ, ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
from strands import Agent, tool
from strands.models.bedrock import BedrockModel

...
  • Evaluator๋Š” ํŠน์ • ๊ธฐ์ค€(๊นŠ์ด, ์ตœ์‹ ์„ฑ, ๊ตฌ์กฐ, ๋ฌธ์ฒด)์— ๋”ฐ๋ผ ํฌ์ŠคํŠธ๋ฅผ ํ‰๊ฐ€ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ(Memory)์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
from strands import Agent, tool
from strands.models.bedrock import BedrockModel

...

Planner ์—์ด์ „ํŠธ ๋ฐ ๋ฉ”์ธ ์‹คํ–‰ (Planner Agent & Main Run)

Planner ์—์ด์ „ํŠธ ๋ฐ ๋ฉ”์ธ ์‹คํ–‰ (Planner Agent & Main Run)

[์ด๋ฒˆ ์ฒญํฌ]

  • ๊ฐ ์—์ด์ „ํŠธ์— ๋Œ€ํ•ด ChatBedrockConverse๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
from strands import Agent, tool
from strands.models.bedrock import BedrockModel

# Planner Agent 
_plan_model    = BedrockModel(model_id="us.amazon.nova-pro-v1:0", temperature=0.3)

def run(topic: str, max_iter: int = MAX_ITER) -> None:
    print(f"\n{'='*60}\n  TOPIC : {topic}\n  MAX ITER: {max_iter}\n{'='*60}")
    _state_init(topic, max_iter)
    _mem_init(topic)

    planner = Agent(
        model=_plan_model,
        tools=[generate_blog, evaluate_blog, search_web, fetch_page,
               summarize_article, read_memory, write_memory],
        system_prompt=(
            "You are an autonomous blog-pipeline orchestrator for senior AI/ML engineering content.\n\n"
            "Goal: produce a high-quality technical blog post (all eval scores โ‰ฅ 4) "
            f"within the allowed iterations.\n\n"
            "Tools available:\n"
            "  โ€ข generate_blog(extra_instructions)  โ€” research + summarise + write / rewrite\n"
            "  โ€ข evaluate_blog()                    โ€” score the current draft\n"
            "  โ€ข search_web(query)                  โ€” ad-hoc article search\n"
            "  โ€ข fetch_page(url)                    โ€” full raw text of a page\n"
            "  โ€ข summarize_article(url, title)      โ€” LLM-distilled key points from a page\n"
            "  โ€ข read_memory()                      โ€” inspect research & critiques\n"
            "  โ€ข write_memory(section, content)     โ€” log planning notes\n\n"
            "Flow:\n"
            "  1. generate_blog() โ†’ 2. evaluate_blog() โ†’ 3. if rejected, generate_blog(extra_instructions=<fix>) โ†’ repeat.\n"
            "  Stop when accepted or iteration budget exhausted.\n"
            "  Use summarize_article between steps when you need deeper insight on a specific source."
        ),
    )

print("
[PlannerAgent] starting autonomous pipeline...\n")
    planner(
        f"Topic: **{topic}**\n"
        f"Max iterations allowed: {max_iter}\n\n"
        "์ „์ฒด ํŒŒ์ดํ”„๋ผ์ธ์„ ์ž์œจ์ ์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์‹œ๋ฌผ์ด ์Šน์ธ๋˜๊ฑฐ๋‚˜ ์˜ˆ์‚ฐ์ด ์†Œ์ง„๋  ๋•Œ๊นŒ์ง€ ์ƒ์„ฑํ•˜๊ณ , ํ‰๊ฐ€ํ•˜๋ฉฐ, ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค."
    )

    print(f"\n{'='*60}")
    print(f"  ์™„๋ฃŒ โ€” ๋ฐ˜๋ณต {_state['iteration']} | ์Šน์ธ๋จ={_state['done']}")
    print(f"  ์ถœ๋ ฅ: {BLOG}  |  ๋ฉ”๋ชจ๋ฆฌ: {MEM}")
    print(f"{'='*60}\n")

if __name__ == "__main__":

AI ์ž๋™ ์ƒ์„ฑ ์ฝ˜ํ…์ธ 

๋ณธ ์ฝ˜ํ…์ธ ๋Š” Dev.to AI tag์˜ ์›๋ฌธ์„ AI๊ฐ€ ์ž๋™์œผ๋กœ ์š”์•ฝยท๋ฒˆ์—ญยท๋ถ„์„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์› ์ €์ž‘๊ถŒ์€ ์›์ €์ž‘์ž์—๊ฒŒ ์žˆ์œผ๋ฉฐ, ์ •ํ™•ํ•œ ๋‚ด์šฉ์€ ๋ฐ˜๋“œ์‹œ ์›๋ฌธ์„ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.

์›๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
0

๋Œ“๊ธ€

0