
์๋ ํ์ธ์ ๋ฟ์ ๋๋ค!
์ด๋ฒ์๋ ๋ค๋ฅธ ๋ถ๋ถ์์๋ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ๋ฒํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋ ํ๋ฌ๊ทธ์ธ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๊ฐ์ ธ์์ต๋๋ค.
๊ทธ๋ผ ์์ํฉ๋๋ค!!!
๋ชฉํ
DB์ Player ์ ๋ณด ์ ์ฅ
์ค๋ช
์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋ณ์์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง, ์ด์ ์ ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ ์๋ฒ๊ฐ ์คํ๋๊ณ ์๋ ๋์๋ง ๋ณ์์ ์ ์ฅ๋๊ณ , ์๋ฒ ์ข ๋ฃ ์ ์ญ์ ๋๋ค๋ ์ ์ ์๊ฒ๋์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์๋ฒ๊ฐ ์ข ๋ฃ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผํ๋๋ฐ ํด๋น ๋ฐฉ๋ฒ์ผ๋ก๋ ํฌ๊ฒ 2๊ฐ์ง๊ฐ ์์ต๋๋ค.
์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ํ ์คํธ ํ์ผ์ ์ ์ฅํ๋ ๊ฒ ์ ๋๋ค. CVS, JSON, YAML ๋ฑ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ํ ์คํธ ํ์ผ์ ์ ์ฅํ๋ฉด ๋จ์ํ๊ณ , ํ์ผ ๋ณต์ฌ/๋ถ์ฌ๋ฃ๊ธฐ๋ฅผ ํตํด ์ฝ๊ฒ ์ด๋ํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ์์ด ์ ์ ๊ฒฝ์ฐ์๋ ์ด ๋ฐฉ๋ฒ๋ ๊ด์ฐฎ์ง๋ง, ๋ฐ์ดํฐ๊ฐ ๋ง์์ง๋ฉด ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๊ณ ์ฒ๋ฆฌํ ๋์ ์ฑ๋ฅ์ด ๋จ์ด์ง๋ฉฐ ๋ณด์์ ๊ทธ๋ ๊ฒ ์ข์ ํธ์ ์๋๋๋ค.
๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. MySQL, SQLite, MongoDB ๋ฑ์ DBMS(DataBase Management System)๊ฐ ์์ผ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ฒ์ํ ์ ์๊ณ , ๋ฐ์ดํฐ๊ฐ ๋ง์์ ธ๋ ํ ์คํธ ํ์ผ์ ์ ์ฅํ๋ ๊ฒ๋ณด๋ค ๋ฐ์ดํฐ ์ฒ๋ฆฌํ ๋์ ์ฑ๋ฅ์ด ๊ด์ฐฎ์ ํธ์ ๋๋ค. ํ์ง๋ง ํ ์คํธ ํ์ผ์ ๋นํด ๋ฆฌ์์ค๊ฐ ๋ง์ด ์ฌ์ฉ๋๋ ํธ์ด๋ฉฐ ํ๋ฌ๊ทธ์ธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ํ ๋ณ๋์ ์ค์ ์ ํด์ฃผ์ด์ผํฉ๋๋ค.
์ด ๊ธ์์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ์์คํ ์ค ํ๋์ธ MySQL์ ์ฌ์ฉํด ํ๋ฌ๊ทธ์ธ์ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
๋ฐฉ๋ฒ
1. MySQL ์ค์
MySQL ๋ค์ด๋ก๋๋ ์๋ ๋งํฌ ์ฐธ๊ณ ํด์ฃผ์ธ์.
MySQL 8.0 ๋ค์ด๋ก๋ & ์ค์นํ๊ธฐ
์๋ ํ์ธ์ ๋ฟ์ ๋๋ค! MySQL 8.0 ๋ค์ด๋ก๋ ํ๋ ๋ฐฉ๋ฒ์ ์๋ ค๋๋ฆฌ๊ฒ ์ต๋๋ค. ๊ทธ๋ผ ์์ํฉ๋๋ค!!! ~ ํด๋น ๊ธ์์๋ 8.0.37 ๋ฒ์ ์ ๋ค์ด๋ก๋/์ค์นํฉ๋๋ค. ~ MySQL ๋ค์ด๋ก๋ ์ฌ์ดํธ์ ์ ์ - ์ค์น ํ
ppyom.tistory.com
1-1. MySQL ์คํ

๋ช ๋ นํ๋กฌํํธ๋ฅผ ์คํํ๊ณ , mysql -u root -p ๋ฅผ ์ ๋ ฅํด ๋ก๊ทธ์ธํด์ค๋๋ค.
1-2. User, Database ์์ฑ / ๊ถํ ๋ถ์ฌ

๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํด๋น ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ ์ ์ ๋ฅผ ์์ฑํฉ๋๋ค.
์ ๋ ์ ์ ppyom๊ณผ test_plugin_1 ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ฑํ์ต๋๋ค.
| - ์ ์ ์์ฑ create user ์ฌ์ฉ์์์ด๋ identified by ๋น๋ฐ๋ฒํธ; - ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ create database ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๋ฆ; - ์ ์ ์๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ด๋ จ๋ ๋ชจ๋ ๊ถํ ๋ถ์ฌ grant all privileges on ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๋ฆ.* to ์ฌ์ฉ์์์ด๋; |
๋ชจ๋ ์์ฑํ๋ค๋ฉด exit๋ฅผ ์ ๋ ฅํด ๋๊ฐ์ฃผ์ธ์.
1-3. Player Table ์์ฑ

์ฐ์ mysql -u ์ฌ์ฉ์์์ด๋ -p ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๋ฆ์ ์ ๋ ฅํด ์์์ ๋ง๋ ์ฌ์ฉ์/๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๋ก๊ทธ์ธํ ๋ค์ ์๋ ์ฝ๋๋ฅผ ์ ๋ ฅํด ํ ์ด๋ธ์ ์์ฑํด์ค๋๋ค.
create table user (
id varchar(36) not null comment 'ํ๋ ์ด์ด UUID',
username varchar(16) not null comment 'ํ๋ ์ด์ด ๋ง์ธํฌ๋ํํธ ๋๋ค์',
displayName varchar(16) null comment 'ํ๋ ์ด์ด๊ฐ ์ง์ ํ ๋๋ค์',
constraint player_pk
primary key (id)
);
2. DBConnection์ ๊ด๋ฆฌํ๋ ํ๋ฌ๊ทธ์ธ ์์ฑ
์ด ํ๋ฌ๊ทธ์ธ์ ๋ค๋ฅธ ์์ ์ ํ์ง ์๊ณ ์ค๋ก์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ/ํด์ ์ญํ ๋ง ํ๋ ํ๋ฌ๊ทธ์ธ์ ๋๋ค.
ํ๋ก์ ํธ ์์ฑ์ ์๋ ๋งํฌ ์ฐธ๊ณ ํด์ฃผ์ธ์.
[๋ง์ธํฌ๋ํํธ ํ๋ฌ๊ทธ์ธ๋ง๋ค๊ธฐ] IntelliJ ์์ด ํ๋ก์ ํธ ๊ตฌ์ฑํ๊ธฐ
์๋ ํ์ธ์! ๋ฟ์ ๋๋ค! ๋ ๋ฒ์งธ ๊ธ๋ก ์๋ IntelliJ IDEA์ ๋ง์ธํฌ๋ํํธ Extension์ ์ฌ์ฉํด์ ํ๋ก์ ํธ ์ ์ ํ๋ ๊ธ์ ์์ฑํ๋ ค๊ณ ํ๋๋ฐ!!์ธํ ๋ฆฌ์ ์ด๊ฐ ์ ๋ฃ..๊ธฐ๋ ํ๊ณ , ๊ทธ๋ฅ ์๋ฌด๊ฒ๋ ์๋ ์ํ
ppyom.tistory.com
[๋ง์ธํฌ๋ํํธ ํ๋ฌ๊ทธ์ธ๋ง๋ค๊ธฐ] IntelliJ ์ฌ์ฉํด์ ํ๋ก์ ํธ ๊ตฌ์ฑํ๊ธฐ
์๋ ํ์ธ์! ๋ฟ์ ๋๋ค! ์ ๋ฒ ๊ธ์์ ๋ง์๋๋ ธ๋ฏ..! ์ด๋ฒ์๋ IntelliJ์ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํด ํ๋ก์ ํธ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ค๋ช ๋๋ฆฌ๊ฒ ์ต๋๋ค..!๋ง์ฝ IntelliJ๊ฐ ์์ผ์๋ค๋ฉด ์๋ ๊ธ์ ํ์ธํด์ฃผ์ธ์~! [๋ง
ppyom.tistory.com
2-1. build.gradle์ maven ๋ฐฐํฌ๋ฅผ ์ํ ์ฝ๋ ์ถ๊ฐ
๋ค๋ฅธ ํ๋ก์ ํธ์์ ์ฌ์ฉํ๊ธฐ ์ํด maven local repository์ ๋ฐฐํฌํ ์ ์๋๋ก ๋ง๋ค ๊ฒ ์ ๋๋ค.
build.gradle์ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
| plugins { id 'java' id 'maven-publish' // maven publish๋ฅผ ์ํ ํ๋ฌ๊ทธ์ธ } ... // publish๋ฅผ ์ํ ์ฝ๋ publishing { publications { mavenJava(MavenPublication) { from components.java } } } |
์ด๋ ๊ฒ ์์ ํ๊ณ [Gradle ๋ณ๊ฒฝ ๋ด์ฉ ๋ก๋]๋ฅผ ํด๋ฆญํ๋ฉด Gradle ๋ฉ๋ด์ Tasks์ publishing์ด ์ถ๊ฐ๋ฉ๋๋ค. publishing - publishToMavenLocal์ ๋๋ธํด๋ฆญํ๋ฉด maven local repository์ ๋ฐฐํฌ๋ฉ๋๋ค. ๋ฐฐํฌ๋ ํ์ผ์ C:\Users\์ฌ์ฉ์์ด๋ฆ\.m2\repository\...ํจํค์ง... ์์ ํ์ธํ ์ ์์ต๋๋ค.


2-2. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ ํ์ผ ์์ฑ
์๋ฒ ํด๋ - plugins์ ํ๋ก์ ํธ ์ด๋ฆ๊ณผ ๊ฐ์ ํด๋๋ฅผ ์์ฑํ๊ณ , ํด๋น ํด๋์ config.yml ํ์ผ์ ์์ฑํฉ๋๋ค.
database:
url: jdbc:mysql://localhost:3306/๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๋ฆ
username: ์ฌ์ฉ์์์ด๋
password: ๋น๋ฐ๋ฒํธ
2-3. ์ฝ๋ ์์ฑ
ํ๋ฌ๊ทธ์ธ๊ณผ ์๋ฒ๊ฐ ์ฐ๊ฒฐ๋ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๊ฒฐํ๊ณ , ์๋ฒ์ ์ฐ๊ฒฐ์ด ํด์ ๋๋ค๋ฉด ์ฐ๊ฒฐ์ ํด์ ํ๋ฉด ๋ฉ๋๋ค.
ํ๋ฌ๊ทธ์ธ์ด ์๋ฒ์ ์ฐ๊ฒฐ๋ ๋ ์คํ๋๋ ๋ฉ์๋์ธ onEnable์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ๋ ์ฝ๋๋ฅผ ์์ฑํ๊ณ , ์๋ฒ์ ์ฐ๊ฒฐ์ด ํด์ ๋ ๋ ์คํ๋๋ ๋ฉ์๋์ธ onDisable์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ํด์ ํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋๋ ๊ฒ์ผ๋ก ์์ฃผ ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
package com.ppyom;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public final class DBConnectionPlugin extends JavaPlugin {
private Connection connection;
@Override
public void onEnable() {
getLogger().info("DBConnectionPlugin onEnable");
saveDefaultConfig();
connectDatabase();
}
@Override
public void onDisable() {
getLogger().info("DBConnectionPlugin onDisable");
if(connection != null) {
try {
connection.close();
getLogger().info("๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ด ํด์ ๋์์ต๋๋ค.");
} catch (SQLException e) {
getLogger().severe(e.getMessage());
}
}
}
private void connectDatabase() {
File configFile = new File(getDataFolder(), "config.yml");
FileConfiguration config = YamlConfiguration.loadConfiguration(configFile);
String url = config.getString("database.url");
String username = config.getString("database.username");
String password = config.getString("database.password");
try {
connection = DriverManager.getConnection(url, username, password);
getLogger().info("๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์ฑ๊ณตํ์ต๋๋ค.");
} catch(SQLException e) {
e.getStackTrace();
getLogger().severe("๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์คํจํ์ต๋๋ค.");
}
}
public Connection getConnection() {
return connection;
}
}
์ ์ฝ๋๋ฅผ ์์ฑํ ๋ค์ maven local repository์ ๋ฐฐํฌ(publishToMavenLocal)ํ๊ณ ๋น๋(build)ํฉ๋๋ค.
๋น๋๋ ํ๋ฌ๊ทธ์ธ์ ์๋ฒ์ ์ ์ฉ์ํค๋ฉด ์๋์ ๊ฐ์ด ์ฐ๊ฒฐ์ ์ฑ๊ณตํ๋ค๋ ๋ก๊ทธ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.

3. PlayerInformationPlugin ์์
์ด์ ํ๋ก์ ํธ์์ ์ด์ด์ ์งํํฉ๋๋ค.
[๋ง์ธํฌ๋ํํธ ํ๋ฌ๊ทธ์ธ] ๋๋ค์ ๋ณ๊ฒฝ ํ๋ฌ๊ทธ์ธ ๋ง๋ค๊ธฐ
์๋ ํ์ธ์ ๋ฟ์ ๋๋ค! ์ด๋ฒ์๋ ์๋ฒ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ๋ฒํ ๊ธฐ๋ฅ ์ค ํ๋์ธ ๋๋ค์ ๋ณ๊ฒฝ ๊ธฐ๋ฅ์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ผ ์์ํฉ๋๋ค!!! ๋ชฉํํ๋ ์ด์ด Display Name ๋ณ๊ฒฝ ์ปค๋งจ๋ ๋ง๋ค๊ธฐ ์ค
ppyom.tistory.com
3-1. ํ๋ก์ ํธ ์ค์ ํ์ผ ์์
plugin.yml
๋ค๋ฅธ ํ๋ฌ๊ทธ์ธ์ ์์กดํด์ผํ ๋์๋ ํด๋น ํ๋ฌ๊ทธ์ธ์ ์์กดํ๋ค๋ ๋ด์ฉ์ ๋ณ๋๋ก ์๋ ค์ฃผ์ด์ผํฉ๋๋ค.
์๋ ๋ด์ฉ์ ์ถ๊ฐํด์ฃผ์ธ์.
...
depend:
- DBConnectionPlugin
...
build.gradle
์ฝ๋์์ ์ฌ์ฉํ๊ธฐ ์ํด์ gradle์ dependency์ถ๊ฐ๊ฐ ํ์ํฉ๋๋ค.
์๋ ๋ด์ฉ์ ์ถ๊ฐํด์ฃผ์ธ์.
| ... repositories { mavenCentral() mavenLocal() ... } dependencies { compileOnly "io.papermc.paper:paper-api:1.20.4-R0.1-SNAPSHOT" compileOnly "๋ณธ์ธ์ํจํค์ง.DBConnectionPlugin:1.0-SNAPSHOT" } ... |
3-2. ์ฝ๋ ์์
UserDao.java
UserDao ์ ๋๋ค.
๊ธฐ์กด์ ๋ณ์๋ฅผ ์ฌ์ฉํด์ ์์ฑํ๋ ๋ถ๋ถ์ DB๋ฅผ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
package com.ppyom.user.dao;
import com.ppyom.common.dao.Dao;
import com.ppyom.user.domain.User;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
public class UserDao implements Dao<User> {
private final Connection connection;
public UserDao(Connection connection) {
this.connection = connection;
}
@Override
public User findById(String id) {
String query = "SELECT * FROM user WHERE id = ?";
try (PreparedStatement statement = connection.prepareStatement(query)) {
statement.setString(1, id.toString());
ResultSet resultSet = statement.executeQuery();
if(resultSet.next()) {
return extractUser(resultSet);
}
} catch (SQLException e) {
//
}
return null;
}
@Override
public List<User> findAll() {
List<User> users = new ArrayList<>();
String query = "SELECT * FROM user";
try (PreparedStatement statement = connection.prepareStatement(query)) {
ResultSet resultSet = statement.executeQuery();
if(resultSet.next()) {
users.add(extractUser(resultSet));
}
} catch (SQLException e) {
//
}
return users;
}
@Override
public void create(User user) {
String query = "INSERT INTO user (id, username) VALUES (?, ?)";
try (PreparedStatement statement = connection.prepareStatement(query)) {
statement.setString(1, user.getId().toString());
statement.setString(2, user.getUsername());
statement.executeUpdate();
} catch (SQLException e) {
//
}
}
@Override
public void update(User user) {
String query = "UPDATE user SET username = ?, displayName = ? WHERE id = ?";
try (PreparedStatement statement = connection.prepareStatement(query)) {
statement.setString(1, user.getUsername());
statement.setString(2, user.getDisplayName());
statement.setString(3, user.getId().toString());
statement.executeUpdate();
} catch (SQLException e) {
//
}
}
@Override
public void delete(User user) {
String query = "DELETE FROM user WHERE id = ?";
try (PreparedStatement statement = connection.prepareStatement(query)) {
statement.setString(1, user.getId().toString());
statement.executeUpdate();
} catch (SQLException e) {
//
}
}
private User extractUser(ResultSet resultSet) throws SQLException {
UUID id = UUID.fromString(resultSet.getString("id"));
String username = resultSet.getString("username");
String displayName = resultSet.getString("displayName");
return new User(id, username, displayName);
}
}
PlayerInformationPlugin.java
๋ฉ์ธ ํ๋ฌ๊ทธ์ธ์ ๋๋ค.
DBConnectionPlugin์ ๊ฐ์ ธ๋ค๊ฐ ์ฌ์ฉํฉ๋๋ค.
๊ธฐ์กด์ ์ด๋ฒคํธ, ์ปค๋งจ๋๋ฅผ ๋ฑ๋กํ๋ ๋ถ๋ถ์ ๋ชจ๋ ํฉ์ณ์ initPlugin ๋ฉ์๋๋ก ํตํฉํด์ ์ฌ์ฉํฉ๋๋ค.
package com.ppyom;
import com.ppyom.user.command.DisplayNameCommand;
import com.ppyom.user.dao.UserDao;
import com.ppyom.user.event.JoinListener;
import com.ppyom.user.service.UserService;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.PluginCommand;
import org.bukkit.event.Listener;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
import java.sql.Connection;
public final class PlayerInformationPlugin extends JavaPlugin {
@Override
public void onEnable() {
getLogger().info("PlayerInformationPlugin onEnable");
initPlugin();
}
@Override
public void onDisable() {
getLogger().info("PlayerInformationPlugin onDisable");
}
private void initPlugin() {
Plugin plugin = Bukkit.getPluginManager().getPlugin("DBConnectionPlugin");
if(plugin instanceof DBConnectionPlugin dbConnectionPlugin) {
Connection connection = dbConnectionPlugin.getConnection();
UserDao userDao = new UserDao(connection);
UserService userService = new UserService(userDao);
// ์ด๋ฒคํธ ๋ฑ๋ก
registerEvent(new JoinListener(userService));
// ์ปค๋งจ๋ ๋ฑ๋ก
registerCommand("display-name", new DisplayNameCommand(userService));
} else {
getLogger().severe("DBConnectionPlugin์ด ์๊ฑฐ๋ ์คํ๋์ง ์์์ต๋๋ค.");
Bukkit.getPluginManager().disablePlugin(this);
}
}
private void registerEvent(Listener listener) {
getServer().getPluginManager().registerEvents(listener, this);
}
private void registerCommand(String name, CommandExecutor commandExecutor) {
PluginCommand pluginCommand = getServer().getPluginCommand(name);
if(pluginCommand != null) {
pluginCommand.setExecutor(commandExecutor);
}
}
}
๊ฒฐ๊ณผ


์ ์ฌ์ง์ฒ๋ผ ๋๋ค์์ ๋ณ๊ฒฝํ๊ณ , ์๋ฒ๋ฅผ ์ฌ์์ํด๋ ๋๋ค์์ด ๊ทธ๋๋ก ๋จ์์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค!!!
์ ์ฝ์ด๋ณด์ จ๋์?
๋ค์์๋ ์ ์ฉํ ํ๋ฌ๊ทธ์ธ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๊ฐ์ ธ์๋ณด๊ฒ ์ต๋๋ค!
๊ถ๊ธํ ์ ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์๋ฉด ์ต๋ํ ์ด์ฌํ ๋ต๋ณํด๋๋ฆฌ๊ฒ ์ต๋๋ค!!
์ดํ ๋ค๋ฅธ๊ฒ๋ค ๋ณด๊ณ ์ถ์ผ๋ฉด ๋๊ธ ๋จ๊ฒจ์ฃผ์ธ์~~!!
๋ฟ์ด์์ต๋๋ค! ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!