Javaμ MySQLμ νμ©ν CLI κΈ°λ° νμ λ° μ§μ μ 보 κ΄λ¦¬ μμ€ν
ManagementSystemμ νμκ³Ό μ§μ(μ κ·μ§/μκ°μ )μ μ 보λ₯Ό ν¨μ¨μ μΌλ‘ κ΄λ¦¬ν μ μλ λ°μ΄ν°λ² μ΄μ€ κΈ°λ° κ΄λ¦¬ μμ€ν μ λλ€. λͺ λ Ήμ€ μΈν°νμ΄μ€(CLI)λ₯Ό ν΅ν΄ μ§κ΄μ μΈ μ¬μ©μ κ²½νμ μ 곡νλ©°, JDBCλ₯Ό νμ©ν λ°μ΄ν°λ² μ΄μ€ μ°λκ³Ό DAO ν¨ν΄μ μ μ©νμ¬ κ΅¬μ‘°μ μΌλ‘ μ€κ³λμμ΅λλ€.
- MVC ν¨ν΄ κΈ°λ° μν€ν μ²: Controller, Model(DAO), Viewμ λͺ νν μν λΆλ¦¬
- DAO ν¨ν΄ μ μ©: λ°μ΄ν°λ² μ΄μ€ λ‘μ§κ³Ό λΉμ¦λμ€ λ‘μ§μ μμ ν λΆλ¦¬
- Singleton ν¨ν΄: ν¨μ¨μ μΈ λ¦¬μμ€ κ΄λ¦¬λ₯Ό μν μ±κΈν€ ꡬν
- JDBC κΈ°λ° DB μ°λ: MySQL λ°μ΄ν°λ² μ΄μ€μμ μμ μ μΈ μ°κ²°
- μ€μκ° λ°μ΄ν° μ²λ¦¬: μ λ ₯ μ μλμΌλ‘ μ΄μ , νκ· , λ±κΈ κ³μ°
- β νμ μ 보 λ±λ‘ (νλ², μ΄λ¦, κ³Όλͺ©λ³ μ μ)
- β νμ μ 보 μμ λ° μμ
- β μ 체 νμ μ‘°ν (μ΄λ¦μ/νλ²μ/μ±μ μ μ λ ¬)
- β νΉμ νμ κ²μ
- β μλ μ±μ κ³μ° (μ΄μ , νκ· , νμ )
- μ κ·μ§ μ§μμ μ±κ³Ό νκ° λ° κΈμ¬ κ΄λ¦¬
- μκ°μ μ§μμ μκΈ κΈ°λ° κΈμ¬ μλ κ³μ°
- Language: Java 17 (Amazon Corretto)
- Database: MySQL 8.0.x
- JDBC Driver: MySQL Connector/J 8.0.22
- Library: Lombok 1.18.34
- IDE: IntelliJ IDEA
- Java JDK 17 μ΄μ
- MySQL 8.0.x μ΄μ
- MySQL Connector/J 8.0.22
git clone https://github.com/geeunii/ManagementSystem.git
cd ManagementSystem-- λ°μ΄ν°λ² μ΄μ€ μμ±
CREATE DATABASE ManagementSystem;
-- μ¬μ©μ μμ± λ° κΆν λΆμ¬
CREATE USER 'MSAdmin'@'localhost' IDENTIFIED BY 'MSAdmin';
GRANT ALL PRIVILEGES ON ManagementSystem.* TO 'MSAdmin'@'localhost';
FLUSH PRIVILEGES;USE ManagementSystem;
-- νμ ν
μ΄λΈ
CREATE TABLE Student (
sno VARCHAR(20) PRIMARY KEY,
name VARCHAR(20) NOT NULL,
korean INT CHECK(korean >= 0 AND korean <= 100),
english INT CHECK(english >= 0 AND english <= 100),
math INT CHECK(math >= 0 AND math <= 100),
science INT CHECK(science >= 0 AND science <= 100)
);
-- μ κ·μ§ μ§μ ν
μ΄λΈ (ν₯ν ꡬν μμ )
CREATE TABLE Fulltime (
empno VARCHAR(20) PRIMARY KEY,
name VARCHAR(20) NOT NULL,
result INT,
basicsalary INT
);
-- μκ°μ μ§μ ν
μ΄λΈ (ν₯ν ꡬν μμ )
CREATE TABLE Parttime (
empno VARCHAR(20) PRIMARY KEY,
name VARCHAR(20) NOT NULL,
hourwage INT,
workhour INT
);util/dbinfo.properties νμΌμ΄ μ΄λ―Έ μ€μ λμ΄ μμ΅λλ€:
driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/ManagementSystem?serverTimezone=Asia/Seoul
username = MSAdmin
password = MSAdminλ€λ₯Έ μ€μ μ μ¬μ©νλ €λ©΄ μ΄ νμΌμ μμ νμΈμ.
# μ»΄νμΌ
javac -encoding UTF-8 -d out/production/ManagementSystem \
-cp ".:lib/mysql-connector-java-8.0.22.jar:lib/lombok-1.18.34.jar" \
$(find . -name "*.java")
# μ€ν
java -cp "out/production/ManagementSystem:lib/mysql-connector-java-8.0.22.jar" \
view.MainMenuManagementSystem/
βββ controller/ # 컨νΈλ‘€λ¬ κ³μΈ΅ (λΉμ¦λμ€ λ‘μ§ μ²λ¦¬)
β βββ Controller.java # 컨νΈλ‘€λ¬ μΈν°νμ΄μ€
β βββ ControllerImpl.java # 컨νΈλ‘€λ¬ ꡬν체 (Singleton)
β
βββ model/ # λͺ¨λΈ κ³μΈ΅ (λ°μ΄ν° μ κ·Ό)
β βββ DBCommon.java # κ³΅ν΅ DAO μΈν°νμ΄μ€
β βββ Student.java # νμ κ΄λ ¨ μΈν°νμ΄μ€
β βββ StudentDAO.java # νμ DAO ꡬν체 (Singleton)
β
βββ vo/ # Value Object (λ°μ΄ν° μ μ‘ κ°μ²΄)
β βββ PersonVO.java # μΆμ λΆλͺ¨ ν΄λμ€
β βββ StudentVO.java # νμ λ°μ΄ν° κ°μ²΄
β
βββ view/ # λ·° κ³μΈ΅ (μ¬μ©μ μΈν°νμ΄μ€)
β βββ MainMenu.java # CLI λ©λ΄ μμ€ν
β
βββ util/ # μ νΈλ¦¬ν°
β βββ DBUtil.java # λ°μ΄ν°λ² μ΄μ€ μ°κ²° μ νΈλ¦¬ν°
β βββ dbinfo.properties # DB μ€μ νμΌ
β
βββ LICENSE # MIT λΌμ΄μ μ€
βββ README.md # νλ‘μ νΈ λ¬Έμ
------------------------------
- λ§€λμ§λ¨ΌνΈ μμ€ν
-
------------------------------
1. νμκ΄λ¦¬ 2. μ§μκ΄λ¦¬
3. μλ°κ΄λ¦¬ 4. μμ€ν
μ’
λ£
------------------------------
μ
λ ₯: 1
------------------------------
- νμ κ΄λ¦¬ μμ€ν
-
------------------------------
1. νμ μ
λ ₯ 2. νμ μμ
3. νμ μμ 4. νμ λͺ
λ¨λ³΄κΈ°
5. νμ κ²μ 6. μ’
λ£
------------------------------
μ
λ ₯: 1
------------------------------
νλ²: 2024001
μ΄λ¦: νκΈΈλ
κ΅μ΄ μ μ: 85
μμ΄ μ μ: 90
μν μ μ: 88
κ³Όν μ μ: 92
------------------------------
νλ² μ΄λ¦ κ΅μ΄ μμ΄ μν κ³Όν ν©κ³ νκ· λ±κΈ
------------------------------------------------------------------------------------------------
2024001 νκΈΈλ 85 90 88 92 355 88.8 B
λ°μ΄ν°λ² μ΄μ€ μ κ·Ό λ‘μ§μ λ³λμ κ°μ²΄λ‘ λΆλ¦¬νμ¬ κ΄μ¬μ¬λ₯Ό λͺ νν ꡬλΆνμ΅λλ€.
// StudentDAO - λ°μ΄ν°λ² μ΄μ€ μ κ·Όλ§ λ΄λΉ
public class StudentDAO implements Student {
private static StudentDAO dao;
public static StudentDAO getInstance() {
if (dao == null) dao = new StudentDAO();
return dao;
}
@Override
public void input(PersonVO personVO) {
// DB INSERT λ‘μ§
}
}μ₯μ :
- κ΄μ¬μ¬μ λΆλ¦¬ (Separation of Concerns)
- μ μ§λ³΄μ μ©μ΄μ± (DB λ³κ²½ μ DAOλ§ μμ )
- μ¬μ¬μ©μ± μ¦κ° (μ¬λ¬ 컨νΈλ‘€λ¬μμ λμΌν DAO νΈμΆ κ°λ₯)
리μμ€λ₯Ό ν¨μ¨μ μΌλ‘ κ΄λ¦¬νκΈ° μν΄ DAOμ Controllerμ μ±κΈν€ ν¨ν΄μ μ μ©νμ΅λλ€.
private static ControllerImpl service;
public static ControllerImpl getInstance() {
if (service == null) service = new ControllerImpl();
return service;
}κ³΅ν΅ λ°μ΄ν°λ² μ΄μ€ μμ
μ DBCommon μΈν°νμ΄μ€λ‘ μ μνμ¬ μΌκ΄μ±μ μ μ§νμ΅λλ€.
μ΄ νλ‘μ νΈλ₯Ό ν΅ν΄ λ€μμ νμ΅νμ΅λλ€:
- JDBC νλ‘κ·Έλλ°:
Connection,PreparedStatement,ResultSetνμ© - λ°μ΄ν°λ² μ΄μ€ μ€κ³: μ κ·ν, μ μ½μ‘°κ±΄, ν μ΄λΈ κ΄κ³ μ€μ
- λμμΈ ν¨ν΄: DAO, Singleton, Template Method ν¨ν΄ μ μ©
- μμΈ μ²λ¦¬:
try-catch-finallyλ₯Ό ν΅ν μμ ν 리μμ€ κ΄λ¦¬ - μ½λ ꡬ쑰ν: ν¨ν€μ§ λΆλ¦¬μ κ³μΈ΅ν μν€ν μ² μ€κ³
- Lombok νμ©: 보μΌλ¬νλ μ΄νΈ μ½λ μ΅μν
-
delete()λ©μλ ꡬν μλ£ -
totalSearch()μ λ ¬ κΈ°λ₯ μμ± - μ κ·μ§/μκ°μ μ§μ κ΄λ¦¬ κΈ°λ₯ ꡬν
- μ λ ₯ μ ν¨μ± κ²μ¦ κ°ν
- Connection Pool λμ (HikariCP)
- Prepared Statement μ¬μ¬μ© μ΅μ ν
- νΈλμμ μ²λ¦¬ μΆκ°
- λ‘κΉ μμ€ν λμ (Log4j2)
- GUI λ²μ κ°λ° (JavaFX)
- RESTful API μλ²λ‘ νμ₯ (Spring Boot)
- μ΄ μ μ₯μλ₯Ό Fork ν©λλ€
- μλ‘μ΄ λΈλμΉλ₯Ό μμ±ν©λλ€ (
git checkout -b feature/AmazingFeature) - λ³κ²½μ¬νμ 컀λ°ν©λλ€ (
git commit -m 'Add some AmazingFeature') - λΈλμΉμ νΈμν©λλ€ (
git push origin feature/AmazingFeature) - Pull Requestλ₯Ό μμ±ν©λλ€
μ΄ νλ‘μ νΈλ MIT λΌμ΄μ μ€λ₯Ό λ°λ¦ λλ€. μμΈν λ΄μ©μ LICENSE νμΌμ μ°Έκ³ νμΈμ.
StudentDAO.delete()λ©μλκ° μμ§ κ΅¬νλμ§ μμμ΅λλ€StudentDAO.totalSearch()μ λ ¬ λ‘μ§μ΄ μμ±λμ§ μμμ΅λλ€- μ μ μ λ ₯ μ λ²μ κ²μ¦μ΄ μ λ ₯ νμλ§ μ΄λ£¨μ΄μ§λλ€
β μ΄ νλ‘μ νΈκ° λμμ΄ λμ ¨λ€λ©΄ Starλ₯Ό λλ¬μ£ΌμΈμ! β