Skip to content

Latest commit

Β 

History

History
492 lines (400 loc) Β· 13.1 KB

File metadata and controls

492 lines (400 loc) Β· 13.1 KB

WIZ Framework Architecture

κ°œμš”

WIZλŠ” Python Flask 기반의 ν’€μŠ€νƒ μ›Ή 개발 ν”„λ ˆμž„μ›Œν¬λ‘œ, Angularλ₯Ό μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λ°±μ—”λ“œμ™€ ν”„λ‘ νŠΈμ—”λ“œλ₯Ό ν†΅ν•©ν•˜μ—¬ κ΄€λ¦¬ν•˜λ©°, ν”ŒλŸ¬κ·ΈμΈ 기반 μ•„ν‚€ν…μ²˜λ₯Ό 톡해 ν™•μž₯ κ°€λŠ₯ν•œ IDE ν™˜κ²½μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

핡심 ꡬ성 μš”μ†Œ

1. ν”„λ ˆμž„μ›Œν¬ ꡬ쑰 (season νŒ¨ν‚€μ§€)

season/
β”œβ”€β”€ __init__.py          # νŒ¨ν‚€μ§€ μ΄ˆκΈ°ν™” 및 μ£Όμš” API λ…ΈμΆœ
β”œβ”€β”€ cmd.py               # CLI λͺ…λ Ήμ–΄ μ—”νŠΈλ¦¬ν¬μΈνŠΈ
β”œβ”€β”€ version.py           # 버전 정보
β”œβ”€β”€ command/             # CLI λͺ…λ Ήμ–΄ κ΅¬ν˜„
β”‚   β”œβ”€β”€ bundle.py        # λ²ˆλ“€λ§ κ΄€λ ¨ λͺ…λ Ήμ–΄
β”‚   β”œβ”€β”€ create.py        # ν”„λ‘œμ νŠΈ 생성
β”‚   β”œβ”€β”€ daemon.py        # μ„œλ²„ μ‹€ν–‰ 및 데λͺ¬ 관리
β”‚   β”œβ”€β”€ ide.py           # IDE κ΄€λ ¨ λͺ…λ Ήμ–΄
β”‚   └── service.py       # μ‹œμŠ€ν…œ μ„œλΉ„μŠ€ 관리
β”œβ”€β”€ lib/                 # 핡심 라이브러리
β”‚   β”œβ”€β”€ server.py        # μ„œλ²„ 클래슀 (Flask + SocketIO)
β”‚   β”œβ”€β”€ core.py          # Wiz 핡심 κΈ°λŠ₯
β”‚   β”œβ”€β”€ binding/         # HTTP 및 μ†ŒμΌ“ 바인딩
β”‚   β”œβ”€β”€ static/          # 정적 λ¦¬μ†ŒμŠ€ 관리
β”‚   └── ...
β”œβ”€β”€ util/                # μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜
β”‚   β”œβ”€β”€ cache.py
β”‚   β”œβ”€β”€ compiler.py
β”‚   β”œβ”€β”€ filesystem.py
β”‚   β”œβ”€β”€ logger.py
β”‚   └── string.py
└── data/                # ν…œν”Œλ¦Ώ 데이터
    β”œβ”€β”€ ide/             # IDE μ†ŒμŠ€μ½”λ“œ
    β”œβ”€β”€ plugin/          # ν”ŒλŸ¬κ·ΈμΈ ν…œν”Œλ¦Ώ
    β”œβ”€β”€ sample/          # μƒ˜ν”Œ ν”„λ‘œμ νŠΈ
    └── websrc/          # μ›Ή μ†ŒμŠ€ ν…œν”Œλ¦Ώ

2. μ„œλ²„ μ•„ν‚€ν…μ²˜

Server 클래슀 (season.lib.server.Server)

WIZ ν”„λ ˆμž„μ›Œν¬μ˜ 핡심 μ„œλ²„ 클래슀둜, λ‹€μŒκ³Ό 같은 κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€:

class Server:
    def __init__(self, path=None):
        self.boottime = time.time()
        self.package = season.lib.static.Package()
        self.path = season.lib.static.Path(path)
        self.config = season.lib.static.Config(server=self)
        self.cache = season.util.Cache()
        
        # Flask 및 SocketIO μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ΄ˆκΈ°ν™”
        self.app.flask = Flask(...)
        self.app.socketio = SocketIO(...)
        
        # HTTP 및 μ†ŒμΌ“ 바인딩
        season.lib.binding.http(self)
        season.lib.binding.socket(self)

μ£Όμš” κΈ°λŠ₯:

  • Flask 톡합: μ›Ή μ„œλ²„ κΈ°λ³Έ κΈ°λŠ₯
  • SocketIO 톡합: μ‹€μ‹œκ°„ μ–‘λ°©ν–₯ 톡신
  • μ„€μ • 관리: config.boot 기반 ꡬ성
  • 캐싱 μ‹œμŠ€ν…œ: μ„±λŠ₯ μ΅œμ ν™”
  • Wiz API: wiz() λ©”μ„œλ“œλ₯Ό ν†΅ν•œ ν™•μž₯ API 제곡

ν”„λ‘œμ νŠΈ ꡬ쑰

μƒμ„±λœ WIZ ν”„λ‘œμ νŠΈλŠ” λ‹€μŒκ³Ό 같은 ꡬ쑰λ₯Ό κ°€μ§‘λ‹ˆλ‹€:

myapp/
β”œβ”€β”€ config/              # μ„€μ • 파일
β”‚   β”œβ”€β”€ boot.py          # μ„œλ²„ λΆ€νŒ… μ„€μ •
β”‚   β”œβ”€β”€ ide.py           # IDE μ„€μ •
β”‚   β”œβ”€β”€ service.py       # μ„œλΉ„μŠ€ μ„€μ •
β”‚   └── plugin.json      # ν”ŒλŸ¬κ·ΈμΈ μ„€μ •
β”œβ”€β”€ public/              # 곡개 디렉토리
β”‚   β”œβ”€β”€ app.py           # μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ—”νŠΈλ¦¬ν¬μΈνŠΈ
β”‚   └── app.wsgi         # WSGI μ„€μ •
β”œβ”€β”€ project/             # ν”„λ‘œμ νŠΈ 디렉토리
β”‚   └── main/            # 메인 ν”„λ‘œμ νŠΈ
β”‚       β”œβ”€β”€ config/      # ν”„λ‘œμ νŠΈ μ„€μ •
β”‚       β”œβ”€β”€ src/         # μ†ŒμŠ€ μ½”λ“œ
β”‚       β”‚   β”œβ”€β”€ app/     # Angular μ•± μ»΄ν¬λ„ŒνŠΈ
β”‚       β”‚   β”œβ”€β”€ controller/ # λ°±μ—”λ“œ 컨트둀러
β”‚       β”‚   β”œβ”€β”€ model/   # 데이터 λͺ¨λΈ
β”‚       β”‚   β”œβ”€β”€ route/   # API 라우트
β”‚       β”‚   β”œβ”€β”€ portal/  # 포털 (μž¬μ‚¬μš© κ°€λŠ₯ν•œ λͺ¨λ“ˆ)
β”‚       β”‚   β”œβ”€β”€ angular/ # Angular μ„€μ •
β”‚       β”‚   └── assets/  # 정적 μžμ‚°
β”‚       β”œβ”€β”€ build/       # λΉŒλ“œ κ²°κ³Όλ¬Ό
β”‚       └── bundle/      # λ²ˆλ“€ 파일
β”œβ”€β”€ ide/                 # WIZ IDE μ†ŒμŠ€
β”œβ”€β”€ plugin/              # ν”ŒλŸ¬κ·ΈμΈ
β”‚   β”œβ”€β”€ core/
β”‚   β”œβ”€β”€ workspace/
β”‚   β”œβ”€β”€ git/
β”‚   └── utility/
└── wiz.pid              # 데λͺ¬ ν”„λ‘œμ„ΈμŠ€ ID

3. ν”„λ‘œμ νŠΈ λ‚΄λΆ€ ꡬ쑰 (src/)

3.1 App (Angular μ»΄ν¬λ„ŒνŠΈ)

src/app/ λ””λ ‰ν† λ¦¬λŠ” Angular 기반의 ν”„λ‘ νŠΈμ—”λ“œ μ»΄ν¬λ„ŒνŠΈλ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.

ꡬ쑰 μ˜ˆμ‹œ:

src/app/
β”œβ”€β”€ layout.empty/        # λ ˆμ΄μ•„μ›ƒ μ»΄ν¬λ„ŒνŠΈ
β”‚   β”œβ”€β”€ view.pug
β”‚   β”œβ”€β”€ view.ts
β”‚   β”œβ”€β”€ view.scss
β”‚   └── app.json
└── page.main/           # νŽ˜μ΄μ§€ μ»΄ν¬λ„ŒνŠΈ
    β”œβ”€β”€ view.pug         # Pug ν…œν”Œλ¦Ώ
    β”œβ”€β”€ view.ts          # TypeScript 둜직
    β”œβ”€β”€ view.scss        # μŠ€νƒ€μΌμ‹œνŠΈ
    β”œβ”€β”€ app.json         # μ•± 메타데이터
    β”œβ”€β”€ api.py           # λ°±μ—”λ“œ API
    └── socket.py        # μ†ŒμΌ“ ν•Έλ“€λŸ¬

app.json μ˜ˆμ‹œ:

{
    "title": "/workflow",
    "mode": "page",
    "namespace": "main",
    "category": "general",
    "id": "page.main",
    "viewuri": "/workflow/**",
    "layout": "layout.empty",
    "ng": {
        "selector": "wiz-page-main",
        "inputs": [],
        "outputs": []
    }
}

μ»΄ν¬λ„ŒνŠΈ μœ ν˜•:

  • Page: λΌμš°νŒ… κ°€λŠ₯ν•œ νŽ˜μ΄μ§€ μ»΄ν¬λ„ŒνŠΈ
  • Layout: νŽ˜μ΄μ§€λ₯Ό κ°μ‹ΈλŠ” λ ˆμ΄μ•„μ›ƒ
  • Widget: μž¬μ‚¬μš© κ°€λŠ₯ν•œ UI μ»΄ν¬λ„ŒνŠΈ

3.2 Controller

src/controller/ λ””λ ‰ν† λ¦¬λŠ” λ°±μ—”λ“œ 둜직의 κΈ°λ³Έ 컨트둀러λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

base.py μ˜ˆμ‹œ:

class Controller:
    def __init__(self):
        # μ„Έμ…˜ μ΄ˆκΈ°ν™”
        wiz.session = wiz.model("portal/season/session").use()
        sessiondata = wiz.session.get()
        wiz.response.data.set(session=sessiondata)
        
        # λ‹€κ΅­μ–΄ 처리
        lang = wiz.request.query("lang", None)
        if lang is not None:
            wiz.response.lang(lang)
            wiz.response.redirect(wiz.request.uri())

μ—­ν• :

  • μ„Έμ…˜ 관리
  • μš”μ²­/응닡 처리
  • 곡톡 둜직 κ΅¬ν˜„
  • 인증/인가

3.3 Model

src/model/ λ””λ ‰ν† λ¦¬λŠ” 데이터 λͺ¨λΈκ³Ό λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ ν¬ν•¨ν•©λ‹ˆλ‹€.

νŠΉμ§•:

  • λ°μ΄ν„°λ² μ΄μŠ€ 좔상화
  • λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 μΊ‘μŠν™”
  • μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ½”λ“œ ꡬ쑰

3.4 Route

src/route/ λ””λ ‰ν† λ¦¬λŠ” API μ—”λ“œν¬μΈνŠΈλ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

ꡬ쑰:

src/route/
β”œβ”€β”€ brand/
β”‚   β”œβ”€β”€ app.json
β”‚   └── controller.py
└── setting/
    β”œβ”€β”€ app.json
    └── controller.py

controller.py μ˜ˆμ‹œ:

segment = wiz.request.match("/brand/<action>/<path:path>")
action = segment.action

if action == "logo":
    # 둜고 처리 둜직
    fs = wiz.project.fs("bundle", "src", "assets", "brand")
    wiz.response.download(fs.abspath("logo.png"), as_attachment=False)

if action == "icon":
    # μ•„μ΄μ½˜ 처리 둜직
    wiz.response.download(fs.abspath("icon.ico"), as_attachment=False)

wiz.response.abort(404)

νŠΉμ§•:

  • RESTful API 섀계
  • URL νŒ¨ν„΄ λ§€μΉ­
  • 파일 λ‹€μš΄λ‘œλ“œ 및 μ—…λ‘œλ“œ
  • JSON 응닡 처리

3.5 Portal

src/portal/ λ””λ ‰ν† λ¦¬λŠ” μž¬μ‚¬μš© κ°€λŠ₯ν•œ λͺ¨λ“ˆ νŒ¨ν‚€μ§€μž…λ‹ˆλ‹€.

ꡬ쑰:

src/portal/
β”œβ”€β”€ season/              # 포털 νŒ¨ν‚€μ§€
β”‚   β”œβ”€β”€ portal.json      # 메타데이터
β”‚   β”œβ”€β”€ app/             # Angular μ»΄ν¬λ„ŒνŠΈ
β”‚   β”œβ”€β”€ controller/      # 컨트둀러
β”‚   β”œβ”€β”€ model/           # λͺ¨λΈ
β”‚   β”œβ”€β”€ route/           # 라우트
β”‚   └── libs/            # 라이브러리
└── dizest/
    └── ...

portal.json μ˜ˆμ‹œ:

{
    "package": "season",
    "title": "",
    "version": "2.0.0",
    "use_app": true,
    "use_widget": false,
    "use_route": true,
    "use_libs": true,
    "use_controller": true,
    "use_model": true
}

νŠΉμ§•:

  • λͺ¨λ“ˆν™”λœ κΈ°λŠ₯
  • ν”„λ‘œμ νŠΈ κ°„ μž¬μ‚¬μš©
  • 독립적인 λ„€μž„μŠ€νŽ˜μ΄μŠ€
  • 선택적 κΈ°λŠ₯ ν™œμ„±ν™”

4. μ„€μ • μ‹œμŠ€ν…œ

boot.py (μ„œλ²„ λΆ€νŒ… μ„€μ •)

# λΆ€νŠΈμŠ€νŠΈλž© ν•¨μˆ˜
def bootstrap(app, config):
    pass

# μ‹œν¬λ¦Ώ ν‚€
secret_key = "season-wiz-secret"

# SocketIO μ„€μ •
socketio = dict()
socketio['async_mode'] = 'threading'
socketio['cors_allowed_origins'] = '*'
socketio['async_handlers'] = True

# μ„œλ²„ μ‹€ν–‰ μ„€μ •
run = dict()
run['host'] = "0.0.0.0"
run['port'] = 3000
run['use_reloader'] = False

μ„€μ • ν•­λͺ©:

  • bootstrap: μ„œλ²„ μ‹œμž‘ μ‹œ μ‹€ν–‰λ˜λŠ” ν•¨μˆ˜
  • secret_key: Flask μ„Έμ…˜ μ•”ν˜Έν™” ν‚€
  • socketio: SocketIO μ„œλ²„ μ˜΅μ…˜
  • run: μ„œλ²„ μ‹€ν–‰ μ˜΅μ…˜ (host, port λ“±)

5. ν”ŒλŸ¬κ·ΈμΈ μ‹œμŠ€ν…œ

WIZλŠ” κ°•λ ₯ν•œ ν”ŒλŸ¬κ·ΈμΈ μ•„ν‚€ν…μ²˜λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

ν”ŒλŸ¬κ·ΈμΈ ꡬ쑰:

plugin/
β”œβ”€β”€ core/                # 핡심 ν”ŒλŸ¬κ·ΈμΈ
β”œβ”€β”€ workspace/           # μ›Œν¬μŠ€νŽ˜μ΄μŠ€ 관리
β”‚   β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ command.py       # CLI λͺ…λ Ήμ–΄
β”‚   β”œβ”€β”€ filter.py
β”‚   β”œβ”€β”€ model/
β”‚   └── plugin.json
β”œβ”€β”€ git/                 # Git 톡합
β”œβ”€β”€ utility/             # μœ ν‹Έλ¦¬ν‹°
└── xterm/               # 터미널

command.py μ˜ˆμ‹œ:

def build(*args):
    if len(args) < 1:
        print("wiz command workspace build [projectName]")
        return
    
    project = args[0]
    wiz.project.checkout(project)
    builder = wiz.ide.plugin.model("builder")
    builder.build()

ν”ŒλŸ¬κ·ΈμΈ κΈ°λŠ₯:

  • μ»€μŠ€ν…€ CLI λͺ…λ Ήμ–΄
  • IDE ν™•μž₯
  • λ°±μ—”λ“œ API μΆ”κ°€
  • ν”„λ‘ νŠΈμ—”λ“œ μœ„μ ―

6. IDE 톡합

WIZλŠ” μ›Ή 기반 IDEλ₯Ό λ‚΄μž₯ν•˜μ—¬ ν”„λ‘œμ νŠΈλ₯Ό λΈŒλΌμš°μ €μ—μ„œ 직접 κ°œλ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

IDE ꡬ쑰:

ide/
β”œβ”€β”€ package.json
β”œβ”€β”€ angular/             # Angular μ„€μ •
β”‚   β”œβ”€β”€ angular.build.options.json
β”‚   β”œβ”€β”€ index.html
β”‚   β”œβ”€β”€ main.ts
β”‚   β”œβ”€β”€ wiz.ts
β”‚   └── wizbuild.js
β”œβ”€β”€ app/                 # IDE μ•± μ»΄ν¬λ„ŒνŠΈ
β”‚   β”œβ”€β”€ core.app.ide/
β”‚   β”œβ”€β”€ core.editor.monaco/
β”‚   β”œβ”€β”€ workspace.app.explore/
β”‚   └── ...
└── assets/

μ£Όμš” κΈ°λŠ₯:

  • 파일 탐색기
  • μ½”λ“œ 에디터 (Monaco Editor)
  • 터미널
  • Git 톡합
  • μ‹€μ‹œκ°„ 미리보기

7. λΉŒλ“œ μ‹œμŠ€ν…œ

WIZλŠ” Angular ν”„λ‘œμ νŠΈλ₯Ό μžλ™μœΌλ‘œ λΉŒλ“œν•©λ‹ˆλ‹€.

λΉŒλ“œ ν”„λ‘œμ„ΈμŠ€:

  1. TypeScript 컴파일
  2. Pug ν…œν”Œλ¦Ώ λ³€ν™˜
  3. SCSS 컴파일
  4. Angular λ²ˆλ“€λ§
  5. μ΅œμ ν™” 및 μ••μΆ•

λΉŒλ“œ λͺ…λ Ήμ–΄:

wiz command workspace build main

8. 톡신 μ•„ν‚€ν…μ²˜

HTTP 톡신

  • RESTful API
  • JSON μš”μ²­/응닡
  • 파일 μ—…λ‘œλ“œ/λ‹€μš΄λ‘œλ“œ

WebSocket 톡신 (SocketIO)

  • μ‹€μ‹œκ°„ μ–‘λ°©ν–₯ 톡신
  • 이벀트 기반 λ©”μ‹œμ§•
  • λ„€μž„μŠ€νŽ˜μ΄μŠ€ 지원

μ†ŒμΌ“ ν•Έλ“€λŸ¬ μ˜ˆμ‹œ (socket.py):

def connect():
    # ν΄λΌμ΄μ–ΈνŠΈ μ—°κ²° μ‹œ
    pass

def disconnect():
    # ν΄λΌμ΄μ–ΈνŠΈ μ—°κ²° ν•΄μ œ μ‹œ
    pass

def on_message(data):
    # λ©”μ‹œμ§€ μˆ˜μ‹  μ‹œ
    wiz.response.send({"result": "ok"})

데이터 ν”Œλ‘œμš°

1. HTTP μš”μ²­ ν”Œλ‘œμš°

Browser β†’ Flask Router β†’ Controller β†’ Model β†’ Response
                ↓
            Route (API)
                ↓
            App (API Handler)

2. νŽ˜μ΄μ§€ λ Œλ”λ§ ν”Œλ‘œμš°

URL Request β†’ Route Matching β†’ Layout Load β†’ Page Component Load
                                                    ↓
                                            Angular Rendering
                                                    ↓
                                            API Calls (api.py)

3. μ†ŒμΌ“ 톡신 ν”Œλ‘œμš°

Client Event β†’ SocketIO Namespace β†’ socket.py Handler β†’ Response
                                           ↓
                                      Business Logic

ν™•μž₯μ„±

1. μˆ˜ν‰ ν™•μž₯

  • λ©€ν‹° ν”„λ‘œμ„ΈμŠ€ 지원
  • λ‘œλ“œ λ°ΈλŸ°μ‹± κ°€λŠ₯

2. 수직 ν™•μž₯

  • ν”ŒλŸ¬κ·ΈμΈμ„ ν†΅ν•œ κΈ°λŠ₯ μΆ”κ°€
  • 포털 μ‹œμŠ€ν…œμ„ ν†΅ν•œ λͺ¨λ“ˆ μž¬μ‚¬μš©
  • μ»€μŠ€ν…€ μ»΄ν¬λ„ŒνŠΈ 개발

3. 톡합

  • WSGI ν‘œμ€€ 지원
  • λ‹€μ–‘ν•œ μ›Ή μ„œλ²„μ™€ ν˜Έν™˜ (Nginx, Apache λ“±)
  • μ»¨ν…Œμ΄λ„ˆν™” 지원 (Docker)

λ³΄μ•ˆ

1. μ„Έμ…˜ 관리

  • Flask μ„Έμ…˜ 기반
  • Secret Key μ•”ν˜Έν™”

2. CORS μ„€μ •

  • SocketIO CORS 지원
  • 도메인별 μ ‘κ·Ό μ œμ–΄

3. 인증/인가

  • μ»€μŠ€ν…€ 인증 μ‹œμŠ€ν…œ κ΅¬ν˜„ κ°€λŠ₯
  • μ„Έμ…˜ 기반 κΆŒν•œ 관리

μ„±λŠ₯ μ΅œμ ν™”

1. 캐싱

  • μ„œλ²„ 레벨 μΊμ‹œ (season.util.Cache)
  • 정적 파일 캐싱

2. λ²ˆλ“€λ§

  • Angular AOT 컴파일
  • μ½”λ“œ μŠ€ν”Œλ¦¬νŒ…
  • μ••μΆ• 및 μ΅œμ†Œν™”

3. 비동기 처리

  • SocketIO 비동기 ν•Έλ“€λŸ¬
  • λ©€ν‹°μŠ€λ ˆλ”© 지원

κ²°λ‘ 

WIZλŠ” Flask와 Angular을 ν†΅ν•©ν•œ ν’€μŠ€νƒ ν”„λ ˆμž„μ›Œν¬λ‘œ, λ‹€μŒκ³Ό 같은 νŠΉμ§•μ„ κ°€μ§‘λ‹ˆλ‹€:

  • 톡합 개발 ν™˜κ²½: λ°±μ—”λ“œμ™€ ν”„λ‘ νŠΈμ—”λ“œλ₯Ό ν•˜λ‚˜μ˜ ν”„λ‘œμ νŠΈλ‘œ 관리
  • ν”ŒλŸ¬κ·ΈμΈ μ•„ν‚€ν…μ²˜: ν™•μž₯ κ°€λŠ₯ν•˜κ³  λͺ¨λ“ˆν™”λœ ꡬ쑰
  • μ›Ή 기반 IDE: λΈŒλΌμš°μ €μ—μ„œ 직접 개발 κ°€λŠ₯
  • μ‹€μ‹œκ°„ 톡신: SocketIOλ₯Ό ν†΅ν•œ μ–‘λ°©ν–₯ 톡신
  • κ°„νŽΈν•œ 배포: CLIλ₯Ό ν†΅ν•œ ν”„λ‘œμ νŠΈ 관리 및 μ„œλΉ„μŠ€ 등둝

μ΄λŸ¬ν•œ μ•„ν‚€ν…μ²˜λ₯Ό 톡해 WIZλŠ” λΉ λ₯΄κ³  효율적인 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ„ μ§€μ›ν•©λ‹ˆλ‹€.