20.12 JDBC를 활용해서 CMD에서 실행되는 게시판을 구현해보자.

게시판은 기본적인 CRUD(Create Read Update Delete)기능이 포함되어 있는 가장 좋은 실습 주제이다.
이것은 어떤 프로젝트를 하든지 다 들어가게 된다.

기능을 하나씩 추가하는 것이다.
20.12.1 메인메뉴 게시물 기능 보여주기
20.12.2 메인메뉴 선택기능
20.12.3 board클래스작성
boards테이블의 한개의 행(게시물)을 저장할board클래스를 작성한다. 컬램개수와 타입에 맞게 필드를 선언하고 롬복@Date어노테이션을 이용한다.
첨부파일은 넣지 않을 것이므로 필드선언안함.
20.12.4 게시물 목록 기능
boards 테이블에서 모든 게시물 정보들을 가져온다음 게시물 목록으로 출력시켜보자.
DB연결이 필요하므로 Connection필드를 추가하고 생성자에서DB연결을 한다.
그리고 boards테이블에서 게시물 정보들을 가져와서 게시물 목록으로 출력하도록 list()메소드를 수정한다.
20.12.5 게시물 생성기능
1.create 를 선택하면 새로운 게시물의 제목 내용 작성자를 키보드로 입력받고 보조 메뉴 1.ok를 선택하면 boards테이블에 새로운 게시물이 저장되도록해보자.
20.12.6 게시물 읽기 기능
2.read를 선택했을때 게시물의 번호를 키보드로 입력받고 boards테이블에 있는 해당 게시물을 가져와서 출력하기
20.12.7 게시물 수정기능
게시물 읽기에서 보조메뉴를 추가하고 보조 메뉴에서 1.update를 선택햇을때 제목 내용 작성자의 수정내용을 입력할수있도록 해보자.
그리고 ok를 선택햇을때 테이블을 수정하도록하기.
20.12.8 게시물 삭제기능
게시물읽기에서 보조메뉴 delete를 선택햇을 경우 해당 테이블에서 게시물을 삭제하기
20.12.9 게시물전체 삭제기능
게시물 전체삭제하기
20.12.10 종료
추가내용
20.확인문제 8번
새 사용자를 가입하는 기능추가하기
User 클래스 만들고 join메뉴 추가
20.확인문제9번
1.login메뉴 추가
2.로그인에 필요한 사용자 정보를 받기
3.ok를 선택하면 users테이블에서 비밀번호를 가져오기 20장9절 사용자정보읽기참조
4.입력된 비밀번호 db비밀번호가 일치한다면 목록으로 돌아오고 로그인한 사용자 아이디를 [게시물목록]옆에 출력
5.메인메뉴에 4.logout이 나오도록 재구성
6.비밀번호가 맞지않을 경우 아이디존재x 일치x 등등 다시 입력하도록 해줌
7.cancle을 선택하면 로그인안하고 목록으로
8.로그인한상태에서 메인메뉴의 4.logout을 선택하면 게시물 목록옆에 사용자정보가 사라지도록 로그아웃기능
20.확인문제 10번
1.로그인상태에서 메인메뉴 1.create선택시 글쓴이는 제거하는대신 로그인한 사용자 아이디를 글쓴이로 사용하기
2.로그인하지 않은 상태에서 메인메뉴 2.read선택시 게시물을 읽엇다면 보조메뉴를 출력하지 않고 바로 목록으로 되돌아가기
3.로그인한 상태에서도 로그인한 사용자 아이디와 글쓴이가 동일할경우에만 보조메뉴가 출력되도록하기

public class BoardExample12 {
//Field
private Scanner scanner = new Scanner(System.in);
private Connection conn;
private String loginId;

//Constructor
public BoardExample12 () {

    try {
        // JDBC Driver를 메모리로 로딩하고 DriverMangaer에 등록
        Class.forName("oracle.jdbc.OracleDriver");

        //DB와 연결
        conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/orcl", "java", "oracle");
        System.out.println("연결 성공");

    } catch (Exception e) {
        e.printStackTrace();
    }                        
}

//Method        
public void list() {
    System.out.println();
    //---
    //3.11 삼항(조건) 연산자 참조하기
    System.out.println("[게시물 목록]" + ((loginId != null) ? (" 사용자: " + loginId) : " "));
    //--
    System.out.println("-----------------------------------------------------------------------");
    System.out.printf("%-6s%-12s%-16s%-40s\n", "no", "writer", "date", "title");
    System.out.println("-----------------------------------------------------------------------");

    try {
        //boards 테이블에서 게시물 정보를 가져와서 출력하기
        //bno 가져와서내림차순으로 정렬 (최신순으로 봐야하니)
        String sql = "SELECT bno, btitle, bcontent, bwriter, bdate " + "FROM boards " + "order by bno DESC";

        //PreparedStatement에 넣기
        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("%-6d%-12s%-16s%-40s\n", board.getBno(), board.getBwriter(), board.getBdate(), board.getBtitle());
        }
        rs.close();
        pstmt.close();    
    } catch (SQLException e) {
        System.out.println(e.getMessage());
        exit();
    }
    mainMenu();
}

public void mainMenu() {
    System.out.println();
    System.out.println("-----------------------------------------------------------------------");
    if (loginId == null) {
        System.out.println("메인 메뉴: 1.Create | 2.Read | 3.Clear | 4.Join | 5.Login |6.Exit");
        System.out.print("메뉴 선택: ");

        String menuNo = scanner.nextLine();

        switch(menuNo) {
        case "1": create(); break;
        case "2": read(); break;
        case "3": clear(); break;
        case "4": join(); break;
        case "5": login(); break;
        case "6": exit(); break;
        }
    } else {
        System.out.println("메인 메뉴: 1.Create | 2.Read | 3.Clear | 4.Logout | 5.Exit");
        System.out.print("메뉴 선택: ");

        String menuNo = scanner.nextLine();

        switch(menuNo) {
        case "1": create(); break;
        case "2": read(); break;
        case "3": clear(); break;
        case "4": logout(); break;
        case "5": exit(); break;
        }
    }
}

public void smallMenu1() {
    System.out.println("-----------------------------------------------------------------------");
    System.out.println("1.Ok|2.Cancel");
    System.out.print("메뉴 선택: ");
}

public void smallMenu2() {
    System.out.println("-----------------------------------------------------------------------");
    System.out.println("1.Update|2.Delete|3.List");
    System.out.print("메뉴 선택: ");
}

public void create() {
    Board board = new Board();
    System.out.println("[새 게시물 입력]");
    System.out.print("제목: ");
    board.setBtitle(scanner.nextLine()); 
    System.out.print("내용: ");
    board.setBcontent(scanner.nextLine()); 
    if (loginId == null ) {
        System.out.print("작성자: ");
        board.setBwriter(scanner.nextLine());
    } else {
        board.setBwriter(loginId);
    }

    smallMenu1();
    String menuNo = scanner.nextLine();

    if (menuNo.equals("1")) {
        try {
            //boards테이블에 게시물 정보 저장 insert문
            String sql = "insert into boards (bno, btitle, bcontent, bwriter, bdate) " + "values (SEQ_BNO.NEXTVAL, ?, ?, ?, SYSDATE)";

            //Prepared
            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 (SQLException e) {
            e.printStackTrace();
            exit();
        }
    }

    list();

}

public void read() {
    System.out.println("[게시물 읽기]");
    System.out.print("bno: ");
    int bno = Integer.parseInt(scanner.nextLine());

    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());

            if (loginId != null && loginId.equals(board.getBwriter())) {
                smallMenu2();
                String menuNo = scanner.nextLine();

                switch (menuNo) {
                case "1": update(board);
                case "2": delete(board);
                }
            }    
        }
        rs.close();
        pstmt.close();

    } catch (SQLException e) {
        e.printStackTrace();
        exit();
    }
    list();
}

public void update(Board board) {
    System.out.println("[수정 내용 입력]");
    System.out.print("제목: ");
    board.setBtitle(scanner.nextLine()); 
    System.out.print("내용: ");
    board.setBcontent(scanner.nextLine()); 
    smallMenu1();
    String menuNo = scanner.nextLine();

    if (menuNo.equals("1")) {
        try {
            //boards테이블에 게시물 정보 저장 insert문
            String sql = "update boards set btitle=?, bcontent=?" + "where bno=?";

            //Prepared
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, board.getBtitle());
            pstmt.setString(2, board.getBcontent());
            pstmt.setInt(3, board.getBno());

            pstmt.executeUpdate();
            pstmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
            exit();
        }
    }
    list();
}

public void delete(Board board) {
    System.out.println("[게시물 삭제]");
    System.out.println("-----------------------------------------------------------------------");
    System.out.println("삭제하시겠습니까?");
    smallMenu1();
    String menuNo = scanner.nextLine();

    if (menuNo.equals("1")) {
        try {
            String sql = "delete from boards " + "where bno=?";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, board.getBno());
            pstmt.executeUpdate();
            pstmt.close();

        } catch (SQLException e) {
            e.printStackTrace();
            exit();
        }
        list();
    }
    list();
}

public void clear() {
    if (loginId != null && loginId.equals("pcc105")) {
        System.out.println("[게시물 전체 삭제]");
        smallMenu1();
        String menuNo = scanner.nextLine();

        if (menuNo.equals("1")) {
            try {
                String sql = "TRUNCATE TABLE boards";
                PreparedStatement pstmt = conn.prepareStatement(sql);
                pstmt.executeUpdate();
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
                exit();
            }    
        }
    } else {
        System.out.println("[권한이 없습니다.]");
        list();
    }
    list();
}

public void join() {
    User user = new User();
    System.out.println("[새 사용자 입력]");
    System.out.print("아이디: ");
    user.setUserId(scanner.nextLine());
    System.out.print("이름: ");
    user.setUserName(scanner.nextLine());
    System.out.print("비밀번호: ");
    user.setUserPassword(scanner.nextLine());
    System.out.print("나이: ");
    user.setUserAge(Integer.parseInt(scanner.nextLine()));
    System.out.print("이메일: ");
    user.setUserEmail(scanner.nextLine());

    smallMenu1();
    String menuNo = scanner.nextLine();

    if (menuNo.equals("1")) {
        try {
            //유저테이블에 유저 정보 저장 insert문
            String sql = "insert into users (userid, username, userpassword, userage, useremail) " 
            + "values (?, ?, ?, ?, ?)";

            //Prepared
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, user.getUserId());
            pstmt.setString(2, user.getUserName());
            pstmt.setString(3, user.getUserPassword());
            pstmt.setInt(4, user.getUserAge());
            pstmt.setString(5, user.getUserEmail());
            pstmt.executeUpdate();
            pstmt.close();
        } catch (Exception e) {
            e.printStackTrace();
            exit();
        }
    }

    list();
}    

public void login() {
    //입력받기
    User user = new User();
    System.out.println("[로그인]");
    System.out.print("아이디: ");
    user.setUserId(scanner.nextLine());
    System.out.print("비밀번호: ");
    user.setUserPassword(scanner.nextLine());

    smallMenu1();
    String menuNo = scanner.nextLine();

    if (menuNo.equals("1")) {

        try {
            //아이디에 따른 비밀번호 선택
            String sql = "select userpassword from users where userid=?";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, user.getUserId());
            ResultSet rs = pstmt.executeQuery();
            if(rs.next()) {
                String dbPassword = rs.getString("userpassword");
                if(dbPassword.equals(user.getUserPassword())) {
                    loginId = user.getUserId();
                } else {
                    System.out.println("비밀번호가 일치하지 않습니다.");
                }
            } else {
                System.out.println("아이디가 존재하지 않습니다.");

            }
            rs.close();
            pstmt.close();

        } catch (SQLException e) {
            e.printStackTrace();
            exit();
        }
    }
    list();


}

public void logout() {
    //로그인 아이디 없애기
    loginId = null;

    list();

}


public void exit() {
    System.out.println("***게시판 종료***");
    System.exit(0);

}

public static void main(String[] args) {
    //생성자에 db연결 코드를 넣었기 때문에 객체만들때 알아서 db와 연결됨
    BoardExample12 boardExample = new BoardExample12();
    boardExample.list();}}

2022.12.25 리뷰

네트워크를 이용하는 것보다는 훨씬 낫다.
드디어 이것이 자바다 2회독이 끝이 났다.
내일부터 jsp&서블릿을 한단계씩 나아가고자 한다.
솔직히 복잡하다 java만하다가 드디어 웹구현이라는 파트로 들어가게 되는게 두렵다.
그러나 벌써 2023년이 다가오고 멈춰있을 수 만은 없다.
중요한것은 꺾이지 않는 마음

+ Recent posts