패키지 명은 board 이다.
오라클에서 제작한 테이블로
BoardVO 파일을 제작한다.
package board;
public class BoardVO {
private int id;
private String writer;
private String passwd;
private String subject;
private String email;
public BoardVO(int id, String writer, String passwd, String subject, String email) {
super();
this.id = id;
this.writer = writer;
this.passwd = passwd;
this.subject = subject;
this.email = email;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "[글번호=" + id + ", 작성자=" + writer + ", 비밀번호=" + passwd + ", 제목=" + subject + ", 이메일="
+ email + "]";
}
}
JdbcUtil을 제작하여 이클립스에서 오라클 데이터 베이스에
접속하도록 코딩을 해보자.
package board;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JdbcUtil {
static {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
}catch(ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
Connection con = null;
try {
con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "java", "1234");
con.setAutoCommit(false);
}catch(Exception e) {
e.printStackTrace();
}
return con;
}
public static void close(Connection con) {
try {
con.close();
}catch(Exception e) {
e.printStackTrace();
}
}
public static void close(ResultSet rs) {
try {
rs.close();
}catch(Exception e) {
e.printStackTrace();
}
}
public static void close(Statement stmt) {
try {
stmt.close();
}catch(Exception e) {
e.printStackTrace();
}
}
public static void commit(Connection con) {
try {
con.close();
}catch(Exception e) {
e.printStackTrace();
}
}
public static void rollback(Connection con) {
try {
con.close();
}catch(Exception e) {
e.printStackTrace();
}
}
}
게시판 모양이 콘솔 창에 나올수 있도록
프린트 문을 제작한다.
클래스 이름은 BoardMain 으로 하여 기본적인 구조를 갖춘다.
package board;
import java.util.Scanner;
public class BoardMain {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
BoardSVC boardSVC = new BoardSVC();
while(true) {
System.out.println("===게시판===");
System.out.println("a. 글 등록");
System.out.println("b. 글 목록보기");
System.out.println("c. 글 내용보기");
System.out.println("d. 글 삭제하기");
System.out.println("e. 글 수정하기");
System.out.println("f. 종료하기");
System.out.print("메뉴를 선택하세요 : ");
String menu = sc.next();
switch(menu) {
case "a" :
boardSVC.writeArticle(sc);
break;
case "b" : //전체 리스트 보기
boardSVC.showArticleList();
break;
case "c" :
boardSVC.showArticle(sc);
break;
case "d" :
boardSVC.deleteArticle(sc);
break;
case "e" :
boardSVC.updateArticle(sc);
break;
case "f" :
System.out.println("프로그램이 종료 됩니다.");
return ;
default :
System.out.println("다시 입력해 주세요.");
}
}
}
}
각 메뉴를 눌렀을때 구현 되는 기능이다.
BoardSVC를 제작하여 메인에서 각 기능들을 호출 되도록 만들어보자.
package board;
import static board.JdbcUtil.close;
import static board.JdbcUtil.getConnection;
import java.sql.*;
import java.util.Scanner;
import static board.JdbcUtil.*;
public class BoardSVC {
Connection con;
public BoardVO getBoardVO(Scanner sc) {
System.out.println("===게시물 등록===");
System.out.print("작성자 : ");
String writer = sc.next();
System.out.print("비밀번호 : ");
String passwd = sc.next();
System.out.print("제목 : ");
String subject = sc.next();
System.out.print("이메일 : ");
String email = sc.next();
BoardVO boardVO = new BoardVO(0, writer, passwd, subject, email);
return boardVO;
}
public void writeArticle(Scanner sc) {
BoardVO boardVO = getBoardVO(sc);
con = getConnection();
PreparedStatement pstmt = null;
String sql = "INSERT INTO board VALUES(board_seq.nextval, ?, ?, ?, ?)";
try {
pstmt = con.prepareStatement(sql);
pstmt.setString(1, boardVO.getWriter());
pstmt.setString(2, boardVO.getPasswd());
pstmt.setString(3, boardVO.getSubject());
pstmt.setString(4, boardVO.getEmail());
int count = pstmt.executeUpdate();
System.out.println("글 입력이 완료 되었습니다.");
if(count >0) {
commit(con);
}else {
rollback(con);
}
}catch(Exception e) {
e.printStackTrace();
}finally {
close(pstmt);
close(con);
}
}
public void showArticleList() {
con = getConnection();
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "SELECT * FROM board";
try {
pstmt = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
rs = pstmt.executeQuery();
if(rs.next() == false) {
System.out.println("데이터가 없습니다.");
}else {
rs.beforeFirst();
}
while(rs.next()) {
System.out.println("게시글번호 = "+rs.getInt("id")
+ ", 작성자 = " + rs.getString("writer")
+ ", 제목 = " + rs.getString("subject")
+ ", 이메일 = " + rs.getString("email")
);
}
if(rs.next() == false) {
System.out.println("조회가 완료 되었습니다.");
}
}catch(Exception e) {
e.printStackTrace();
}finally {
close(rs);
close(pstmt);
close(con);
}
}
public void showArticle(Scanner sc) {
System.out.print("검색할 글 아이디를 입력하세요 (작성자 : -1), (제목 : -2) 선택>> ");
int id = sc.nextInt();
Scanner sc2 = new Scanner(System.in);
if(id == -1) {
System.out.print("작성자를 입력하세요 >> ");
String writer = sc2.nextLine();
BoardVO boardVO = getArticleWriter(writer);
System.out.println(boardVO);
System.out.println("글 조회가 완료 되었습니다.");
return;
}else if(id == -2) {
System.out.print("제목을 입력하세요 >> ");
String subject = sc2.nextLine();
BoardVO boardVO = getArticleSubject(subject);
System.out.println(boardVO);
System.out.println("글 조회가 완료 되었습니다.");
return;
}
BoardVO boardVO = getArticle(id);
if(boardVO == null) {
System.out.println("게시글이 존재하지 않습니다.");
}else {
System.out.println(boardVO);
System.out.println("글 조회가 완료 되었습니다.");
}
}
private BoardVO getArticle(int id) {
BoardVO boardVO = null;
con = getConnection();
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "SELECT * FROM board WHERE id = ?";
try {
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, id);
rs = pstmt.executeQuery();
if(rs.next()) {
int dbId = rs.getInt("id");
String writer = rs.getString("writer");
String passwd = rs.getString("passwd");
String email = rs.getString("email");
String subject = rs.getNString("subject");
boardVO = new BoardVO(dbId, writer, passwd, subject, email);
}
}catch(Exception e) {
e.printStackTrace();
}finally {
close(rs);
close(pstmt);
close(con);
}
return boardVO;
}
private BoardVO getArticleWriter(String writer1) {
BoardVO boardVO = null;
con = getConnection();
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "SELECT * FROM board WHERE writer = ?";
try {
pstmt = con.prepareStatement(sql);
pstmt.setString(1, writer1);
rs = pstmt.executeQuery();
if(rs.next()) {
int dbId = rs.getInt("id");
String writer = rs.getString("writer");
String passwd = rs.getString("passwd");
String email = rs.getString("email");
String subject = rs.getNString("subject");
boardVO = new BoardVO(dbId, writer, passwd, subject, email);
}
}catch(Exception e) {
e.printStackTrace();
}finally {
close(rs);
close(pstmt);
close(con);
}
return boardVO;
}
private BoardVO getArticleSubject(String subject1) {
BoardVO boardVO = null;
con = getConnection();
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "SELECT * FROM board WHERE subject = ?";
try {
pstmt = con.prepareStatement(sql);
pstmt.setString(1, subject1);
rs = pstmt.executeQuery();
if(rs.next()) {
int dbId = rs.getInt("id");
String writer = rs.getString("writer");
String passwd = rs.getString("passwd");
String email = rs.getString("email");
String subject = rs.getNString("subject");
boardVO = new BoardVO(dbId, writer, passwd, subject, email);
}
}catch(Exception e) {
e.printStackTrace();
}finally {
close(rs);
close(pstmt);
close(con);
}
return boardVO;
}
public void deleteArticle(Scanner sc) {
showArticleList();
System.out.print("삭제할 글 아이디를 입력하세요 (전체 삭제시 -1 입력): ");
int id = sc.nextInt();
if(id == -1) {
Scanner sc2 = new Scanner(System.in);
System.out.print("작성자 선택 : ");
String writer = sc2.nextLine();
int count = deleteArticle2(writer);
if(count > 0) {
commit(con);
System.out.println("성공적으로 삭제가 완료되었습니다.");
}else {
rollback(con);
System.out.println("존재하지 않는 게시글이거나 회원입니다.");
}
return;
}
int count = deleteArticle(id);
if(count > 0) {
commit(con);
System.out.println("성공적으로 삭제가 완료되었습니다.");
}else {
rollback(con);
System.out.println("존재하지 않는 게시글이거나 회원입니다.");
}
}
private int deleteArticle(int id) {
con = getConnection();
PreparedStatement pstmt = null;
String sql = "DELETE board WHERE id = ?";
int deleteCount = 0;
try {
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, id);
deleteCount = pstmt.executeUpdate();
}catch(Exception e) {
e.printStackTrace();
}finally {
close(pstmt);
close(con);
}
return deleteCount;
}
private int deleteArticle2(String writer) {
con = getConnection();
PreparedStatement pstmt = null;
String sql = "DELETE board WHERE writer = ?";
int deleteCount = 0;
try {
pstmt = con.prepareStatement(sql);
pstmt.setString(1, writer);
deleteCount = pstmt.executeUpdate();
}catch(Exception e) {
e.printStackTrace();
}finally {
close(pstmt);
close(con);
}
return deleteCount;
}
public void updateArticle(Scanner sc) {
//리스트 보여주기
showArticleList2();
System.out.println("수정할 글의 아이디를 입력하세요. ");
System.out.print("글 아이디 : ");
int id = sc.nextInt();
BoardVO boardVO = getArticle(id);
System.out.println("수정할 데이터를 입력하세요. ");
if(boardVO == null) {
System.out.println("회원이 존재하지 않음, 바르게 재입력");
return;
}
boolean run = true;
while(run) {
System.out.println("작성자 1번, 비밀번호 2번, 제목 3번, 이메일 4번, 종료 5번");
int user1 = sc.nextInt();
Scanner sc1 = new Scanner(System.in);
if(user1 == 1) {
System.out.println("원래 작성자 : " + boardVO.getWriter());
System.out.print("수정할 작성자 : ");
String writer = sc1.nextLine();
if(writer.equals("\\s+")) {
break;
}
boardVO.setWriter(writer);
boardVO.setPasswd(boardVO.getPasswd());
boardVO.setSubject(boardVO.getSubject());
boardVO.setEmail(boardVO.getEmail());
}else if (user1 == 2) {
System.out.println("원래 비밀번호 : " + boardVO.getPasswd());
System.out.print("수정할 비밀번호 : ");
String passwd = sc1.nextLine();
if(passwd.equals("\\s+")) {
continue;
}
boardVO.setWriter(boardVO.getWriter());
boardVO.setPasswd(passwd);
boardVO.setSubject(boardVO.getSubject());
boardVO.setEmail(boardVO.getEmail());
}else if (user1 == 3) {
System.out.println("원래 제목 : " + boardVO.getSubject());
System.out.print("수정할 제목 : ");
String subject = sc1.nextLine();
if(subject.equals("\\s+")) {
continue;
}
boardVO.setWriter(boardVO.getWriter());
boardVO.setPasswd(boardVO.getPasswd());
boardVO.setSubject(subject);
boardVO.setEmail(boardVO.getEmail());
}else if (user1 == 4) {
System.out.println("원래 이메일 : " + boardVO.getEmail());
System.out.print("수정할 이메일 : ");
String email = sc1.nextLine();
if(email.equals("\\s+")) {
continue;
}
boardVO.setWriter(boardVO.getWriter());
boardVO.setPasswd(boardVO.getPasswd());
boardVO.setSubject(boardVO.getSubject());
boardVO.setEmail(email);
}else if (user1 == 5) {
run = false;
}
}
int count = updateArticle(boardVO);
if(count > 0) {
commit(con);
System.out.println("성공적으로 수정이 완료되었습니다.");
}else {
rollback(con);
}
}
private int updateArticle(BoardVO boardVO) {
int updateCount = 0;
con = getConnection();
PreparedStatement pstmt = null;
String sql = "UPDATE board SET writer = ?, passwd = ?, subject = ?, email = ? " +
" WHERE id = ?";
try {
pstmt = con.prepareStatement(sql);
pstmt.setString(1, boardVO.getWriter());
pstmt.setString(2, boardVO.getPasswd());
pstmt.setString(3, boardVO.getSubject());
pstmt.setString(4, boardVO.getEmail());
pstmt.setInt(5, boardVO.getId());
updateCount = pstmt.executeUpdate();
}catch(Exception e) {
e.printStackTrace();
}finally {
close(pstmt);
close(con);
}
return updateCount;
}
public void showArticleList2() {
con = getConnection();
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = "SELECT * FROM board";
try {
pstmt = con.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
rs = pstmt.executeQuery();
if(rs.next() == false) {
System.out.println("데이터가 없습니다.");
}else {
rs.beforeFirst();
}
while(rs.next()) {
System.out.println("게시글번호 : "+rs.getInt("id"));
}
if(rs.next() == false) {
System.out.println("조회가 완료 되었습니다.");
}
}catch(Exception e) {
e.printStackTrace();
}finally {
close(rs);
close(pstmt);
close(con);
}
}
public void showArticle2(Scanner sc) {
System.out.print("검색할 글 아이디를 입력하세요 >> ");
int id = sc.nextInt();
BoardVO boardVO = getArticle(id);
if(boardVO == null) {
System.out.println("게시글이 존재하지 않습니다.");
}else {
System.out.println(boardVO);
System.out.println("글 조회가 완료 되었습니다.");
}
}
}
분할 해야는데 구문이 많이 길게 나온다.
구현에 집중해서 제작 하였다.
같은 기능을 가진 메서드가 많았지만,
그것을 중복을 가지지 않게 해서 조금만 변형 시키면
메서드도 이렇게 많게는 나오지 않았을 것 같기도 하다.
특히 수정 부분이 필자가 생각하기에는
굉장히 비효율 적인 코드를 가지고 있는데,
원래 구현 하고픈 기능은
사용자가 수정하고 싶은 부분을 번호를 골라서
기능 그 부분 메서드를 호출하여 사용자 입력후에
바로 저장 시키는 것이였다.
그 기능 보다,
각각 수정하고 싶은 부분을 하나씩 선택하여
사용자 입력을 받고 수정 후에 저장 시켜서
반복문을 돌려서 사용자가 종료를 선택하기 전 까지
수정 메뉴를 콘솔창에 띄우도록 하였다.
이미 메뉴를 선택 할때 값을 저장하도록 하였고
종료를 선택 할때는 while문을 종료를 시켜 반복문을 탈출하도록 하였다.
원래 같으면 for문에 라벨을 사용 해도 좋았다. 그런데...
손에 익은 방법을 택해서 내 취향이 좀 반영 되었다.
만일 공백을 입력하게 되면 그전 값을 유지 시켜야하는데
그것을 구현하기위해서 저번 멤버클래스 에서는
다른 클래스에 그 메서드를 제작하여 호출하여 제작하였다.
하지만 이번에는 그 입력된 문자열을 비교해서 그 문자열에
빈공간이 있는지 알아보는 " \\s " 를 활용하여 제작 하였다.
빈공간이 여러개 라면 " \\s+ " 활용 할 수도 있다.
메뉴 선택후에 빈공간을 입력할시
그 저장된값이 if문으로 빠져서 continue를 시켜 그 처음 반복문으로
돌아가게 하여 아무것도 수정되지 않도록 하였다.
저번에는 그 값을 받아서 리턴 시키는 메서드를 제작하여
그 객체를 생성하고 복잡하게 제작 하였지만,
이번은 간단하게 if문으로 띄어쓰기시 수정이 되지 않도록 구현 하였다.
아직 미숙한 부분이 많아서 공부를 많이 해야겠다고 생각하였다.
다음 번에는 더 간단하게 코드를 짜보고 싶다.
'프로그래밍 > JAVA' 카테고리의 다른 글
백준 문제 풀기 (1) | 2023.06.23 |
---|---|
이클립스 톰캣 서버 연결 방법 (0) | 2023.02.14 |
자바 스트림 정리하기 (0) | 2023.01.16 |
오버 라이딩 그리고 오버로딩 (0) | 2023.01.08 |
게터와 세터 (0) | 2023.01.08 |