4์ฃผ์ฐจ ํ๊ณ ๋ก ch2. ์๋ฒ ๋ง๋ค๊ธฐ, ๋์ form ์ ์ก, ํ์ผ ์ ๋ก๋(feat. 4์ฃผ์ฐจ ์ผ์)
[ํฌ์ค์ฝ X ์ฝ๋ฉ์จ ํ์คํ ์น๊ฐ๋ฐ์ ๋ถํธ์บ ํ 7๊ธฐ]
4์ฃผ ์ฐจ ํ๊ณ ๋ก
๋ ๋ฒ์งธ!!
๋ณธ๊ฒฉ์ ์ธ ์๋ฒ ๋ง๋ค๊ธฐ์,
form ์ ์กํ๊ธฐ๋ฅผ ๋ฐฐ์ ๋ค
4์ฃผ ์ฐจ์ ์ ๋ณด์ฒ๋ฆฌ๊ธฐ์ฌ ํ๊ธฐ์ํ์ด ์์ด
๊ทธ๋ ๊ทธ๋ ๋ณต์ต์ ์ ๋๋ก ๋ชป ํ๋ค..
๊ทธ๋ฌ๋๋ ์์
์๊ฐ์ ์ค์ต๋ฌธ์
๊ฑฐ์ฆ ๋ชป ํ์๋ค ใ
ใ
๋ค๋ฆ๊ฒ ํ๋ ๋ณต์ต!!
์ฌ์ฌ ์ด๋ ค์์ง๋ค ~
์ ์ ์ฐจ๋ฆฌ์
์๋ฒ ๋ง๋ค๊ธฐ
Node.js๋ฅผ ํตํด ์๋ฒ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์
http์ express๋ ๊ฐ๊ฐ ์๋ค.
1. httpํต์
http๋ชจ๋
- ์น ์๋ฒ๋ฅผ ๊ตฌ๋ํ๊ธฐ ์ํ node.js๋ด์ฅ ์น๋ชจ๋
- server๊ฐ์ฒด, request ๊ฐ์ฒด, response๊ฐ์ฒด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- server๊ฐ์ฒด : ์น ์๋ฒ๋ฅผ ์์ฑํ ๋ ์ฌ์ฉ
- response : ์๋ต ๋ฉ์์ง๋ฅผ ์์ฑํ ๋ ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋๋ ๊ฐ์ฒด
- request ๊ฐ์ฒด : ์๋ต ๋ฉ์์ง๋ฅผ ์์ฑํ ๋ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋๋ ๊ฐ์ฒด
ํจํค์ง ๋งค๋์ : npm
Node Package Manager
๋ ธ๋ ํจํค์ง๋ฅผ ๊ด๋ฆฌํด ์ฃผ๋ ํ
npm init
: ํ๋ก์ ํธ ์์ ๋ช ๋ น์ด
: package.json์ ๊ธฐ๋ก๋ ๋ด์ฉ์ ๋ฌธ๋ต์์ผ๋ก ์ ๋ ฅ
npm init --yes
: package.json์ด ์์ฑ๋ ๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์์ฑ
npm install ํจํค์ง ์ด๋ฆ
: ํ๋ก์ ํธ์์ ์ฌ์ฉํ ํจํค์ง๋ฅผ ์ค์นํ๋ ๋ช ๋ น์ด
Express
- ์น ์๋ฒ๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋
๊ธฐ๋ฅ์ ๋ด๋นํ๋ ํ๋ ์ ์ํฌ
- ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ธฐ ์ํ
๊ฐ์ข ๋ฉ์๋์ ๋ฏธ๋ค์จ์ด ๋ฑ์ด ๋ด์ฅ๋์ด ์๋ค.
- http๋ชจ๋ ์ด์ฉ ์ ์ฝ๋์ ๊ฐ๋ ์ฑ๐, ํ์ฅ์ฑ๐
์ค์น
: npm install express
-> node_modules๊ฐ ๋ง๋ค์ด์ง๋ฉฐ
express์ ๊ด๋ จ๋ ํด๋๊ฐ ์์ฑ
express ์ฌ์ฉ
const express = require("express");
const app = express();
const PORT = 8080;
app.get("/", function (req, res) => {
res.send("hello express");
});
app.listen(PORT, function () {
console.log(`http://localhost:${PORT}`);
});
-> express()
: express ๋ชจ๋์ด export ํ๋
์ต์์ ํจ์๋ก, express application์ ๋ง๋ฆ
-> app๊ฐ์ฒด
: express() ํจ์๋ฅผ ํธ์ถํจ์ผ๋ก์จ
๋ง๋ค์ด์ง express application
-> app๊ฐ์ฒด์ method
: http์์ฒญ์ ๊ฐ ์์ฒญ์ ๋ง๋
๊ฒฝ๋ก๋ก ์ ์กํ๋ ๋ฉ์๋(๋ผ์ฐํ )
๋ฏธ๋ค์จ์ด
: ์์ฒญ์ด ๋ค์ด์ด์ ๋ฐ๋ผ
์๋ต๊น์ง์ ์ค๊ฐ ๊ณผ์ ์ ํจ์๋ก ๋ถ๋ฆฌํ ๊ฒ
: ์๋ฒ์ ํด๋ผ์ด์ธํธ๋ฅผ ์ด์ด์ฃผ๋ ์ค๊ฐ ์์
: use()๋ฅผ ์ด์ฉํด ๋ฑ๋กํ ์ ์๋ค.
static
: ์ด๋ฏธ์ง, cssํ์ผ ๋ฐ javascriptํ์ผ๊ณผ ๊ฐ์
์ ์ ํ์ผ ์ ๊ณต
: express์ ์๋ static๋ฉ์๋๋ฅผ ์ด์ฉํด
๋ฏธ๋ค์จ์ด๋ก ๋ก๋
app.use(express.static('public'));
app.use('/static', express.static('public'));
ํ ํ๋ฆฟ ์์ง
ejs ํ ํ๋ฆฟ
: ๋ฌธ๋ฒ๊ณผ ์ค์ ์ ๋ฐ๋ผ ํ์ผ์ htmlํ์์ผ๋ก ๋ณํ์ํค๋ ๋ชจ๋
ejs
: embedded javascript์ ์ฝ์๋ก,
์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ด์ฅ๋์ด ์๋ htmlํ์ผ
: ํ์ฅ์๋. ejs
npm install ejs
๋กํ ํ๋ฆฟ์ ๊น์์ค
app.set("view engine", "ejs");
<% %>
: ๋ฌด์กฐ๊ฑด ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ๋ค์ด๊ฐ์ผ ํ๊ณ ,
์ค ๋ฐ๊ฟ์ ํ ๊ฒฝ์ฐ์๋ ์๋ก์ด <% %>๋ฅผ ์ด์ฉํด์ผ ํ๋ค.
<%= %>
: ๋ณ์์ ๊ฐ์ ์ถ๋ ฅํ ๋ ์ฌ์ฉ
<%- include('view์ ์๋ ์ฃผ์')%>
: ๋ค๋ฅธ view ํ์ผ์ ๋ถ๋ฌ์ฌ ๋ ์ฌ์ฉ
๋์ form ์ ์ก
<input type="submit">์ด๋
<button type="submit">์ ์ด์ฉํด ์ ์ก
์ ์ก ์ ํ์ด์ง ์ด๋์ด ์ผ์ด๋จ!
๋๊ธฐ ๋ฐฉ์
: ํ ๋ฒ์ ํ๋๋ง ์ฒ๋ฆฌ
-> ํ์ด์ง๋ฅผ ์์ ์ด๋ํด ์๋ฒ๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
๋น๋๊ธฐ ๋ฐฉ์
: ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ณ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ ๋์
๋ค๋ฅธ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค!
๋น๋๊ธฐ httpํต์ ๋ฐฉ๋ฒ
1. Ajax
- Asynchronous JavaScript And Xml
์ฅ์
- jquery๋ฅผ ํตํด ์ฝ๊ฒ ๊ตฌํ ๊ฐ๋ฅ
- error, success, complete์ ์ํ๋ฅผ ํตํด
์คํ ํ๋ฆ์ ์กฐ์ ํ ์ ์๋ค.
๋จ์
- jquery๋ฅผ ์ฌ์ฉํด์ผ๋ง, ๊ฐํธํ๊ณ ํธํ์ฑ์ด ๋ณด์ฅ
- promise๊ธฐ๋ฐ์ด ์๋๋ค.
์ฝ๋์ ์ฐจ์ด๋ get, post์ ์ฐจ์ด๋ฟ!
2. Axios
- Node.js์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํ Promise API๋ฅผ ํ์ฉ
- ๋น๋๊ธฐ httpํต์ ์ด ๊ฐ๋ฅ,
return์ด Promise๊ฐ์ฒด๋ก ์จ๋ค.
์ฅ์
- promise๊ธฐ๋ฐ
- ๋ธ๋ผ์ฐ์ ํธํ์ฑ์ด ๋ฐ์ด๋จ
๋จ์
- ๋ชจ๋ ์ค์น or ํธ์ถ์ ํด์ค์ผ ์ฌ์ฉ์ด ๊ฐ๋ฅ
get๊ณผ post์ ์ฐจ์ด
: get์ params :data,
post๋ data: data
3. Fetch
- ES6๋ถํฐ ๋ค์ด์จ javascript๋ด์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Promise๊ธฐ๋ฐ
์ฅ์
- javascript ๋ด์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฏ๋ก
๋ณ๋์ importํ์ X
- Promise๊ธฐ๋ฐ
๋จ์
- ์ต์ ๋ฌธ๋ฒ
- Timeout๊ธฐ๋ฅ์ด ์๋ค.
- ์๋์ ์ผ๋ก Axios์ ๋นํด ๊ธฐ๋ฅ ๋ถ์กฑ
-> post์๋ headers์ body๊ฐ ์๋ค.
response.text() : ์๋ต์ ์ฝ๊ณ ํ ์คํธ๋ฅผ ๋ฐํ
response.json(): ์๋ต์ jsonํํ๋ก ํ์ฑ
Axios ๋ฌธ๋ฒ
axios({
url: 'ํต์ ํ๊ณ ์ ํ๋ ์ฃผ์',
method: 'ํต์ ํ๊ณ ์ ํ๋ ๋ฐฉ์',
data: {json ํํ์ ๋ณด๋ด๊ณ ์ ํ๋ ๋ฐ์ดํฐ}
});
url์๋
form์์ action์ ํด๋น
๋ด๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ณ ์ ํ๋ ์ฃผ์
method ์๋
get, post, patch, delete
default๊ฐ์ get์ด๋ค.
data ์๋
{key:value, key:value}
put, post, patch์ผ ๋ ์ฌ์ฉ
Request์ body๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ธ๋ค.
Axios๋ฌธ๋ฒ - ์๋ต
์ค์ต ๋ฌธ์ !!
์ค์ต 26. get์ผ๋ก ์ ๋ณด ๋ฐ๊ธฐ
26.ejs>
result.ejs>
index.js>
์ค์ต 29. axios get ํ์๊ฐ์
function registerFunc() {
//ํผ ์ ํํ๊ธฐ
const form = document.forms['register'];
console.dir(form);
console.log(
document.querySelectorAll("input[name=hobby]:checked").value
);
const check = document.querySelectorAll("input[name=hobby]:checked").value;
check.forEach((value => console.log(value)));
const data = {
name: form.name.value,
gender: form.gender.value,
hobby: form.hobby.value
};
axios({
url: '/axios',
method: 'GET',
params: data,//get์ผ ๋๋ params
}).then(function (abc) {
console.log(abc.data);
const { name, gender, hobby } = abc.data;
result.textContent = `axios GET : ์ด๋ฆ์ ${name}, ์ฑ๋ณ์ ${gender}, ์ทจ๋ฏธ๋ ${hobby}`
});
}
์ด ๋ฌธ์ ์์๋ name์ด๋ gender๊ฐ์ ์ถ๋ ฅ์ด ๋์๋๋ฐ,
hobby๊ฐ์ด ์ถ๋ ฅ์ด ๋์ง ์์ ์ ๋ฅผ ๋จน์๋ค.
๋์ค์ ๋ณด๋ ๋ค๋ฅธ ์๊ฐ์ ๋ถ๋ค๋ ๊ทธ๋ ๊ณ
๊ฐ์ฌ๋๋ ๊ทธ๋ ๊ณ
๊ทธ ๋ถ๋ถ์ด ์ํํ๊ฒ ์ ๋์ง๋ ์์ ๋ชจ์์ด๋ค.
console.log(
document.querySelectorAll("input[name=hobby]:checked").value
);
const check = document.querySelectorAll("input[name=hobby]:checked").value;
์ด ๋ถ๋ถ์ ์ถ๊ฐํด ์ฃผ๋
์ ๋๋ก ๋์ํจ!
์ค์ต 30. axios post ๋ก๊ทธ์ธ
indes.js>
const id = "banana";
const pw = "4321";
app.post("/login", (req, res) => {
console.log(req.body);
if (req.body.id !== id) {
res.send({ result: false });
}
if (req.body.id === id && req.body.pw === pw) {
res.send({ result: true, userInfo: req.body });
} else {
res.send({ result: false });
}
});
index.ejs>
if (form.userId.value === "" || form.userPw.value === "") {
result.textContent = `์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํ์ธ์`;
return;
}
axios({
method: "POST",
url: "/login", //api์ฃผ์ // endpoint
data: {
id: form.userId.value,
pw: form.userPw.value,
},
}).then((res) => {
console.log(res);
console.log(res.data);
if (res.data.result === true) {
result.textContent = `๋ก๊ทธ์ธ์ ์ฑ๊ณตํ์์ต๋๋ค.`;
result.style.color = "blue";
} else {
result.textContent = `๋ก๊ทธ์ธ์ ์คํจํ์์ต๋๋ค`;
result.style.color = "red";
}
});
ํ์ผ ์ ๋ก๋
ํ์ํ ๊ฒ 1.
body-parser
- ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- post๋ก ์ ๋ณด๋ฅผ ์ ์กํ ๋, ์์ฒญ์ body๋ก ๋ฐ์ ์ ์๊ฒ ๋์์ค
- ๋จ, ๋ฉํฐ ํํธ ๋ฐ์ดํฐ(์ด๋ฏธ์ง, ๋์์, ํ์ผ ๋ฑ)๋ฅผ
์ฒ๋ฆฌํ์ง ๋ชปํด, multer๋ฅผ ์ด์ฉํ๋ค.
app.use(express.urlencoded({extended: true}));
app.use(express.json());
multer
: ํด๋ผ์ด์ธํธ -> ์๋ฒ๋ก
ํ์ผ์ ์ ๋ก๋ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ํ์ผ ์ ๋ก๋๋ฅผ ์ํด ์ฌ์ฉ๋๋ ๋ฏธ๋ค ์จ์ด
- express๋ก ์๋ฒ๋ฅผ ๊ตฌ์ถํ ๋
๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๋ฏธ๋ค์จ์ด
multer ์ค์น>
npm install multer //multer์ค์นํ๊ธฐ
const multer = require('multer');
ํด๋ผ์ด์ธํธ ์ค๋น >
<form action="/upload" method="POST" enctype="multipart/form-data">
enctype ์์ฑ์ผ๋ก๋
"multipart/form-data" ๋ฐ๋์ ์ค
ํ์ผ ์ ๋ก๋ ๊ฒฝ๋ก ์ค์ >
const multer = require('multer');
const upload = multer({
dest : 'uploads/',
});
dest : ํ์ผ์ ์ ๋ก๋ํ๊ณ
๊ทธ ํ์ผ์ด ์ ์ฅ๋ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ ์์ฑ
ํ์ผ ์ ๋ก๋>
<input type="file" name="userfile">
ํ๋์ ํ์ผ ์ ๋ก๋>
single() : ํ๋์ ํ์ผ ์ ๋ก๋
<h4>์ฑ๊ธ ํ์ผ ์
๋ก๋</h4>
<form action="/upload" method="POST" enctype="multipart/form-data">
<input type="file" name="fileName" />
<input type="text" name="title">
<button type="submit">์
๋ก๋</button>
</form>
app.post("/upload", uploadDetail.single("fileName"), function (req, res) {
console.log(req.file);
console.log(req.body);
res.send("ํ์ผ์
๋ก๋");
});
ํ์ผ ์ฌ๋ฌ ๊ฐ ์ ๋ก๋>
array(): ์ฌ๋ฌ ํ์ผ์ ์ ๋ก๋ํ ๋ ์ฌ์ฉ,
ํ๋์ ์์ฒญ ์์ ์ฌ๋ฌ ๊ฐ์ ํ์ผ์ด ์กด์ฌ
<h4>์ฌ๋ฌ๊ฐ ํ์ผ ์
๋ก๋</h4>
<form action="/upload/array" method="POST" enctype="multipart/form-data">
<input type="file" name="fileName" multiple />
<button type="submit">์
๋ก๋</button>
</form>
app.post("/upload/array", uploadDetail.array("fileName"), (req, res) => {
res.send("๋ฉํฐ ํ์ผ ์
๋ก๋");
});
์ฌ๋ฌ๊ฐ ๊ฐ๊ฐ ํ์ผ ์ ๋ก๋>
<h4>์ฌ๋ฌ๊ฐ ๊ฐ๊ฐ ํ์ผ์
๋ก๋</h4>
<form action="/upload/fields" method="POST" enctype="multipart/form-data">
<input type="file" name="fileName1" />
<br />
<input type="file" name="fileName2" />
<input type="submit" value="์
๋ก๋" />
</form>
app.post(
"/upload/fields",
uploadDetail.fields([{ name: "fileName1" }, { name: "fileName2" }]),
(req, res) => res.send("๊ฐ๊ฐ ๋ฉํฐ ํ์ผ ์
๋ก๋")
);
multer ์ ๋ฆฌ>
- single() : ํ๋์ ํ์ผ ์ ๋ก๋
req.file : ํ์ผ ํ๋
req.body : ๋๋จธ์ง ์ ๋ณด
- array() : ์ฌ๋ฌ ํ์ผ์ ์ ๋ก๋ํ ๋ ์ฌ์ฉ,
ํ๋์ ์์ฒญ ์์ ์ฌ๋ฌ ๊ฐ์ ํ์ผ์ด ์กด์ฌ
req.files : ํ์ผ n ๊ฐ
req.body : ๋๋จธ์ง ์ ๋ณด
- field() : ์ฌ๋ฌ ํ์ผ์ ์ ๋ก๋ํ ๋ ์ฌ์ฉ,
ํ๋์ ์์ฒญ์ด ์๋ ์ฌ๋ฌ ๊ฐ์ ์์ฒญ์ด ๋ค์ด์ฌ ๋
req.files : ํ์ผ n ๊ฐ
req.body : ๋๋จธ์ง ์ ๋ณด
Axios ๋์ ํ์ผ ์ ๋ก๋
์๋ฐ ์ํ ๋ง๋ค๊ธฐ!
function upload() {
//form์ ๋์ ์ผ๋ก ์ ์ด
const formData = new FormData();
const file = document.getElementById('dynamicUpload');
formData.append("dynamicUpload", file.files[0]);
console.log(file.files[0]);
axios({
method: "POST",
url: "/dynamic",
data: formData,
headers: {
'Content-Type': 'multipart/form-data'
},
}).then(function (res) {
console.log(res);
const img = document.querySelector("#img");
img.setAttribute("src", res.data.path);
});
}
app.post("/dynamic", uploadDetail.single("dynamicUpload"), function (req, res) {
console.log(req.file);
res.send(req.file);
});
ํ์ผ ์ ๋ก๋ ์ค์ต
์ฝ๋ ์ผ๋ถ๋ง!
<button type="button" onClick="upload()">ํ์๊ฐ์
</button>
axios({
url: '/axios',
method: 'GET',
params: data,//get์ผ ๋๋ params
}).then(function (abc) {
console.log(abc.data);
const { id, pw, name, age } = abc.data;
result.textContent = `์์ด๋ : ${id} ๋น๋ฐ๋ฒํธ : ${pw}, ์ด๋ฆ : ${name}, ๋์ด : ${age}`
});
axios({
method: "POST",
url: "/dynamic",
data: formData,
headers: {
'Content-Type': 'multipart/form-data'
},
}).then(function (res) {
console.log(res);
const img = document.querySelector("#img");
img.setAttribute("src", res.data.path);
});
ํจ์ upload()๋ฅผ ์์ฑํ ๋,
upload ํจ์๋ฅผ ๋ ๊ฐ ๋ง๋ค์ด
๊ธ์ ์ถ๋ ฅํ๊ธฐ, ๊ทธ๋ฆผ ์ถ๋ ฅํ๊ธฐ๋ก ๋ง๋ค์๋๋ฐ
๊ทธ๋ ๊ฒ ํ๋ ์ฌ์ง๋ง ์ถ๋ ฅ๋๊ณ ๊ธ์๋ ์ถ๋ ฅ์ด ์๋์๋ค.
ํจ์ ํ๋์ ๊ธ์, ๊ทธ๋ฆผ ๋ ๋ค ์ถ๋ ฅํ ์ ์๋๋ก
์ฝ๋๋ฅผ ์งฐ๋ค!
ํจ์๋ฅผ ๋ ๊ฐ ์ ์ธํ๋ ๊ฑด
๋ง๋ ์ ๋์ง..
๊ทผ๋ฐ ํจ์ ๋ช ์ด ๊ฐ๊ฒ ํด์
ํจ์ ๋ ๊ฐ ์ ์ธํ๋ ๊ฒ๋ ์์ง ์๋?
๊ทธ๋ฐ ๊ฒ ์์๋?..
์ฐพ์๋ด์ผ์ง..
์ํผ ํ์ ๊ฐ์ ๋ฒํผ์ ๋๋ฅด๋ฉด
์ด๋ ๊ฒ ์ถ๋ ฅ๋๋ค!
๊ทธ๋ฆฌ๊ณ
4์ฃผ ์ฐจ์ ์ผ์ ~..
์ ์ฒ๊ธฐ ํ๊ธฐ ํ๊ธฐ..
๋ฏธ๋ฆฌ๋ฏธ๋ฆฌ ๊ณต๋ถ ์ ํ ์์ ์ตํ..
๋๋ฌผ ์ ์ ์ด๋ ์๋ฒฝ์ ์ผ๊ฐ๊น๋ฐฅ์ด์๋ค..
(์ฌ์ค ๋ฅ์ค ํ์ ๋๋ฌผ๋ ์ ๋์ด)
๊ฒฐ๊ณผ๋ ํฉ๊ฒฉ ^^
๊ฐ๋ฒผ์ด ๋ฐ๊ฑธ์์ผ๋ก
์์ธ ์ด๋ชจ๋ค ์ง์ ๋๋ฌ ๊ฐ๋ค
์ด๋ชจ๋ค ์ง์
์์ฃผ ๋ฐ๋ปํ๋ค..
๋ฐฅ ๋จน๊ณ ์ด๋ชจ ์์ ์ด๋๋ ค
์ฅ๋ฏธ ์ถ์ ๊น์ง ์ผ๋ฌด์ง๊ฒ ๋ณด๊ณ ์๋ค..
์ ๋ ๋ฐค์์ ๋น์ฅ์ด๋ผ๋ ์ง ๊ฐ์ ์๊ณ ์ถ์๋๋ฐ
์ด๋ชจ : ์งํ์ ~~ ์ฌ๊ธฐ ์๋ด~~
๋ : ์ด๋ชจ.. ๋ ๊ด์ฐฎ..
์ด๋ชจ : ๋นจ๋ฆฌ ~~
๋ : ์ด์ ์ง..
์ด๋ชจ : ์ฐ๋ฆฌ ์ ๊ธฐ๋ ๊ฐ๋ณผ๊น??~
์ฌ์ง๋ง ๊ฑฐ์ฆ ๋ฐฑ์ฅ ์ฐ์๋..
์ฌ๋์ด ํ๋ ๋ง์์ ์ฌ๋์ ๋ณธ ๊ฑด์ง
๊ฝ์ ๋ณธ๊ฑด์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง
์์ฒญ ์ํด๋๊ธด ํ๋ค!
๊ฝ์ ๊ฐํฅ ์๋ ๋๋
๊ฒฝ์น์ ๋๋๋ค
๊ทธ๋ฆฌ๊ณ 4์ฃผ ์ฐจ์ ๋จน์ ์์๋ค..
๋ชจ์๋๋ ๋ ๋ญ ๋ง์ด ๋จน๊ณ ๋ค๋
๋ค
๋๋ฆ ์ ์ด๊ณ ์๋ ๋ฏํ๋ฉด์๋
์์ง์ ๊ทธ๋ฆฌ ํธํ์ง ์์ ๊ฒ ๊ฐ๋ค..
์ฌ์ ์ผ๋ก ใ
์ทจ์ค์ ์ด๊ฑฐ ์ฐธ ํ๋ ์ด์ด๊ตฌ๋ง~
์ง ๊ฐ๊ณ ํ~~
๊ทธ๋ ์ง๋ง ๋ด๊ฐ ํ๊ธฐ๋ก ํ ์ผ์ด๋
ํด์ผ์ง ๋ญ ์ด์งธ~..
๋ค์ ์ฃผ๋
์ด์ฌํ ๊ณต๋ถํ๊ณ ..
์ด์ฌํ ์ ์ฑ๊ฒจ ๋จน์ผ๋ฉด์..
์ ์ด์๋ณด์~..
์งํ์ ์์์์ ~...