난 어제 select로 list까지 볼 수 있게끔 만들어서 delete부터 구현하기 시작했다.
삭제까지는 했는데 없는 id를 입력해도 삭제를 성공했다는 메세지가 떠서 이걸 내가 번호를 넣었을 때 그 id에 칼럼이 있는지 없는지 존재 여부를 확인하는 코드가 필요했다. 근데 그걸 몰라서 헤메고 있다. 일단은 구현해놓은데 까지는 보자.
private static void doDelete() {
System.out.println("== 게시물 삭제 ==");
try {
Class.forName("org.mariadb.jdbc.Driver");
conn = DriverManager.getConnection(url, user, pass);
System.out.println("연결 성공!");
pstmt = conn.createStatement();
//4. SQL 처리하고 결과 ResultSet에 받아오기
//String sql = "SELECT id FROM article WHERE id = " + "id" + ";";
//ResultSet rs = pstmt.executeQuery(sql);
//if (rs.is) //검증 하려고 시도중인 코드
sql = "DELETE from article\n" +
"where id = " + id + ";";
pstmt.executeQuery(sql);
System.out.printf("%s번 게시물 삭제\n", id);
} catch (ClassNotFoundException e) {
System.out.println("드라이버 로딩 실패" + e);
} catch (SQLException e) {
System.out.println("에러 : " + e);
} finally {
try {
if (conn != null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (pstmt != null && !pstmt.isClosed()) {
pstmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
일단 전체 코드
package org.koreait;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class App {
static Scanner sc;
static Connection conn = null; // DB 접속하는 객체
static Statement pstmt = null; // SQL 전송하는 객체
static ResultSet rs = null; // 결과 받아오는 객체
static String url;
static String user;
static String pass;
static String id;
static List<Article> articles;
public App() {
sc = new Scanner(System.in);
conn = null;
pstmt = null;
rs = null;
url = "jdbc:mariadb://127.0.0.1:3306/AM_JDBC_2024_07?useUnicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=Asia/Seoul";
user = "root";
pass = "1234";
articles = new ArrayList<>();
}
public static void run() throws SQLException {
System.out.println("== 프로그램 시작 ==");
while (true) {
System.out.print("명령어 : ");
String cmd = sc.nextLine().trim();
if (cmd.equals("exit")) {
System.out.println("== 프로그램 종료 ==");
return;
} else if (cmd.isEmpty()) {
System.out.println("명령어 입력해");
}
String[] str = cmd.split(" ");
String first = str[0];
String second = str.length > 1 ? str[1] : "";
id = str.length > 2 ? str[2] : "";
switch (cmd) {
case "article write":
doWrite();
break;
case "article list":
showList();
break;
case "article delete":
doDelete();
break;
default:
if (cmd.startsWith("article delete")) {
doDelete();
} else if (cmd.startsWith("article modify")) {
showModify();
} else System.out.println("명령어오류");
break;
}
}
}
private static void showModify() {
System.out.println("== 게시물 수정 ==");
System.out.print("제목 : ");
String newTitle = sc.nextLine().trim();
System.out.print("내용 : ");
String newBody = sc.nextLine().trim();
try {
Class.forName("org.mariadb.jdbc.Driver");
String url = "jdbc:mariadb://127.0.0.1:3306/AM_JDBC_2024_07?useUnicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=Asia/Seoul";
conn = DriverManager.getConnection(url, "root", "1234");
System.out.println("연결 성공!");
String sql = "UPDATE article ";
sql += "SET updateDate = NOW()";
if (newTitle.length() > 0) {
sql += " , title = '" + newTitle + "'";
}
if (newBody.length() > 0) {
sql += " , `body` = '" + newBody + "'";
}
sql += " WHERE id = " + id + ";";
System.out.println(sql);
pstmt = conn.prepareStatement(sql);
pstmt.executeUpdate(sql);
} catch (ClassNotFoundException e) {
System.out.println("드라이버 로딩 실패" + e);
} catch (SQLException e) {
System.out.println("에러 : " + e);
} finally {
try {
if (pstmt != null && !pstmt.isClosed()) {
pstmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
System.out.println(id + "번 글이 수정되었습니다.");
}
private static void doDelete() {
System.out.println("== 게시물 삭제 ==");
try {
Class.forName("org.mariadb.jdbc.Driver");
conn = DriverManager.getConnection(url, user, pass);
System.out.println("연결 성공!");
pstmt = conn.createStatement();
//4. SQL 처리하고 결과 ResultSet에 받아오기
String sql = "SELECT id FROM article WHERE id = " + "id" + ";";
ResultSet rs = pstmt.executeQuery(sql);
if (!rs.next()) {
System.out.printf("%d번 게시물 없어.", id);
return;
} else sql = "DELETE from article\n" +
"where id = " + id + ";";
pstmt.executeQuery(sql);
System.out.printf("%s번 게시물 삭제\n", id);
} catch (ClassNotFoundException e) {
System.out.println("드라이버 로딩 실패" + e);
} catch (SQLException e) {
System.out.println("에러 : " + e);
} finally {
try {
if (conn != null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (pstmt != null && !pstmt.isClosed()) {
pstmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
private static void doWrite() {
System.out.println("== 게시물 작성 ==");
try {
// 1. 드라이버 세팅
Class.forName("org.mariadb.jdbc.Driver");
// 2. Connection 획득
conn = DriverManager.getConnection(url, user, pass);
//3. Statement 생성
pstmt = conn.createStatement();
System.out.print("제목 : ");
String title = sc.nextLine();
System.out.print("내용 : ");
String body = sc.nextLine();
//4. SQL 처리하고 결과 ResultSet에 받아오기
String sql = "INSERT INTO article SET regDate = now(),\n" +
" updateDate = now(), title = '" + title + "', body = '" + body + "'";
pstmt.executeUpdate(sql);
System.out.println("게시물 등록이 완료되었습니다.");
// 조회 결과 있는 거 -> executeQuery(sql);
// 조회 결과 없는 거 -> executeUpdate(sql);
} catch (Exception e) {
System.out.println("접속 시도중 문제 발생!!");
} finally {
try {
if (conn != null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (pstmt != null && !pstmt.isClosed()) {
pstmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
private static void showList() {
// board db의 article table에서 데이터를 꺼내와 출력
// 자동임포트 : alt + enter
try {
// 1. 드라이버 세팅
Class.forName("org.mariadb.jdbc.Driver");
// 2. Connection 획득
conn = DriverManager.getConnection(url, user, pass);
//3. Statement 생성
pstmt = conn.createStatement();
//4. SQL 처리하고 결과 ResultSet에 받아오기
String sql = "SELECT * FROM article ORDER BY id desc";
rs = pstmt.executeQuery(sql);
articles.clear();
while (rs.next()) {
while (rs.next()) {
int id = rs.getInt("id");
String title = rs.getString("title");
String body = rs.getString("body");
String regDate = rs.getString("regDate");
Article article = new Article(id, title, body, regDate, body);
articles.add(article);
}
}
if (articles.isEmpty()) {
System.out.println("게시물 없어.");
} else {
for (Article article : articles) {
System.out.println(article.getId() + article.getTitle());
}
}
} catch (Exception e) {
System.out.println("접속 오류");
} finally {
try {
if (pstmt != null && !pstmt.isClosed()) {
pstmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (rs != null && !rs.isClosed()) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
다 되긴 하는데 허점이 많다. 일단은 강사님 코드를 끌어다 쓰고 나중에 고쳐봐야겠다.
package org.koreait;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
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_NOTMINE?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();
PreparedStatement pstmt = null;
try {
String sql = "INSERT INTO article ";
sql += "SET regDate = NOW(),";
sql += "updateDate = NOW(),";
sql += "title = '" + title + "',";
sql += "`body`= '" + body + "';";
System.out.println(sql);
pstmt = conn.prepareStatement(sql);
int affectedRow = pstmt.executeUpdate();
System.out.println(affectedRow + "열에 적용됨");
} catch (SQLException e) {
System.out.println("에러 2: " + e);
} finally {
try {
if (pstmt != null && !pstmt.isClosed()) {
pstmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
} else if (cmd.equals("article list")) {
System.out.println("==목록==");
PreparedStatement pstmt = null;
ResultSet rs = null;
List<Article> articles = new ArrayList<>();
try {
String sql = "SELECT *";
sql += " FROM article";
sql += " ORDER BY id DESC;";
System.out.println(sql);
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery(sql);
while (rs.next()) {
int id = rs.getInt("id");
String regDate = rs.getString("regDate");
String updateDate = rs.getString("updateDate");
String title = rs.getString("title");
String body = rs.getString("body");
Article article = new Article(id, regDate, updateDate, title, body);
articles.add(article);
}
} catch (SQLException e) {
System.out.println("에러 3 : " + e);
} finally {
try {
if (rs != null && !rs.isClosed()) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (pstmt != null && !pstmt.isClosed()) {
pstmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
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 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();
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;
}
}
일단 강사님이 분석해보라고 코드를 git에 올려주셨다. 보니까 일단은 private int doAction(Connection conn, Scanner sc, String cmd) 이 부분이 핵심인 것 같은데 원래 매번 커넥션을 해서 DB에 접근을 했었는데 그걸 맨 위에 올리고 메서드 자체에 커넥션을 인자로 주는 코드로 작성했다.
나머지 추가 된 것중에 시큐어 sql 클래스. 그 안에 처음보는 문법이 보였다.
public SecSql append(Object... args) {
if (args.length > 0) {
String sqlBit = (String) args[0];
sqlBuilder.append(sqlBit + " ");
}
Object ... 을 매개변수로 받는데, 이게 가변인자라고 부른다고 한다. '...'이 개수제한 없이 뭔가 온다는 것이고, 앞은 타입이 위치한다. Int라면 정수들이 온다는 것이다.
여하튼 위의 코드를 훨씬 효율적으로 쓰기 위해서 SecSql 클래스와 DBUtil을 사용한다고 한다.
서론은 뒤로 하고 수정한 코드를 한번 살펴보자.
import org.koreait.Util.DBUtil;
import org.koreait.Util.SecSql;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
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_NOTMINE?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 + "번 글이 생성되었습니다");
// PreparedStatement pstmt = null;
//
// try {
// String sql = "INSERT INTO article ";
// sql += "SET regDate = NOW(),";
// sql += "updateDate = NOW(),";
// sql += "title = '" + title + "',";
// sql += "`body`= '" + body + "';";
//
// System.out.println(sql);
//
// pstmt = conn.prepareStatement(sql);
//
// int affectedRow = pstmt.executeUpdate();
//
// System.out.println(affectedRow + "열에 적용됨");
//
// } catch (SQLException e) {
// System.out.println("에러 2: " + e);
// } finally {
// try {
// if (pstmt != null && !pstmt.isClosed()) {
// pstmt.close();
// }
// } catch (SQLException e) {
// e.printStackTrace();
// }
// }
} else if (cmd.equals("article list")) {
System.out.println("==목록==");
// PreparedStatement pstmt = null;
// ResultSet rs = null;
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));
}
// try {
// String sql = "SELECT *";
// sql += " FROM article";
// sql += " ORDER BY id DESC;";
//
// System.out.println(sql);
//
// pstmt = conn.prepareStatement(sql);
//
// rs = pstmt.executeQuery(sql);
//
// while (rs.next()) {
// int id = rs.getInt("id");
// String regDate = rs.getString("regDate");
// String updateDate = rs.getString("updateDate");
// String title = rs.getString("title");
// String body = rs.getString("body");
//
// Article article = new Article(id, regDate, updateDate, title, body);
//
// articles.add(article);
// }
//
// } catch (SQLException e) {
// System.out.println("에러 3 : " + e);
// } finally {
// try {
// if (rs != null && !rs.isClosed()) {
// rs.close();
// }
// } catch (SQLException e) {
// e.printStackTrace();
// }
// try {
// if (pstmt != null && !pstmt.isClosed()) {
// pstmt.close();
// }
// } catch (SQLException e) {
// e.printStackTrace();
// }
//
// }
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 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();
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;
}
}
코드는 잘 돌아간다. 각주 처리된 부분이 원래 쿼리문을 처리하기 위한 코드고 그 위가 새로 쓰여진 코드다. 코드가 획기적으로 줄어든 것을 볼 수 있다.
수업은 이렇게 마무리 되었고, 내일은 아주아주아주 중요한 것을 한다고 한다. 뭔가 기대도 되고 걱정도 된다. 이제 저 코드들을 내 프로젝트에 적용시켜보고 집에 가야겠다.
'Coding History' 카테고리의 다른 글
국비 지원 IT(웹앱개발) 취업반 강의 25일차 (JDBC, DB) (0) | 2024.07.10 |
---|---|
2024. 07. 09 JDBC Study (0) | 2024.07.09 |
2024. 07. 09 시험문제 (Motivation App) (0) | 2024.07.09 |
국비 지원 IT(웹앱개발) 취업반 강의 23일차 (JDBC) (1) | 2024.07.08 |
DB와 DBMS와 RDBMS를 알아보자 (0) | 2024.07.07 |