
์๋ ํ์ธ์ ๋ฟ์ ๋๋ค!
๋ธ๋ก๊ทธ ๋ฐฉ๋ฌธ์ ๊ฒ์์ด๋ฅผ ๊ตฌ๊ฒฝํ๋ค๊ฐ SQLite๋ฅผ ๊ฒ์ํด์ ์ ์ํ์ ๋ถ์ด ๊ณ์ ๊ฑธ ์๊ฒ๋์์ต๋๋ค.
์๋ ๋ค๋ฅธ ๊ธ์ ์์ฑํ๊ณ ์๋ค๊ฐ ํน์๋ผ๋!! ํ์ํ ๋ถ์ด ๋ ๊ณ์ค ์๋ ์๋ค๋ ์๊ฐ์ ์ด ๊ธ์ ๋จผ์ ์์ฑํฉ๋๋ค!!
๊ทธ๋ผ ์์ํฉ๋๋ค!!!
์ด์ ์ ์์ฑํ ์ฝ๋์์ ์ด์ด์ง๋๋ค.
์ฝ๋๋ ์๋ ๋งํฌ๋ค ์ฐธ๊ณ ํด์ฃผ์ธ์!!
[๋ง์ธํฌ๋ํํธ ํ๋ฌ๊ทธ์ธ] ๋๋ค์ ๋ณ๊ฒฝ ํ๋ฌ๊ทธ์ธ ๋ง๋ค๊ธฐ
์๋ ํ์ธ์ ๋ฟ์ ๋๋ค! ์ด๋ฒ์๋ ์๋ฒ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ๋ฒํ ๊ธฐ๋ฅ ์ค ํ๋์ธ ๋๋ค์ ๋ณ๊ฒฝ ๊ธฐ๋ฅ์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ผ ์์ํฉ๋๋ค!!! ๋ชฉํํ๋ ์ด์ด Display Name ๋ณ๊ฒฝ ์ปค๋งจ๋ ๋ง๋ค๊ธฐ ์ค
ppyom.tistory.com
[๋ง์ธํฌ๋ํํธ ํ๋ฌ๊ทธ์ธ๋ง๋ค๊ธฐ] MySQL ์ฐ๋ํ๊ธฐ
์๋ ํ์ธ์ ๋ฟ์ ๋๋ค! ์ด๋ฒ์๋ ๋ค๋ฅธ ๋ถ๋ถ์์๋ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ๋ฒํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋ ํ๋ฌ๊ทธ์ธ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๊ฐ์ ธ์์ต๋๋ค. ๊ทธ๋ผ ์์ํฉ๋๋ค!!! ๋ชฉํDB์ Player ์ ๋ณด ์ ์ฅ ์ค๋ช ์๋ฒ์
ppyom.tistory.com
๋ชฉํ
SQLite๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ฌ๊ทธ์ธ ์์
์ค๋ช
์ ๋ฒ์ MySQL์ ์ฐ๋ํ๋ ํ๋ฌ๊ทธ์ธ์ ๋ง๋ค์์ต๋๋ค. ํ์ง๋ง MySQL์ ๋ณ๋๋ก ์ค์นํด์ผ๋๊ณ ์ค์ ๋ฐ ๊ด๋ฆฌ๊ฐ (๋น๊ต์ ) ๋ณต์กํ ํธ์ ๋๋ค. ๋๊ท๋ชจ ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ๋ MySQL์ ์ฌ์ฉํ๋ ๊ฒ๋ ์ข์ง๋ง, ์ผ๋ฐ ์๊ท๋ชจ ์ดํ๋ฆฌ์ผ์ด์ ์ด๋ผ๋ฉด ๊ฐ๋ณ๊ฒ ์ฌ์ฉํ ์ ์๋ SQLite๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ ์ข์ต๋๋ค.
SQLite๋ MySQL๊ณผ ๋ค๋ฅด๊ฒ ๋ณ๋๋ก ์ค์นํ์ง ์์๋ ๋๊ณ , ๋ณ๋๋ก ์ค์ ํด์ผํ๋๊ฒ ์์ต๋๋ค. ๊ฐ๋ณ๊ณ "์๊ท๋ชจ"์์ ๋งค์ฐ ๋น ๋ฅธ ์ฑ๋ฅ์ ๋ณด์ ๋๋ค. ํ์ง๋ง ๋ง์ ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋์์ write ์์ ์ ์ํํ๋ฉด ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ํ ๋ณด์ ๊ธฐ๋ฅ์ด ์ ํ์ ์ด๋ผ์ ๋ณด์์ด ์ค์ํ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ์ ์ง์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ทธ๋ผ ๋ฐ๋ก ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค!
๋ฐฉ๋ฒ
!! ์ ๊ฐ ํ ๋ฐฉ๋ฒ์ด ๋ฌด์กฐ๊ฑด ์ ๋ต์ ์๋๋ผ๋ ๊ฒ์ ์ธ์ ๋ ๊ธฐ์ตํ๊ณ ๊ณ์ จ์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. !!
!! ํน์๋ผ๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ์ ํํ ๋.. ๋๊ธ๋ก..!! ์๋ ค์ฃผ์๋ฉด ๊ฐ์ฌํฉ๋๋ค !!
์๋ฒ ํด๋ - plugins/ํ๋ฌ๊ทธ์ธํด๋/config.yml ์์
๊ธฐ์กด์ MySQL๋ง ์ฌ์ฉํ ์ ์๊ฒ ์์ฑํด๋ config ํ์ผ์ ์์ ํฉ๋๋ค.
์ด์ ๊ณผ๋ ๋ค๋ฅด๊ฒ ์์ผ๋ก๋ ์ด๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ์ง ์๋ ค์ฃผ๊ธฐ ์ํด type์ ์์ฑํฉ๋๋ค.
์๋ ์ฝ๋๋ฅผ ์์ฑํด์ฃผ์ธ์.
database:
type: sqlite
url: jdbc:sqlite:plugins/DBConnectionPlugin/database.db
DBConnectionPlugin ์์
์ด์ MySQL ๋ฟ๋ง ์๋๋ผ SQLite๋ ์ง์ํ๊ธฐ ์ํ ์ฝ๋๋ฅผ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.
์ ๋ ฅ๋ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ ์ DBConnectionPlugin ๋ฟ๋ง ์๋๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ํ๋ฌ๊ทธ์ธ์์ ํ์ํ๊ธฐ ๋๋ฌธ์ ๋ณ์๋ก ์ ์ฅํด๋๊ณ getConnection์ฒ๋ผ ๊ฐ์ ธ๊ฐ์ ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
...
private String databaseType;
...
public String getDatabaseType() {
return databaseType;
}
...
๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ ์ ์ฌ์ฉํด ์ ๋ ฅ๋ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ง๊ฒ ์ฒ๋ฆฌํ๋๋ก ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.
๋ง์ฝ databaseType์ด ์ฐ๋ฆฌ๊ฐ ์ง๊ธ ๋ง๋๋ ํ๋ฌ๊ทธ์ธ์ด ์ง์ํ์ง ์๋ ํ์ ์ด๋ผ๋ฉด ํ๋ฌ๊ทธ์ธ์ ์ค์ง์ํค๋๋ก ์ค์ ํด๋์์ต๋๋ค.
private void connectDatabase() {
File configFile = new File(getDataFolder(), "config.yml");
FileConfiguration config = YamlConfiguration.loadConfiguration(configFile);
String url = config.getString("database.url");
databaseType = config.getString("database.type");
if(url == null) {
getLogger().severe("Database URL์ null์ผ ์ ์์ต๋๋ค.");
getServer().getPluginManager().disablePlugin(this);
return;
}
try {
if("mysql".equalsIgnoreCase(databaseType)) {
connection = DriverManager.getConnection(
url,
config.getString("database.username"),
config.getString("database.password")
);
} else if("sqlite".equalsIgnoreCase(databaseType)) {
connection = DriverManager.getConnection(url);
} else {
getLogger().severe("์ง์ํ์ง ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์
์
๋๋ค.");
getServer().getPluginManager().disablePlugin(this);
return;
}
getLogger().info("๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์ฑ๊ณตํ์ต๋๋ค.");
getLogger().info(String.format("Database Type = %s", databaseType));
} catch(SQLException e) {
e.getStackTrace();
getLogger().severe("๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์คํจํ์ต๋๋ค.");
}
}
์ต์ข ์ฝ๋๋ ์๋์ ๊ฐ์ต๋๋ค.
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;
private String databaseType;
@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");
databaseType = config.getString("database.type");
if(url == null) {
getLogger().severe("Database URL์ null์ผ ์ ์์ต๋๋ค.");
getServer().getPluginManager().disablePlugin(this);
return;
}
try {
if("mysql".equalsIgnoreCase(databaseType)) {
connection = DriverManager.getConnection(
url,
config.getString("database.username"),
config.getString("database.password")
);
} else if("sqlite".equalsIgnoreCase(databaseType)) {
connection = DriverManager.getConnection(url);
} else {
getLogger().severe("์ง์ํ์ง ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์
์
๋๋ค.");
getServer().getPluginManager().disablePlugin(this);
return;
}
getLogger().info("๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์ฑ๊ณตํ์ต๋๋ค.");
getLogger().info(String.format("Database Type = %s", databaseType));
} catch(SQLException e) {
e.getStackTrace();
getLogger().severe("๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์คํจํ์ต๋๋ค.");
}
}
public Connection getConnection() {
return connection;
}
public String getDatabaseType() {
return databaseType;
}
}
PlayerInformationPlugin ์์
์ ๋ฒ ํ๋ก์ ํธ์์๋ MySQL์์ ๋ฏธ๋ฆฌ ํ ์ด๋ธ์ ๋ง๋ค์์ต๋๋ค. ๋ณดํต ์๋ฒ ๊ฐ๋ฐ์๋ ์ด๋ ๊ฒ ํ๋ ๊ฒ์ผ๋ก ์๊ณ ์์ต๋๋ค. ํ์ง๋ง SQLite๋ ๋์ฒด๋ก ํด๋ผ์ด์ธํธ์ธก ์ดํ๋ฆฌ์ผ์ด์ ์์ ์ฃผ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์์ค์ฝ๋์์ ํ ์ด๋ธ์ ์์ฑํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๋ฐ๋ก ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํด์ ํ ์ด๋ธ์ ์์ฑํ๋ ๊ฒ๋ณด๋ค ์์ค์ฝ๋์ ํ ์ด๋ธ ์์ฑํ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋๊ฒ ์ข์ ๊ฒ ๊ฐ์ MySQL๊ณผ SQLite ๋ชจ๋ ์์ค์ฝ๋์ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.
์ ๋ ํ ์ด๋ธ์ ๋ง๋๋ ๋ฉ์๋๋ฅผ ๋ณ๋์ ํด๋์ค์ธ UserTableCreator๋ฅผ ๋ง๋ค์์ต๋๋ค.
package com.ppyom.user.dao;
import com.ppyom.PlayerInformationPlugin;
import org.bukkit.plugin.Plugin;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
public class UserTableCreator {
private final Connection connection;
private final String databaseType;
public UserTableCreator(Connection connection, String databaseType) {
this.connection = connection;
this.databaseType = databaseType;
}
public void create() {
String query;
try (Statement statement = connection.createStatement()) {
if("mysql".equalsIgnoreCase(databaseType)) {
query = "CREATE TABLE IF NOT EXISTS user (" +
"id varchar(36) primary key," +
"username varchar(16) not null," +
"displayName varchar(16)" +
");";
} else if("sqlite".equalsIgnoreCase(databaseType)) {
query = "CREATE TABLE IF NOT EXISTS user (" +
"id text primary key," +
"username text not null," +
"displayName text" +
");";
} else { // ์ง์ํ์ง ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์
์ธ ๊ฒฝ์ฐ
throw new IllegalArgumentException(databaseType);
}
statement.execute(query);
} catch (SQLException | IllegalArgumentException e) {
Plugin plugin = PlayerInformationPlugin.getPlugin(PlayerInformationPlugin.class);
if(e instanceof SQLException) { // SQLException
plugin.getLogger().severe("๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฒ๋ฆฌ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.");
} else { // IllegalArgumentException
plugin.getLogger().severe(String.format("ํด๋น ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์
์ ์ฐพ์ ์ ์์ต๋๋ค. %s", e.getMessage()));
plugin.getServer().getPluginManager().disablePlugin(plugin);
}
}
}
}
๊ทธ๋ฆฌ๊ณ ํด๋น ํด๋์ค๋ฅผ ๋ฉ์ธ ํด๋์ค์์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
// TableCreator๋ฅผ ์์ฑํ๊ณ , create ๋ฉ์๋ ์คํ
UserTableCreator tableCreator = new UserTableCreator(
connection,
dbConnectionPlugin.getDatabaseType()
);
tableCreator.create();
์ต์ข ๋ฉ์ธ ํด๋์ค ์ฝ๋๋ ์๋์ ๊ฐ์ต๋๋ค.
package com.ppyom;
import com.ppyom.user.command.DisplayNameCommand;
import com.ppyom.user.dao.UserDao;
import com.ppyom.user.dao.UserTableCreator;
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();
UserTableCreator tableCreator = new UserTableCreator(
connection,
dbConnectionPlugin.getDatabaseType()
);
tableCreator.create();
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);
}
}
}
๊ฒฐ๊ณผ

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