본문 바로가기

BackEnd/Java

[java] 이것이 자바다 ch20 데이터베이스 입출력 4(게시판 만들기)

728x90
반응형

1. board 클래스 생성

import java.util.Date;
import lombok.Data;

@Data
public class Board {
	private int bno;
	private String btitle;
	private String bcontent;
	private String bwriter;
	private Date bdate;
}


오라클에 있는 변수들을 선언합니다.

여기서 lombok 어노테이션을 이용해서 getter, setter, toString() 메소드를 자동 생성시킵니다.

별도의 getter, setter를 생성할 필요 없습니다.

 

 

2. 클래스 및 메인 메서드 생성

public class BoardExample1 {
	public void list() {
		System.out.println();
		System.out.println("[게시물 목록]");
		System.out.println("------------------------------------------------------------");
		System.out.printf("%-6s%-12s%-16s%-40s\n", "no", "writer", "date", "title");
		System.out.println("------------------------------------------------------------");
		System.out.printf("%-6s%-12s%-16s%-40s\n",
				"1", "winter", "2202.01.27", "게시판에 오신 것을 환영합니다.");
		System.out.printf("%-6s%-12s%-16s%-40s\n",
				"2", "winter", "2202.01.27", "올 겨울은 많이 춥습니다.");
		mainMenu();
	}
	
	public void mainMenu() {
		System.out.println();
		System.out.println("------------------------------------------------------------");
		System.out.println("메인 메뉴 : 1.Create | 2.Read | 3.Clear | 4.Exit");
		System.out.print("메뉴 선택: ");
		System.out.println();

	}
	
	public static void main(String[] args) {
		BoardExample1 boardExample = new BoardExample1();
		boardExample.list();
	}
}


BoardExample1 클래스 생성 및 main 메서드를 생성합니다.

main 메서드에는 boardExample 인스턴스를 생성하고 list를 불러옵니다.
그리고 list 메서드에는 mainMenu 메서드를 불러옵니다.

 

 

3. mainMenu 메서드

public void mainMenu() {
	System.out.println();
	System.out.println("------------------------------------------------------------");
	System.out.println("메인 메뉴 : 1.Create | 2.Read | 3.Clear | 4.Exit");
	System.out.print("메뉴 선택: ");
	String menuNo = scanner.nextLine();
	System.out.println();
		
	switch(menuNo) {
		case "1" -> create();
		case "2" -> read();
		case "3" -> clear();
		case "4" -> exit();
	}
}


mainMenu 메서드에는 번호를 입력하면 함수를 생성하게 만듭니다.

람다식('->') 는 java13부터 사용가능합니다.

 

 

4. list 메서드

public void list() {
	System.out.println();
	System.out.println("[게시물 목록]");
	System.out.println("------------------------------------------------------------");
	System.out.printf("%-6s%-12s%-16s%-40s\n", "no", "writer", "date", "title");
	System.out.println("------------------------------------------------------------");
	
	// boards 테이블에서 게시물 정보를 가져와서 출력하기
	try {
		String sql = "" +
			"SELECT bno, btitle, bcontent, bwriter, bdate " + 
			"FROM boards " + 
			"ORDER BY bno DESC";
		PreparedStatement pstmt = conn.prepareStatement(sql);
		ResultSet rs = pstmt.executeQuery();
		while(rs.next()) {
			Board board = new Board();
			board.setBno(rs.getInt("bno"));
			board.setBtitle(rs.getString("btitle"));
			board.setBcontent(rs.getString("bcontent"));
			board.setBwriter(rs.getString("bwriter"));
			board.setBdate(rs.getDate("bdate"));

			System.out.printf("%-6s%-12s%-16s%-40s\n",
					board.getBno(),
					board.getBwriter(),
					board.getBdate(),
					board.getBtitle());
		}
		rs.close();
		pstmt.close();
	} catch(SQLException e) {
		e.printStackTrace();
		exit();
	}
	
	mainMenu();
}


현재 어떤 게시물들이 있는지 목록으로 확인할 수 있습니다.

 

 

5. BoardExample1 생성자

private Scanner scanner = new Scanner(System.in);
private Connection conn;

public BoardExample4() {
	try {
		Class.forName("oracle.jdbc.OracleDriver");
		
		conn = DriverManager.getConnection(
                "jdbc:oracle:thin:@연결 주소:포트/SID",
                "오라클 ID",
                "오라클 PW"
				);					
	} catch(Exception e) {
		e.printStackTrace();
		exit();
	}
}


생성자를 실행하면 오라클과 연동할 수 있도록 만듭니다.

 

 

6. create 메서드

public void create() {
	// 입력 받기
	Board board = new Board();
	System.out.println("[새 게시물 입력]");
	System.out.print("제목 : ");
	board.setBtitle(scanner.nextLine());
	System.out.print("내용 : ");
	board.setBcontent(scanner.nextLine());
	System.out.print("작성자 : ");
	board.setBwriter(scanner.nextLine());
	
	// 보조 메뉴 출력
	System.out.println("------------------------------------------------------------");
	System.out.println("보조 메뉴 : 1.Ok | 2.Cancle");
	System.out.print("메뉴 선택 : ");
	String menuNo = scanner.nextLine();
	if(menuNo.equals("1")) {
		// boards 테이블에 게시물 정보 저장
		try {
			String sql = "" +
				"INSERT INTO boards (bno, btitle, bcontent, bwriter, bdate) " +
				"VALUES (SEQ_BNO.NEXTVAL, ?, ?, ?, SYSDATE)";
			PreparedStatement pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, board.getBtitle());
			pstmt.setString(2, board.getBcontent());
			pstmt.setString(3, board.getBwriter());
			pstmt.executeUpdate();
			pstmt.close();
		} catch(Exception e) {
			e.printStackTrace();
			exit();
		}
	}
	list();
}

// 입력 예시
// [새 게시물 입력]
// 제목 : 봄이 왔어요.
// 내용 : 봄이 오면 벚꽃이 피겠죠?
// 작성자 : winter
// ------------------------------------------------------------
// 보조 메뉴 : 1.Ok | 2.Cancle
// 메뉴 선택 : 1


숫자 1을 입력하면 새로운 게시물을 생성할 수 있는 입력 칸이 만들어집니다.
글 작성 후 1번(Ok)을 입력하면 list에 바로 반영될 수 있도록 합니다.

 

 

7. read 메서드

public void read() {
	// 입력 받기		
	System.out.println("[게시물 입력]");
	System.out.print("bno : ");
	int bno = Integer.parseInt(scanner.nextLine());
	
	// boards 테이블에서 해당 게시물을 가져와 출력
	try {
		String sql = "" +
		"SELECT bno, btitle, bcontent, bwriter, bdate " +
		"FROM boards " +
		"WHERE bno=?";
		PreparedStatement pstmt = conn.prepareStatement(sql);
		pstmt.setInt(1, bno);
		ResultSet rs = pstmt.executeQuery();
		if(rs.next()) {
			Board board = new Board();
			board.setBno(rs.getInt("bno"));
			board.setBtitle(rs.getString("btitle"));
			board.setBcontent(rs.getString("bcontent"));
			board.setBwriter(rs.getString("bwriter"));
			board.setBdate(rs.getDate("bdate"));
			System.out.println("##########");
			System.out.println("번호:" + board.getBno());
			System.out.println("제목:" + board.getBtitle());
			System.out.println("내용:" + board.getBcontent());
			System.out.println("작성자:" + board.getBwriter());
			System.out.println("날짜:" + board.getBdate());
			System.out.println("##########");
			
			// 보조 메뉴 출력
			System.out.println("---------------------------------------");
			System.out.println("보조 메뉴: 1.Update | 2.Delete | 3.List");
			System.out.print("메뉴 선택: ");
			String menuNo = scanner.nextLine();
			System.out.println();
			
			if(menuNo.equals("1")) {
				update(board);
			} else if(menuNo.equals("2")) {
				delete(board);
			}
		}
		rs.close();
		pstmt.close();
	} catch (Exception e) {
		e.printStackTrace();
		exit();
	}
	list();
}

//	[게시물 목록]
//	------------------------------------------------------------
//	no    writer      date            title                                   
//	------------------------------------------------------------
//	14    winter      2023-02-14      봄이 왔어요.                                 
//	13    winter      2023-02-14      크리스마스                                   
//	12    winter      2023-02-14      눈 오는 날                                  
//	
//	------------------------------------------------------------
//	메인 메뉴 : 1.Create | 2.Read | 3.Clear | 4.Exit
//	메뉴 선택: 2
//	
//	[게시물 입력]
//	bno : 14
//	##########
//	번호:14
//	제목:봄이 왔어요.
//	내용:봄이 오면 벚꽃이 피겠죠?
//	작성자:winter
//	날짜:2023-02-14
//	##########


숫자 2를 입력하면 현재 작성되어 있는 게시물을 출력합니다. 

 

 

8. update 메서드

public void update(Board board) {
	//수정 내용 입력 받기
	System.out.println("[수정 내용 입력]");
	System.out.print("제목: ");
	board.setBtitle(scanner.nextLine());
	System.out.print("내용: ");
	board.setBcontent(scanner.nextLine());
	System.out.print("작성자: ");
	board.setBwriter(scanner.nextLine());
	
	System.out.println("------------------------------------------------------------");
	System.out.println("보조 메뉴 : 1.Ok | 2.Cancle");
	System.out.print("메뉴 선택 : ");
	String menuNo = scanner.nextLine();
	// 보조 메뉴 출력
	if(menuNo.equals("1")) {
		// boards 테이블에서 게시물 정보 수정
		try {
			String sql = "" +
				"UPDATE boards SET btitle=?, bcontent=?, bwriter=? " +
				"WHERE bno=?";
			PreparedStatement pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, board.getBtitle());
			pstmt.setString(2, board.getBcontent());
			pstmt.setString(3, board.getBwriter());
			pstmt.setInt(4, board.getBno());
			pstmt.executeUpdate();
			pstmt.close();
		} catch(Exception e) {
			e.printStackTrace();
			exit();
		}
	}
	list();
}


read에서 호출했던 update() 메서드를 만듭니다.

update를 실행하면 게시물의 내용이 수정됩니다.

 

 

9. delete 메서드

public void delete(Board board) {
	// boards 테이블에 게시물 정보 삭제
	try {
		String sql = "DELETE FROM boards WHERE bno=?";
		PreparedStatement pstmt = conn.prepareStatement(sql);
		pstmt.setInt(1, board.getBno());
		pstmt.executeUpdate();
		pstmt.close();
	} catch(Exception e) {
		e.printStackTrace();
		exit();
	}
	list();
}


read에서 호출했던 delete() 메서드를 만듭니다.

delete를 실행하면 게시물이 삭제됩니다.

 

 

10. clear 메서드

public void clear() {
	System.out.println("[게시물 전체 삭제]");
	System.out.println("------------------------------------------------------------");
	System.out.println("보조 메뉴 : 1.Ok | 2.Cancle");
	System.out.print("메뉴 선택 : ");
	String menuNo = scanner.nextLine();
	if(menuNo.equals("1")) {
		// boards 테이블에서 게시물 정보 전체 삭제
		try {
			String sql = "TRUNCATE TABLE boards";
			PreparedStatement pstmt = conn.prepareStatement(sql);
			pstmt.executeUpdate();
			pstmt.close();
		} catch(Exception e) {
			e.printStackTrace();
			exit();
		}
	}
	list();
}


숫자 3을 입력하고 Ok를 누르면 모든 게시물을 삭제합니다. 

 

 

11. exit 메서드

public void exit() {
	if(conn != null) {
		try {
			conn.close();
		} catch (SQLException e)  {
		}
	}
	System.out.println("** 게시판 종료 **");
	System.exit(0);
}


숫자 4를 입력하면 더이상 입력을 할 수 없고 console이 종료됩니다.

 

12. 전체 출력 표시

 

[게시물 목록]
------------------------------------------------------------
no    writer      date            title                                   
------------------------------------------------------------
14    winter      2023-02-14      봄이 왔어요.                                 
13    winter      2023-02-14      크리스마스                                   
12    winter      2023-02-14      눈 오는 날                                  

------------------------------------------------------------
메인 메뉴 : 1.Create | 2.Read | 3.Clear | 4.Exit
메뉴 선택: 1

[새 게시물 입력]
제목 : 게시판 제목
내용 : 게시판 내용
작성자 : 게시판 작성자
------------------------------------------------------------
보조 메뉴 : 1.Ok | 2.Cancle
메뉴 선택 : 1

[게시물 목록]
------------------------------------------------------------
no    writer      date            title                                   
------------------------------------------------------------
15    게시판 작성자     2023-02-14      게시판 제목                                  
14    winter      2023-02-14      봄이 왔어요.                                 
13    winter      2023-02-14      크리스마스                                   
12    winter      2023-02-14      눈 오는 날                                  

------------------------------------------------------------
메인 메뉴 : 1.Create | 2.Read | 3.Clear | 4.Exit
메뉴 선택: 2

[게시물 입력]
bno : 15
##########
번호:15
제목:게시판 제목
내용:게시판 내용
작성자:게시판 작성자
날짜:2023-02-14
##########
---------------------------------------
보조 메뉴: 1.Update | 2.Delete | 3.List
메뉴 선택: 1

[수정 내용 입력]
제목: 게시판 제목(수정)
내용: 게시판 내용(수정)
작성자: 게시판 작성자(수정)
------------------------------------------------------------
보조 메뉴 : 1.Ok | 2.Cancle
메뉴 선택 : 1

[게시물 목록]
------------------------------------------------------------
no    writer      date            title                                   
------------------------------------------------------------
15    게시판 작성자(수정) 2023-02-14      게시판 제목(수정)                              
14    winter      2023-02-14      봄이 왔어요.                                 
13    winter      2023-02-14      크리스마스                                   
12    winter      2023-02-14      눈 오는 날                                  

------------------------------------------------------------
메인 메뉴 : 1.Create | 2.Read | 3.Clear | 4.Exit
메뉴 선택: 2

[게시물 입력]
bno : 15
##########
번호:15
제목:게시판 제목(수정)
내용:게시판 내용(수정)
작성자:게시판 작성자(수정)
날짜:2023-02-14
##########
---------------------------------------
보조 메뉴: 1.Update | 2.Delete | 3.List
메뉴 선택: 2


[게시물 목록]
------------------------------------------------------------
no    writer      date            title                                   
------------------------------------------------------------
14    winter      2023-02-14      봄이 왔어요.                                 
13    winter      2023-02-14      크리스마스                                   
12    winter      2023-02-14      눈 오는 날                                  

------------------------------------------------------------
메인 메뉴 : 1.Create | 2.Read | 3.Clear | 4.Exit
메뉴 선택: 3

[게시물 전체 삭제]
------------------------------------------------------------
보조 메뉴 : 1.Ok | 2.Cancle
메뉴 선택 : 1

[게시물 목록]
------------------------------------------------------------
no    writer      date            title                                   
------------------------------------------------------------

------------------------------------------------------------
메인 메뉴 : 1.Create | 2.Read | 3.Clear | 4.Exit
메뉴 선택: 4

** 게시판 종료 **

 

전체 실행시켜 보았을 때 원하던 모든 기능들을 구현할 수 있었습니다.

 

해당 내용들은 oracle의 주소들과 연결이 되어있고 java에 작성하면 바로 commit이 되므로 반영이 됩니다.

 

데이터를 실제로 입력하고 연결해보니 점점 더 흥미가 있는데요

 

이제 프로젝트를 해보면서 응용해보면 되겠네요!!!!

 

많은 분들의 피드백은 언제나 환영합니다!  많은 댓글 부탁드려요~~

 

 

728x90
반응형