ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글

Designed by Tistory.