Coding History

2024. 07. 09 JDBC Study

BlackBirdIT 2024. 7. 9. 19:33

강사님이 주신 코드로 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에는 각주를 달지 않았는데 똑같은 매커니즘이다.

아무튼 집에 가야겠다!