๐ฏ g5se ๋งค์ผ ํ ์ค ์์ด ์ผ๊ธฐ - ๊ฐ๋จ ์๋ฌธ & ๋ฌธ์ฅ ์ ์ฅ์
g5se-daily-english-diary
๋ฌธ์ ์ค๋ช
ํ๋ก์ ํธ ๊ฐ์
์์ด ํ์ต์๋ฅผ ์ํ ๊ฐ๋จํ ์ผ๊ธฐ ์์ฑ ํ๋ซํผ์ ๋๋ค. ๋งค์ผ ์งง์ ์์ด ๋ฌธ์ฅ(1~3์ค)์ ์์ฑํ๊ณ ์ ์ฅํ์ฌ ์์ ๋ง์ ์์ด ๋ฌธ์ฅ ์์นด์ด๋ธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ๊ณผ๊ฑฐ์ ์์ฑํ ๋ฌธ์ฅ๋ค์ ๋ ์ง๋ณ๋ก ๋์๋ณด๋ฉฐ ํ์ต ๊ธฐ๋ก์ ํ์ธํ ์ ์์ต๋๋ค.
ํต์ฌ ๊ธฐ๋ฅ
ํ์ ๊ธฐ๋ฅ
-
์ผ๊ธฐ ์์ฑ ํผ
- ๋ ์ง ์๋ ํ์ (์ค๋ ๋ ์ง)
- ์์ด ๋ฌธ์ฅ ์ ๋ ฅ (textarea, ์ต๋ 300์)
- ํ๊ธ ๋ฉ๋ชจ ์ ๋ ฅ (์ ํ, 100์)
- ์ ์ฅ ๋ฒํผ
-
์ผ๊ธฐ ๋ชฉ๋ก ๋ณด๊ธฐ
- ์ต์ ์ ์ ๋ ฌ
- ๋ ์ง๋ณ ๊ทธ๋ฃนํ
- ๊ฐ ํญ๋ชฉ: ๋ ์ง, ์์ด ๋ฌธ์ฅ, ํ๊ธ ๋ฉ๋ชจ(์์ ๊ฒฝ์ฐ)
- ์์ /์ญ์ ๋ฒํผ
-
ํต๊ณ ํ์
- ์ด ์์ฑ ์ผ์
- ์ด๋ฒ ๋ฌ ์์ฑ ํ์
- ์ฐ์ ์์ฑ ์ผ์ (streak)
-
SQLite DB ํ์ฉ
entriesํ ์ด๋ธ: id, date, english_text, korean_memo, created_at- ์ฒซ ์ ๊ทผ ์ ์๋ ์คํค๋ง ์์ฑ
์ ํ ์ถ๊ฐ ๊ธฐ๋ฅ (๋ณด๋์ค)
- ์๋ณ ํํฐ๋ง (๋๋กญ๋ค์ด์ผ๋ก ํน์ ์ ์ ํ)
- ํค์๋ ๊ฒ์ (์์ด ๋ฌธ์ฅ ๋ด ๊ฒ์)
- ๋ฌธ์ฅ ๊ธธ์ด ํต๊ณ (ํ๊ท ๋จ์ด ์)
- ๋๋ค ๊ณผ๊ฑฐ ์ผ๊ธฐ ๋ณด๊ธฐ ๋ฒํผ
- ๋คํฌ๋ชจ๋์์ ์ ๋ ฅ ํผ ํ์ด๋ผ์ดํธ ํจ๊ณผ
๊ธฐ์ ์คํ
- ํ๋ ์์ํฌ: ๊ทธ๋๋ณด๋5 SE (g5se) - PHP ๊ธฐ๋ฐ CMS
- DB: SQLite (๋ชจ๋ ์ ์ฉ ํ์ผ)
- ๋์์ธ: Modern shell (g5se ํ ๋ง ์์คํ ) + CSS ๋ณ์
- ๋ผ์ฐํ
: ํด๋ ๊ธฐ๋ฐ ์๋ ๋งคํ (
app/modules/daily-english-diary/index.php)
ํ์ต ๋ชฉํ
- g5se์ modern shell ๊ตฌ์กฐ ์ดํด
- SQLite PDO ๊ธฐ๋ณธ CRUD ์ฐ์ต
- ๋ ์ง ๊ธฐ๋ฐ ๋ฐ์ดํฐ ์ ๋ ฌ ๋ฐ ๊ทธ๋ฃนํ
- ๊ฐ๋จํ ํต๊ณ ๊ณ์ฐ ๋ก์ง
- ๋คํฌ๋ชจ๋ ๋์ ๋์์ธ ํ ํฐ ํ์ฉ
์ ์ฝ ์กฐ๊ฑด
- โข ๊ทธ๋๋ณด๋5 SE ์ค์น๋ณธ ํ์ (https://github.com/gnuboard/g5se main ๋ธ๋์น)
- โข ์์ PHP + g5se ์ปจ๋ฒค์ ๋ง ์ฌ์ฉ (Laravel/Composer/npm/Vite ๊ธ์ง)
- โข ํด๋ ๊ธฐ๋ฐ ์๋ ๋ผ์ฐํ ์ฌ์ฉ (app/router.php ์์ ๋ถํ์)
- โข Modern shell ํ์ ์ ์ฉ (๋คํฌ๋ชจ๋ ์๋ ๋์)
- โข SQLite DB๋ G5_DATA_PATH.'/modules/daily-english-diary.sqlite'์ ์ ์ฅ
- โข prepared statement๋ก SQL ์ธ์ ์ ๋ฐฉ์ง
- โข ์ฌ์ฉ์ ์ ๋ ฅ์ htmlspecialchars()๋ก ์ด์ค์ผ์ดํ
- โข ์ธ๋ถ CDN ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ๊ธ์ง (์์ HTML/CSS/JS)
- โข ๋ฐ์ํ ๋์์ธ (๋ชจ๋ฐ์ผ ์ฐ์ )
- โข ๋ธ๋ผ์ฐ์ ์๋ก๊ณ ์นจ์ผ๋ก ๋ฐ์ดํฐ ํ์ธ (WebSocket ๊ธ์ง)
ํ๋กฌํํธ ๋ ์ํผ
์๋ ํ๋กฌํํธ๋ฅผ ์์๋๋ก AI์๊ฒ ๋ณด๋ด๋ฉด ๋ฉ๋๋ค. ๋ณต์ฌ ๋ฒํผ์ ๋๋ฌ ๋ฐ๋ก ์ฌ์ฉํ์ธ์.
g5se๊ฐ ์ค์น๋ ๋๋ ํฐ๋ฆฌ(๋ฃจํธ์ `index.php`ยท`app/`์ด ์๋ ๊ณณ)์์ ์์
์ ์์ํฉ๋๋ค. (g5se ์ค์น๋ https://github.com/gnuboard/g5se ์ฐธ๊ณ )
**Step 1: ํ๋ก์ ํธ ๊ธฐ๋ณธ ๊ตฌ์กฐ ์์ฑ & Modern Shell ์ ์ฉ**
1. `app/modules/daily-english-diary/` ํด๋๋ฅผ ์์ฑํ์ธ์.
2. `app/modules/daily-english-diary/index.php` ํ์ผ์ ์์ฑํ์ธ์.
3. ๋ค์ ๋ด์ฉ์ผ๋ก ํ์ผ์ ์์ฑํ์ธ์:
```php
<?php
include_once('./_common.php');
// SQLite DB ์ฐ๊ฒฐ (์ฒซ ์ ๊ทผ ์ ์๋ ์์ฑ)
@mkdir(G5_DATA_PATH.'/modules', 0707, true);
$db_path = G5_DATA_PATH.'/modules/daily-english-diary.sqlite';
$pdo = new PDO('sqlite:'.$db_path);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// ํ
์ด๋ธ ์์ฑ (์ฒซ ์คํ ์)
$pdo->exec("
CREATE TABLE IF NOT EXISTS entries (
id INTEGER PRIMARY KEY AUTOINCREMENT,
date TEXT NOT NULL,
english_text TEXT NOT NULL,
korean_memo TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
");
require_once(G5_THEME_PATH.'/modern/_head.inc.php');
include_once('./head.sub.php');
?>
<div class="m-shell">
<?php require G5_THEME_PATH.'/modern/_nav.inc.php'; ?>
<main class="m-container" style="padding: 32px 20px 48px;">
<div style="max-width: 800px; margin: 0 auto;">
<h1 style="font-size: 28px; font-weight: 700; margin-bottom: 8px;">๐ ๋งค์ผ ํ ์ค ์์ด ์ผ๊ธฐ</h1>
<p style="color: var(--m-text-muted); margin-bottom: 32px;">๊ฐ๋จํ ์์ด ๋ฌธ์ฅ์ผ๋ก ๋งค์ผ์ ์๊ฐ์ ๊ธฐ๋กํ์ธ์</p>
<!-- ์์ฑ ํผ -->
<div style="background: var(--m-surface); border-radius: var(--m-radius-lg); padding: 24px; box-shadow: var(--m-shadow); margin-bottom: 32px;">
<h2 style="font-size: 18px; font-weight: 600; margin-bottom: 16px;">โ๏ธ ์ค๋์ ์ผ๊ธฐ ์์ฑ</h2>
<form method="POST" style="display: flex; flex-direction: column; gap: 16px;">
<div>
<label style="display: block; font-size: 14px; font-weight: 500; margin-bottom: 6px;">๐
๋ ์ง</label>
<input type="date" name="date" value="<?php echo date('Y-m-d'); ?>" required
style="width: 100%; padding: 10px 12px; border: 1px solid #ddd; border-radius: 8px; font-size: 14px;">
</div>
<div>
<label style="display: block; font-size: 14px; font-weight: 500; margin-bottom: 6px;">๐ฌ๐ง ์์ด ๋ฌธ์ฅ (์ต๋ 300์)</label>
<textarea name="english_text" maxlength="300" rows="4" required placeholder="Today I learned something new..."
style="width: 100%; padding: 12px; border: 1px solid #ddd; border-radius: 8px; font-size: 14px; resize: vertical;"></textarea>
</div>
<div>
<label style="display: block; font-size: 14px; font-weight: 500; margin-bottom: 6px;">๐ฐ๐ท ํ๊ธ ๋ฉ๋ชจ (์ ํ, ์ต๋ 100์)</label>
<input type="text" name="korean_memo" maxlength="100" placeholder="์ค๋ ๋ฐฐ์ด ํํ์ ๋ํ ๋ฉ๋ชจ..."
style="width: 100%; padding: 10px 12px; border: 1px solid #ddd; border-radius: 8px; font-size: 14px;">
</div>
<button type="submit" name="action" value="add"
style="padding: 12px 24px; background: #3b82f6; color: white; border: none; border-radius: 8px; font-size: 15px; font-weight: 600; cursor: pointer;">
๐พ ์ ์ฅํ๊ธฐ
</button>
</form>
</div>
<!-- ์ผ๊ธฐ ๋ชฉ๋ก (์ถํ ๊ตฌํ) -->
<div style="background: var(--m-surface); border-radius: var(--m-radius-lg); padding: 24px; box-shadow: var(--m-shadow);">
<h2 style="font-size: 18px; font-weight: 600; margin-bottom: 16px;">๐ ๋์ ์ผ๊ธฐ ๋ชฉ๋ก</h2>
<p style="color: var(--m-text-muted); text-align: center; padding: 40px 0;">์์ง ์์ฑํ ์ผ๊ธฐ๊ฐ ์์ต๋๋ค.</p>
</div>
</div>
</main>
<?php require G5_THEME_PATH.'/modern/_footer.inc.php'; ?>
</div>
<?php include_once('./tail.sub.php'); ?>
```
4. ๋ธ๋ผ์ฐ์ ์์ `/daily-english-diary` ์ ์ํ์ฌ ํ์ด์ง๊ฐ ์ ์์ ์ผ๋ก ๋ก๋๋๋์ง ํ์ธํ์ธ์.
5. ์์ฑ ํผ์ด ํ์๋๊ณ ๋ ์ง๊ฐ ์ค๋ ๋ ์ง๋ก ์๋ ์
๋ ฅ๋๋์ง ํ์ธํ์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: - `/daily-english-diary` URL๋ก ์ ์ ๊ฐ๋ฅ - Modern shell์ด ์ ์ฉ๋์ด ๋ค๋น๊ฒ์ด์ /ํธํฐ๊ฐ ํ์๋จ - ์ผ๊ธฐ ์์ฑ ํผ์ด ์นด๋ ํํ๋ก ํ์๋จ - ๋ ์ง ์ ๋ ฅ๋์ ์ค๋ ๋ ์ง๊ฐ ์๋์ผ๋ก ์ค์ ๋จ - ์์ด ๋ฌธ์ฅ ์ ๋ ฅ๋(textarea)๊ณผ ํ๊ธ ๋ฉ๋ชจ ์ ๋ ฅ๋์ด ํ์๋จ - ์ ์ฅํ๊ธฐ ๋ฒํผ์ด ํ๋์์ผ๋ก ํ์๋จ - SQLite DB ํ์ผ์ด `data/modules/daily-english-diary.sqlite`์ ์์ฑ๋จ - `entries` ํ ์ด๋ธ์ด ์๋์ผ๋ก ์์ฑ๋จ
**Step 2: ์ผ๊ธฐ ์ ์ฅ ๊ธฐ๋ฅ ๊ตฌํ & ๋ชฉ๋ก ํ์**
1. `app/modules/daily-english-diary/index.php` ํ์ผ์ ์ด๊ณ `// (ํ์ด์ง ๋ก์ง โ ๋ฐ์ดํฐ, AJAX ๋ถ๊ธฐ ๋ฑ)` ์ฃผ์ ๋ถ๋ถ(DB ์ฐ๊ฒฐ ์งํ, `require_once` ์ด์ )์ ๋ค์ ์ฝ๋๋ฅผ ์ถ๊ฐํ์ธ์:
```php
// POST ์ฒ๋ฆฌ: ์ผ๊ธฐ ์ถ๊ฐ
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) {
if ($_POST['action'] === 'add') {
$date = trim($_POST['date']);
$english_text = trim($_POST['english_text']);
$korean_memo = trim($_POST['korean_memo'] ?? '');
if ($date && $english_text) {
$stmt = $pdo->prepare("
INSERT INTO entries (date, english_text, korean_memo)
VALUES (?, ?, ?)
");
$stmt->execute([$date, $english_text, $korean_memo]);
header('Location: /daily-english-diary');
exit;
}
}
}
// ์ผ๊ธฐ ๋ชฉ๋ก ์กฐํ (์ต์ ์)
$stmt = $pdo->query("SELECT * FROM entries ORDER BY date DESC, created_at DESC");
$entries = $stmt->fetchAll(PDO::FETCH_ASSOC);
```
2. ์ผ๊ธฐ ๋ชฉ๋ก ํ์ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ์ธ์ (๊ธฐ์กด "๋์ ์ผ๊ธฐ ๋ชฉ๋ก" div ๋ด๋ถ๋ฅผ ๊ต์ฒด):
```php
<div style="background: var(--m-surface); border-radius: var(--m-radius-lg); padding: 24px; box-shadow: var(--m-shadow);">
<h2 style="font-size: 18px; font-weight: 600; margin-bottom: 16px;">๐ ๋์ ์ผ๊ธฐ ๋ชฉ๋ก (<?php echo count($entries); ?>๊ฐ)</h2>
<?php if (empty($entries)): ?>
<p style="color: var(--m-text-muted); text-align: center; padding: 40px 0;">์์ง ์์ฑํ ์ผ๊ธฐ๊ฐ ์์ต๋๋ค. ์ฒซ ์ผ๊ธฐ๋ฅผ ์์ฑํด๋ณด์ธ์! โจ</p>
<?php else: ?>
<div style="display: flex; flex-direction: column; gap: 16px;">
<?php foreach ($entries as $entry): ?>
<div style="border-left: 4px solid #3b82f6; padding: 16px; background: rgba(59, 130, 246, 0.05); border-radius: 8px;">
<div style="display: flex; justify-content: space-between; align-items: start; margin-bottom: 8px;">
<span style="font-size: 13px; font-weight: 600; color: #3b82f6;">
๐
<?php echo htmlspecialchars($entry['date']); ?>
</span>
<div style="display: flex; gap: 8px;">
<!-- ์์ /์ญ์ ๋ฒํผ (๋ค์ ๋จ๊ณ์์ ๊ตฌํ) -->
</div>
</div>
<p style="font-size: 15px; line-height: 1.6; margin-bottom: 8px; color: var(--m-text);">
<?php echo nl2br(htmlspecialchars($entry['english_text'])); ?>
</p>
<?php if (!empty($entry['korean_memo'])): ?>
<p style="font-size: 13px; color: var(--m-text-muted); font-style: italic;">
๐ญ <?php echo htmlspecialchars($entry['korean_memo']); ?>
</p>
<?php endif; ?>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
</div>
```
3. ๋ธ๋ผ์ฐ์ ์์ `/daily-english-diary`์ ์ ์ํ์ฌ ์ผ๊ธฐ๋ฅผ ์์ฑํ๊ณ ์ ์ฅํด๋ณด์ธ์.
4. ์ ์ฅ ํ ํ์ด์ง๊ฐ ์๋ก๊ณ ์นจ๋๊ณ ์์ฑํ ์ผ๊ธฐ๊ฐ ๋ชฉ๋ก์ ํ์๋๋์ง ํ์ธํ์ธ์.
5. ์ฌ๋ฌ ๊ฐ์ ์ผ๊ธฐ๋ฅผ ์์ฑํ์ฌ ์ต์ ์์ผ๋ก ์ ๋ ฌ๋๋์ง ํ์ธํ์ธ์.
๊ธฐ๋ ๊ฒฐ๊ณผ: - ์ผ๊ธฐ ์์ฑ ํผ์ ๋ด์ฉ์ ์ ๋ ฅํ๊ณ ์ ์ฅํ๋ฉด DB์ ์ ์ฅ๋จ - ์ ์ฅ ํ ํ์ด์ง๊ฐ ๋ฆฌ๋ค์ด๋ ํธ๋์ด ์๋ก๊ณ ์นจ๋จ - ์์ฑํ ์ผ๊ธฐ๊ฐ ๋ชฉ๋ก์ ์นด๋ ํํ๋ก ํ์๋จ - ๋ ์ง, ์์ด ๋ฌธ์ฅ, ํ๊ธ ๋ฉ๋ชจ(์์ ๊ฒฝ์ฐ)๊ฐ ๋ชจ๋ ํ์๋จ - ์ผ๊ธฐ ๊ฐ์๊ฐ ์ ๋ชฉ ์์ ํ์๋จ (์: "๋์ ์ผ๊ธฐ ๋ชฉ๋ก (3๊ฐ)") - ์ต์ ์ผ๊ธฐ๊ฐ ๋งจ ์์ ํ์๋จ - ์ฌ๋ฌ ์ค์ ์์ด ๋ฌธ์ฅ์ด ์ค๋ฐ๊ฟ ์ ์ง๋จ - ํ๊ธ ๋ฉ๋ชจ๊ฐ ์๋ ๊ฒฝ์ฐ ํด๋น ์ค์ด ํ์๋์ง ์์
**Step 3: ํต๊ณ ํ์ & ์ญ์ ๊ธฐ๋ฅ ์ถ๊ฐ**
1. ํต๊ณ ๊ณ์ฐ ์ฝ๋๋ฅผ ์ผ๊ธฐ ๋ชฉ๋ก ์กฐํ ์ฝ๋ ์งํ์ ์ถ๊ฐํ์ธ์:
```php
// ํต๊ณ ๊ณ์ฐ
$total_count = count($entries);
$this_month = date('Y-m');
$this_month_count = 0;
foreach ($entries as $entry) {
if (strpos($entry['date'], $this_month) === 0) {
$this_month_count++;
}
}
// ์ฐ์ ์์ฑ ์ผ์ ๊ณ์ฐ (streak)
$streak = 0;
if (!empty($entries)) {
$dates = array_unique(array_column($entries, 'date'));
rsort($dates); // ์ต์ ์ ์ ๋ ฌ
$today = date('Y-m-d');
$yesterday = date('Y-m-d', strtotime('-1 day'));
if ($dates[0] === $today || $dates[0] === $yesterday) {
$streak = 1;
$current_date = $dates[0];
for ($i = 1; $i < count($dates); $i++) {
$expected_date = date('Y-m-d', strtotime($current_date . ' -1 day'));
if ($dates[$i] === $expected_date) {
$streak++;
$current_date = $dates[$i];
} else {
break;
}
}
}
}
```
2. ์ญ์ ์ฒ๋ฆฌ ์ฝ๋๋ฅผ POST ์ฒ๋ฆฌ ๋ถ๋ถ์ ์ถ๊ฐํ์ธ์ (๊ธฐ์กด `if ($_POST['action'] === 'add')` ๋ธ๋ก ์งํ):
```php
elseif ($_POST['action'] === 'delete') {
$id = intval($_POST['id']);
$stmt = $pdo->prepare("DELETE FROM entries WHERE id = ?");
$stmt->execute([$id]);
header('Location: /daily-english-diary');
exit;
}
```
3. ํต๊ณ ์นด๋๋ฅผ ์์ฑ ํผ๊ณผ ์ผ๊ธฐ ๋ชฉ๋ก ์ฌ์ด์ ์ถ๊ฐํ์ธ์:
```php
<!-- ํต๊ณ ์นด๋ -->
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 16px; margin-bottom: 32px;">
<div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: var(--m-radius-lg); padding: 20px; color: white; box-shadow: var(--m-shadow);">
<div style="font-size: 13px; opacity: 0.9; margin-bottom: 4px;">๐ ์ด ์์ฑ ์ผ์</div>
<div style="font-size: 32px; font-weight: 700;"><?php echo $total_count; ?></div>
</div>
<div style="background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%); border-radius: var(--m-radius-lg); padding: 20px; color: white; box-shadow: var(--m-shadow);">
<div style="font-size: 13px; opacity: 0.9; margin-bottom: 4px;">๐
์ด๋ฒ ๋ฌ ์์ฑ</div>
<div style="font-size: 32px; font-weight: 700;"><?php echo $this_month_count; ?></div>
</div>
<div style="background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%); border-radius: var(--m-radius-lg); padding: 20px; color: white; box-shadow: var(--m-shadow);">
<div style="font-size: 13px; opacity: 0.9; margin-bottom: 4px;">๐ฅ ์ฐ์ ์์ฑ ์ผ์</div>
<div style="font-size: 32px; font-weight: 700;"><?php echo $streak; ?></div>
</div>
</div>
```
4. ์ผ๊ธฐ ๋ชฉ๋ก์ ๊ฐ ํญ๋ชฉ์ ์ญ์ ๋ฒํผ์ ์ถ๊ฐํ์ธ์ (๊ธฐ์กด `<!-- ์์ /์ญ์ ๋ฒํผ (๋ค์ ๋จ๊ณ์์ ๊ตฌํ) -->` ์ฃผ์ ๋ถ๋ถ์ ๊ต์ฒด):
```php
<form method="POST" style="display: inline;" onsubmit="return confirm('์ ๋ง ์ญ์ ํ์๊ฒ ์ต๋๊น?');">
<input type="hidden" name="action" value="delete">
<input type="hidden" name="id" value="<?php echo $entry['id']; ?>">
<button type="submit" style="padding: 4px 12px; background: #ef4444; color: white; border: none; border-radius: 6px; font-size: 12px; cursor: pointer;">
๐๏ธ ์ญ์
</button>
</form>
```
5. ๋ธ๋ผ์ฐ์ ์์ ํ
์คํธํ์ธ์:
- ํต๊ณ ์นด๋๊ฐ ํ์๋๋์ง ํ์ธ
- ์ฌ๋ฌ ๋ ์ง์ ์ผ๊ธฐ๋ฅผ ์์ฑํ์ฌ ์ฐ์ ์์ฑ ์ผ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ณ์ฐ๋๋์ง ํ์ธ
- ์ญ์ ๋ฒํผ ํด๋ฆญ ์ ํ์ธ ๋ฉ์์ง๊ฐ ๋ํ๋๊ณ ์ญ์ ๋๋์ง ํ์ธ
๊ธฐ๋ ๊ฒฐ๊ณผ: - ์์ฑ ํผ ์๋์ 3๊ฐ์ ํต๊ณ ์นด๋๊ฐ ๊ทธ๋ผ๋ฐ์ด์ ๋ฐฐ๊ฒฝ์ผ๋ก ํ์๋จ - ์ด ์์ฑ ์ผ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ํ์๋จ - ์ด๋ฒ ๋ฌ ์์ฑ ํ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ํ์๋จ - ์ฐ์ ์์ฑ ์ผ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๊ณ์ฐ๋จ (์ค๋ ๋๋ ์ด์ ๋ถํฐ ์ฐ์์ผ๋ก ์์ฑํ ๋ ์ง ์) - ๊ฐ ์ผ๊ธฐ ํญ๋ชฉ์ ๋นจ๊ฐ์ ์ญ์ ๋ฒํผ์ด ํ์๋จ - ์ญ์ ๋ฒํผ ํด๋ฆญ ์ ํ์ธ ๋ฉ์์ง๊ฐ ๋ํ๋จ - ํ์ธ ํ ์ผ๊ธฐ๊ฐ ์ญ์ ๋๊ณ ํ์ด์ง๊ฐ ์๋ก๊ณ ์นจ๋จ - ํต๊ณ ์์น๊ฐ ์ญ์ ํ ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋จ - ๋คํฌ๋ชจ๋์์๋ ํต๊ณ ์นด๋์ ๊ทธ๋ผ๋ฐ์ด์ ์ด ์ ๋ณด์
์ ์ถ๋ ์ํ (0)
๋ก๊ทธ์ธ ํ ์ ์ถ์์ง ์ ์ถ๋ ์ํ์ด ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋์ ์๊ฐ ๋์ด๋ณด์ธ์!