-
JDBC 9 - 사용자 인터페이스 붙이기(공지사항 목록)servlet/JDBC 2021. 12. 2. 00:57반응형
step1
실행 클래스 생성
console.printNoticeList();
console.inputNoticeMenu();
구현public class Program5 { public static void main(String[] args) throws ClassNotFoundException, SQLException { NoticeConsole console= new NoticeConsole(); EXIT: while(true) { console.printNoticeList(); int menu = console.inputNoticeMenu(); switch(menu) { case 1: // 상세조회 break; case 2: // 이전 break; case 3: // 다음 break; case 4: // 글쓰기 break; case 5: // 종료 System.out.print("bye"); break EXIT; default: System.out.println("잘못된 번호"); break; } } } }
Step2
NoticeService 클래스 생성후
console.printNoticeList();
console.inputNoticeMenu(); 구현public class NoticeConsole { private NoticeService service; public NoticeConsole() { service = new NoticeService(); } public void printNoticeList() throws ClassNotFoundException, SQLException { List<Notice> list = service.getList(); System.out.println("----------------------------------"); System.out.printf("<공지사항> 총 %d 게시글\n", 12); System.out.println("----------------------------------"); for(Notice n : list) { System.out.printf("%d. %s / %s / %s\n", n.getId(), n.getTitle(), n.getWriterId(), n.getRegDate()); } System.out.printf(" %d/%d pages \n", 1,2); } public int inputNoticeMenu() { Scanner sc = new Scanner(System.in); System.out.print("1. 상세조회/ 2.이전/ 3.다음/ 4.글쓰기/ 5.종료 >"); String menu_ = sc.nextLine(); int menu = Integer.parseInt(menu_); return menu; } }
Step3
페이징 쿼리 - 공지사항을 10개씩 출력하도록 쿼리 설정
REGDATE 기준으로 내림차순 정렬하여 ROWNUM과 함께
테이블을 뽑고, ROWNUM 1~10까지 레코드 가져오기
SELECT * FROM ( SELECT ROWNUM NUM, N.* FROM ( SELECT * FROM NOTICE ORDER BY REGDATE DESC ) N --가로안에 있는 쿼리의 별칭을 N으로 함 ) WHERE NUM BETWEEN 1 AND 10;
Step4
Step3에서 만든 페이징 쿼리 이용
//공지사항 10개 목록을 출력하기 위해 page값을 받아온다. public List<Notice> getList(int page) throws ClassNotFoundException, SQLException{ int start = 1+(page-1)*10; // 1, 11, 21, 31, .. int end =10*page; // 10, 20, 30, 40... String sql = "SELECT * FROM (" + " SELECT ROWNUM NUM, N.* FROM (" + " SELECT * FROM NOTICE ORDER BY REGDATE DESC" + " ) N" + ")" + "WHERE NUM BETWEEN ? AND ?"; Class.forName(driver); Connection con = DriverManager.getConnection(url, uid, pwd); PreparedStatement st = con.prepareStatement(sql); st.setInt(1, start); st.setInt(2, end); ResultSet rs = st.executeQuery(); .... }
Step5
복잡한 쿼리문을 VIEW테이블 생성하여 간단하게 만듬
목록을 위한 View 생성(DB developer에서 실행)
CREATE VIEW NOTICE_VIEW AS SELECT * FROM ( SELECT ROWNUM NUM, N.* FROM ( SELECT * FROM NOTICE ORDER BY REGDATE DESC ) N --가로안에 있는 쿼리의 별칭을 N으로 함 ); SELECT * FROM NOTICE_VIEW;
getList함수에서 쿼리문 바꿔준다.
Step6이전 / 다음 구현하기
main함수에서 page 값에 따른 switch를 실행하기 위해 page 설정
while(true) { console.printNoticeList(); int menu = console.inputNoticeMenu(); switch(menu) { case 1: // 상세조회 break; case 2: // 이전 //page-- 를 구현하기 위한 메소드 생성; console.movePrevList(); break; case 3: // 다음 //page++ 를 구현하기 위한 메소드 생성 console.moveNextList(); break; case 4: // 글쓰기 break; case 5: System.out.print("bye"); reak EXIT; default: System.out.println("잘못된 번호"); break; } }
NoticeConsole 클래서 에서 메소드 구현
public class NoticeConsole { private NoticeService service; //page를 이용하기 위해 전역으로 선언 private int page; public NoticeConsole() { service = new NoticeService(); page = 1; } public void printNoticeList() throws ClassNotFoundException, SQLException { // page 값에 따른 list객체를 받음 List<Notice> list = service.getList(page); System.out.println("----------------------------------"); System.out.printf("<공지사항> 총 %d 게시글\n", 12); ..... } public int inputNoticeMenu() { ... } // 메소드 구현 public void movePrevList() { if(page == 1) { System.out.println("이전 페이지가 없습니다."); return; } page--; } // 메소드 구현 ( 다음 페이지가 없을경우는 게시글 갯수를 구하고 만든다 ) public void moveNextList() { // if(page == 1) { // System.out.println("이전 페이지가 없습니다."); // return; // } page++; } }
Step7
NoticeConsole에서 쓰이는 페이지 갯수를 구하기 위해
getCount 메소드 생성
public class NoticeConsole { private NoticeService service; private int page; // 전역으로 count 변수 선언 private int count; public NoticeConsole() { service = new NoticeService(); page = 1; count = 0; } public void printNoticeList() throws ClassNotFoundException, SQLException { List<Notice> list = service.getList(page); // count값을 구하기 위한 메소드 생성 count = service.getCount(); System.out.println("----------------------------------"); // count값 출력 System.out.printf("<공지사항> 총 %d 게시글\n", count); ... } public int inputNoticeMenu() { ... } public void movePrevList() { ... } public void moveNextList() { ... } }
NoticeService클래스에서 getCount메소드 구현
public int getCount() throws ClassNotFoundException, SQLException { // 변수 선언 int count = 0; // 페이지 갯수를 구하는 쿼리 작성 String sql = "SELECT COUNT(ID) COUNT FROM NOTICE"; Class.forName(driver); Connection con = DriverManager.getConnection(url, uid, pwd); // statement 객체를 사용 Statement st = con.createStatement(); ResultSet rs = st.executeQuery(sql); List<Notice> list = new ArrayList<Notice>(); // count값을 가져옴 if(rs.next()) count = rs.getInt("COUNT"); rs.close(); st.close(); con.close(); return count; }
Step8
아까 아직 구현안한 마지막 페이지 구하기 (moveNextList 구현)
public class NoticeConsole { private NoticeService service; private int page; public NoticeConsole() { service = new NoticeService(); page = 1; } public void printNoticeList() throws ClassNotFoundException, SQLException { List<Notice> list = service.getList(page); //멤버 변수로 쓰는건 바람직하지않다 //매번 값이 달라 저야 하기 때문에 지역 변수로 설정 int count = service.getCount(); //마찬가지로 매번 값이 달라 져야 하기 때문에 지역 변수로 설정 int lastPage = count/10; lastPage = count%10 > 0 ? lastPage+1 : lastPage; System.out.println("----------------------------------"); ... //lastPage값 출력 System.out.printf(" %d/%d pages \n", page, lastPage); } public int inputNoticeMenu() { Scanner sc = new Scanner(System.in); System.out.print("1. 상세조회/ 2.이전/ 3.다음/ 4.글쓰기/ 5.종료 >"); String menu_ = sc.nextLine(); int menu = Integer.parseInt(menu_); return menu; } public void movePrevList() { if(page == 1) { System.out.println("---------------------"); System.out.println("이전 페이지가 없습니다."); System.out.println("---------------------"); return; } page--; } public void moveNextList() throws ClassNotFoundException, SQLException { // 위에 pageLast값을 안가져오는 이유는 // 위에 써놨듯이 값이 달라져있을 수 있기때문에 // 새로 count와 lastPage값을 구한다 int count = service.getCount(); int lastPage = count/10; lastPage = count%10 > 0 ? lastPage+1 : lastPage; if(page == lastPage) { System.out.println("---------------------"); System.out.println("다음 페이지가 없습니다."); System.out.println("---------------------"); return; } page++; } }
Step9
main에서 검색 매뉴 추가하기
case 5: // 검색 console.inputSearchWord(); break;
inputSearchWord() 구현
public void inputSearchWord() { Scanner sc = new Scanner(System.in); System.out.println("검색 범주(title/content/writerId)중에 하나를 입력하세요."); System.out.print(">"); //다른메소드(printNoticeList)가 쓸내용이기 떄문에 멤버변수로 설정 //검색하기 위한 필드어(title, id ,....) searchField = sc.nextLine(); System.out.print("검색어> "); //다른메소드(printNoticeList)가 쓸내용이기 떄문에 멤버변수로 설정 //검색어 searchWord = sc.nextLine(); }
Step10
검색 서비스 추가
public List<Notice> getList(int page, String field, String query) throws ClassNotFoundException, SQLException{ int start = 1+(page-1)*10; // 1, 11, 21, 31, .. int end =10*page; // 10, 20, 30, 40... String sql = "SELECT * FROM NOTICE_VIEW WHERE "+field+" LIKE ? AND NUM BETWEEN ? AND ?"; Class.forName(driver); Connection con = DriverManager.getConnection(url, uid, pwd); PreparedStatement st = con.prepareStatement(sql); st.setString(1, "%"+query+"%"); st.setInt(2, start); st.setInt(3, end); }
강의가 여기서 끝났다.
위 코드는 다시 공지사항을 출력하는 getList로 돌아와
field와 query값에 대한 sql을 추가하여 콘솔창에 보여준다
하지만 강의가 마무리가 안된것처럼
위에 게시판 갯수
밑에 현재 페이지, 페이지 갯수가 설정이 안되어있다
이
반응형'servlet > JDBC' 카테고리의 다른 글
Oracle JDBC 사용 방법 (0) 2022.02.03 JDBC 10 - 최종 결과물 (0) 2021.12.03 JDBC 7 - CRUD를 담당하는 NoticeService 생성 (0) 2021.11.30 JDBC 6 - 데이터 삭제하기 (0) 2021.11.30 JDBC 5 - 데이터 수정하기 (0) 2021.11.30