강사님이 주신 코드로 modify와 delete 까지 일단은 구현해봤다. 조건문만 걸면 되는데 이제 여기서 생각을 좀 해야된다. 근데 뭔가 떠오르지가 않는다. 일단 고친 코드를 보면
private int doAction(Connection conn, Scanner sc, String cmd) {
if (cmd.equals("exit")) {
return -1;
}
if (cmd.equals("article write")) {
System.out.println("==글쓰기==");
System.out.print("제목 : ");
String title = sc.nextLine();
System.out.print("내용 : ");
String body = sc.nextLine();
SecSql sql = new SecSql();
sql.append("INSERT INTO article");
sql.append("SET regDate = NOW(),");
sql.append("updateDate = NOW(),");
sql.append("title = ?,", title);
sql.append("`body`= ?;", body);
int id = DBUtil.insert(conn, sql);
System.out.println(id + "번 글이 생성되었습니다");
} else if (cmd.equals("article list")) {
System.out.println("==목록==");
List<Article> articles = new ArrayList<>();
SecSql sql = new SecSql();
sql.append("SELECT *");
sql.append("FROM article");
sql.append("ORDER BY id DESC");
List<Map<String, Object>> articleListMap = DBUtil.selectRows(conn, sql);
for (Map<String, Object> articleMap : articleListMap) {
articles.add(new Article(articleMap));
}
if (articles.size() == 0) {
System.out.println("게시글이 없습니다");
return 0;
}
System.out.println(" 번호 / 제목 ");
for (Article article : articles) {
System.out.printf(" %d / %s \n", article.getId(), article.getTitle());
}
} else if (cmd.startsWith("article delete")){
int id = 0;
try {
id = Integer.parseInt(cmd.split(" ")[2]);
} catch (Exception e) {
System.out.println("번호는 정수로 입력해");
return 0;
}
SecSql sql = new SecSql();
sql.append("DELETE FROM article WHERE id = ?;" , id);
DBUtil.delete(conn, sql);
System.out.println(id + "번 글이 삭제되었습니다.");
} else if (cmd.startsWith("article modify")) {
int id = 0;
try {
id = Integer.parseInt(cmd.split(" ")[2]);
} catch (Exception e) {
System.out.println("번호는 정수로 입력해");
return 0;
}
System.out.println("==수정==");
System.out.print("새 제목 : ");
String title = sc.nextLine().trim();
System.out.print("새 내용 : ");
String body = sc.nextLine().trim();
SecSql sql = new SecSql();
sql.append("INSERT INTO article");
sql.append("SET regDate = NOW(),");
sql.append("updateDate = NOW(),");
sql.append("title = ?,", title);
sql.append("`body`= ?;", body);
DBUtil.update(conn, sql);
// PreparedStatement pstmt = null;
// try {
// String sql = "UPDATE article";
// sql += " SET updateDate = NOW()";
// if (title.length() > 0) {
// sql += " ,title = '" + title + "'";
// }
// if (body.length() > 0) {
// sql += " ,`body` = '" + body + "'";
// }
// sql += " WHERE id = " + id + ";";
//
// System.out.println(sql);
//
// pstmt = conn.prepareStatement(sql);
//
// pstmt.executeUpdate();
//
// } catch (SQLException e) {
// System.out.println("에러 4 : " + e);
// } finally {
// try {
// if (pstmt != null && !pstmt.isClosed()) {
// pstmt.close();
// }
// } catch (SQLException e) {
// e.printStackTrace();
// }
//
// }
System.out.println(id + "번 글이 수정되었습니다.");
}
return 0;
}
}
이런 느낌이다.
DBUtil의 기능을 다 알지 못해서 메서드 이름으로 알맞은 것을 찾아가면서 조건을 맞췄다.
나 같은 경우에는 DBUtil 내에 존재하는 selectRowIntValue 메서드를 사용해서 값이 없는 경우에는 어떻게 출력되는지 확인하고 (0으로 출력 됨.) 이걸 사용해서 조건문을 만들어서 해당 문제를 해결했다.
말은 쉽게 하는데 생각보다 좀 오래 걸렸다. 이거 때문에 cmd + 클릭으로 메서드를 살펴보면서 이런 저런 시도를 하면서 뭔가 재밌었던 것 같다. 암튼 해결한 코드를 살펴보면,
package org.koreait;
import org.koreait.Util.DBUtil;
import org.koreait.Util.SecSql;
import java.sql.*;
import java.util.*;
public class App {
public void run() {
System.out.println("==프로그램 시작==");
Scanner sc = new Scanner(System.in);
while (true) {
System.out.print("명령어 > ");
String cmd = sc.nextLine().trim();
Connection conn = null;
try {
Class.forName("org.mariadb.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String url = "jdbc:mariadb://127.0.0.1:3306/AM_JDBC_2024_07?useUnicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=Asia/Seoul";
try {
conn = DriverManager.getConnection(url, "root", "1234");
int actionResult = doAction(conn, sc, cmd);
if (actionResult == -1) {
System.out.println("==프로그램 종료==");
sc.close();
break;
}
} catch (SQLException e) {
System.out.println("에러 1 : " + e);
} finally {
try {
if (conn != null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
private int doAction(Connection conn, Scanner sc, String cmd) {
if (cmd.equals("exit")) {
return -1;
}
if (cmd.equals("article write")) {
System.out.println("==글쓰기==");
System.out.print("제목 : ");
String title = sc.nextLine();
System.out.print("내용 : ");
String body = sc.nextLine();
SecSql sql = new SecSql();
sql.append("INSERT INTO article");
sql.append("SET regDate = NOW(),");
sql.append("updateDate = NOW(),");
sql.append("title = ?,", title);
sql.append("`body`= ?;", body);
int id = DBUtil.insert(conn, sql);
System.out.println(id + "번 글이 생성되었습니다");
} else if (cmd.equals("article list")) {
System.out.println("==목록==");
List<Article> articles = new ArrayList<>();
SecSql sql = new SecSql();
sql.append("SELECT *");
sql.append("FROM article");
sql.append("ORDER BY id DESC");
List<Map<String, Object>> articleListMap = DBUtil.selectRows(conn, sql);
for (Map<String, Object> articleMap : articleListMap) {
articles.add(new Article(articleMap));
}
if (articles.size() == 0) {
System.out.println("게시글이 없습니다");
return 0;
}
System.out.println(" 번호 / 제목 ");
for (Article article : articles) {
System.out.printf(" %d / %s \n", article.getId(), article.getTitle());
}
} else if (cmd.startsWith("article delete")) {
int id = 0;
try {
id = Integer.parseInt(cmd.split(" ")[2]);
} catch (Exception e) {
System.out.println("번호는 정수로 입력해");
return 0;
}
SecSql sql = new SecSql();
sql.append("SELECT COUNT(*) FROM article WHERE id = ?;", id);
int deleteId = DBUtil.selectRowIntValue(conn, sql);
if (deleteId == 0) {
System.out.println(id + "번 게시물 없어.");
} else {
SecSql sql2 = new SecSql();
sql2.append("DELETE FROM article WHERE id = ?;", id);
DBUtil.delete(conn, sql2);
System.out.println(id + "번 글이 삭제되었습니다.");
}
} else if (cmd.startsWith("article modify")) {
int id = 0;
try {
id = Integer.parseInt(cmd.split(" ")[2]);
} catch (Exception e) {
System.out.println("번호는 정수로 입력해");
return 0;
}
SecSql sql = new SecSql();
//데이터 유무 여부를 알기 위해서 일단 조회.
sql.append("SELECT COUNT(*) FROM article WHERE id = ?;", id);
//int 값으로 해당 데이터 받기
int articleId = DBUtil.selectRowIntValue(conn, sql);
if (articleId == 0) { //0이면 데이터 존재 하지 않음.
System.out.println(id + "번 게시물 없어.");
} else { //그게 아니라면 있으니까 해당 기능 실행.
System.out.println("==수정==");
System.out.print("새 제목 : ");
String title = sc.nextLine().trim();
System.out.print("새 내용 : ");
String body = sc.nextLine().trim();
SecSql sql2 = new SecSql();
sql2.append("UPDATE article");
sql2.append("SET updateDate = NOW(),");
sql2.append("title = ?,", title);
sql2.append("`body`= ?", body);
sql2.append("WHERE id = ?;", id);
DBUtil.update(conn, sql2);
System.out.println(id + "번 글이 수정되었습니다.");
}
}
return 0;
}
}
각주를 참고 하면 된다. delete에는 각주를 달지 않았는데 똑같은 매커니즘이다.
아무튼 집에 가야겠다!
'Coding History' 카테고리의 다른 글
2024. 07. 10 SQL 문제 풀이 (0) | 2024.07.10 |
---|---|
국비 지원 IT(웹앱개발) 취업반 강의 25일차 (JDBC, DB) (0) | 2024.07.10 |
국비 지원 IT(웹앱개발) 취업반 강의 24일차 (JDBC) (0) | 2024.07.09 |
2024. 07. 09 시험문제 (Motivation App) (0) | 2024.07.09 |
국비 지원 IT(웹앱개발) 취업반 강의 23일차 (JDBC) (1) | 2024.07.08 |