TIL3 - (JDBC) crud 구현해보기(3) (이전, 다음페이지, 검색구현)

김지인·2022년 7월 6일
0
post-thumbnail

현재 진행된 상황이다

public class membermain {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		MemberConsole mc = new MemberConsole();
		
		EXIT:
		while(true) { //명령어를 입력했을 때 다시 콘솔창에 출력되기 위해 while문으로 계속출력.
			mc.printMemberList();
			
			int choice = mc.printMenuList();
			switch(choice) { //printMenuList로부터 받은 choice번호를 구분하여 명령을 실행하는 switch문
			case 1: // 이전페이지를 명령하는 숫자
				break;
			case 2: // 다음페이지를 명령하는 숫자
				break;
			case 3: // 검색을 명령하는 숫자
				break;
			case 4: // 종료를 명령하는 숫자
				System.out.println("----------------");
				System.out.println("종료 합니다.");
				System.out.println("----------------");
				break EXIT; // while문에 EXIT를 달아 반복문을 빠져나옴. 
			default: // 다른 숫자를 입력했을때.
				System.out.println("잘못 입력하셧습니다.");
				break;
			}	
		
		}
	}

}
//출력결과
등록된 총 ID : 7
-----------------------------------------------
ID: bmm522, PWD: 1234, NAME: 김지인
ID: rlawldls11, PWD: 4567, NAME: 김성필
ID: rerere, PWD: 244443, NAME: 로버트
-----------------------------------------------
                 1 / 3
/ 1. 이전페이지 / 2. 다음페이지 / 3. 검색 / 4. 종료 />

지난번까지 페이지와 메뉴 ui를 구현했는데 이번에는 그 메뉴들의 기능을 하나씩 구현해보자


이전페이지 다음페이지 구현하기

사용자가 1번을 입력하면 이전페이지로 가고 2번을 입력하면 다음페이지로 가는 것을 구현해보자.

생각해야 할것은 첫페이지 일경우에 1번을 입력하면 이동할 페이지가 없기때문에 불가능하다고 알림을 줘야하고, 마찬가지로 끝페이지일 경우에 2번을 입력하면 불가능하다고 알림을 줘야한다. 그리고 현재 페이지의 표시도 바뀌어야 한다.


switch(choice) { 
			case 1: // 이전페이지를 명령하는 숫자
				mc.printPrevList(); // 이전페이지를 실행하는 메서드 추가
				break;
			case 2: // 다음페이지를 명령하는 숫자
				mc.printNextList(); // 다음페이지를 실행하는 메서드 추가
				break;
			case 3: // 검색을 명령하는 숫자
				break;
			case 4: // 종료를 명령하는 숫자
				System.out.println("----------------");
				System.out.println("종료 합니다.");
				System.out.println("----------------");
				break EXIT; 
			default: // 다른 숫자를 입력했을때.
				System.out.println("잘못 입력하셧습니다.");
				break;

printPrevList()printNextList()를 추가했다. 그러면 두 메서드를 구현해보자.


	public void printPrevList() {
		if(checknumber ==1) {
			System.out.println("이전 페이지가 없음");
			return;
		}
		checknumber --;	//getMember() 안에 체크해야 할 숫자감소
	}

	public void printNextList() throws ClassNotFoundException, SQLException {
		int count = ms.getTotal(); 
		// 실행되는 도중에 값이 업데이트되거나 삭제 될 수 있으므로 지역변수로 선언
		int endPageNumber = count/3;  
		
		endPageNumber = count%3==0?endPageNumber:endPageNumber++;
		
		if(checknumber > endPageNumber) {
			System.out.println("다음 페이지가 없음");
			checknumber --; 
		}
		
		checknumber ++; //getMember() 안에 체크해야 할 숫자증가
	}
  • printPrevList()을 실행했을때 현재 checknumber이 1이면 첫페이지 이므로 "이전 페이지가 없음" 이라는 안내메세지를 보내고 만약에 그게 아니라면 checknumber을 감소시켜 getMember()의 탐색범위를 수정함.
  • printNextList()을 실행했을 때 실시간으로 값이 변경될 수 있기 때문에 끝페이지를 체크하는 부분을 지역적으로 다시 정의해줌.

등록된 총 ID : 7
-----------------------------------------------
ID: bmm522, PWD: 1234, NAME: 김지인
ID: rlawldls11, PWD: 4567, NAME: 김성필
ID: rerere, PWD: 244443, NAME: 로버트
-----------------------------------------------
                 1 / 3
/ 1. 이전페이지 / 2. 다음페이지 / 3. 검색 / 4. 종료 />2

등록된 총 ID : 7
-----------------------------------------------
ID: SASD, PWD: 1234, NAME: ㅇㄻㄴ
ID: asdfsdf, PWD: 1234, NAME: 홍록기
ID: asdad, PWD: 1244, NAME: 강동원
-----------------------------------------------
                 2 / 3
/ 1. 이전페이지 / 2. 다음페이지 / 3. 검색 / 4. 종료 />1

등록된 총 ID : 7
-----------------------------------------------
ID: bmm522, PWD: 1234, NAME: 김지인
ID: rlawldls11, PWD: 4567, NAME: 김성필
ID: rerere, PWD: 244443, NAME: 로버트
-----------------------------------------------
                 1 / 3
/ 1. 이전페이지 / 2. 다음페이지 / 3. 검색 / 4. 종료 />

검색기능 구현하기

다음은 간단하게 아이디를 검색하는 것을 구현 해보자.

switch(choice) { 
			case 1: // 이전페이지를 명령하는 숫자
				mc.printPrevList();
				break;
			case 2: // 다음페이지를 명령하는 숫자
				mc.printNextList();
				break;
			case 3: // 검색을 명령하는 숫자
				mc.searchId(); // 검색하기 위해 추가
				break;
			case 4: // 종료를 명령하는 숫자
				System.out.println("----------------");
				System.out.println("종료 합니다.");
				System.out.println("----------------");
				break EXIT; // while문에 EXIT를 달아 반복문을 빠져나옴. 
			default: // 다른 숫자를 입력했을때.
				System.out.println("잘못 입력하셧습니다.");
				break;
			}	

우선은 membermain안에 있는 명령어를 실행하는 부분에서 searchId()메서드를 실행했을때 검색이 가능 하게끔 만들어보자.

public class MemberConsole {
	
	private memberservice ms; 
	
	private int checknumber; //추가+++++

	private String searchWord;
	
	public MemberConsole() {
		ms = new memberservice();
		checknumber = 1; //추가+++++
		searchWord = "";
	}
	
	public void printMemberList() throws ClassNotFoundException, SQLException {
		List<member> list = ms.getMember(checknumber, searchWord); //추가+++++
		
		int totaldata = ms.getTotal();
		
		int endPageNumber = totaldata/3;
		
		if(totaldata%3 !=0) {
			endPageNumber ++;
		}
		
		System.out.printf("등록된 총 ID : %d\n", totaldata);
		System.out.println("-----------------------------------------------");
		list.forEach(m -> System.out.printf("ID: %s, PWD: %s, NAME: %s\n", m.getId(), m.getPwd(), m.getName()));
		System.out.println("-----------------------------------------------");
		System.out.printf("                 %d / %d\n", checknumber, endPageNumber);
	}


	public void searchId() {
		Scanner sc = new Scanner(System.in); 
		//사용자에게 검색키워드를 입력받기
		System.out.print("ID 검색어를 입력하세요 >");
		searchWord = sc.nextLine();
		//리스트를 불러오는 getMember()에서 사용되야 하기때문에 공유를 위해 멤버변수로 선언.
		
		
	}

}
  • serachId()에서 사용자의 입력을 받고 그 입력받은 값을 검색하는데 사용해야 하므로 searchWord를 멤버변수로 선언.
  • 보면 printMemberList()안에서 실행되는 getMember()에 키워드로 searchWord변수가 추가된 것을 볼수 있다.

만약에 IDMEMBER테이블에서 키워드로 검색하고 UNIQUENUMBER을 범위로 나눠서 실행했을때 sql구문은 다음과 같다.

SELECT * FROM MEMBER WHERE ID LIKE '?%' AND UNIQUENUMBER BETWEEN ? AND ?; ('?'로 시작하는 키워드 검색해서 표시)

그러면 이것을 이용해서 기존의 리스트를 불러오는 로직을 수정해보자.

public List<member> getMember(int checknumber, String searchWord) throws ClassNotFoundException, SQLException{
		int startUniqueNumber = 1+(checknumber-1)*3;
		int endUniqueNumber = checknumber*3;
		
        String sql = "SELECT * FROM MEMBER WHERE ID LIKE ? AND UNIQUENUMBER BETWEEN ? AND ?";
		//수정
		Class.forName(driver);
		Connection con = DriverManager.getConnection(url, uid, upwd);
		PreparedStatement st = con.prepareStatement(sql); // sql 구문에 값을 꽂아 넣기 위한 준비
		
		st.setString(1, searchWord+"%"); // 첫번째 ?의 값에 꽂아 넣기 
		st.setInt(2, startUniqueNumber); // 두번째 ?의 값에 꽂아 넣기
		st.setInt(3, endUniqueNumber); // 세번째 ?의 값에 꽂아 넣기
//출력결과
등록된 총 ID : 7
-----------------------------------------------
ID: bmm522, PWD: 1234, NAME: 김지인
ID: rlawldls11, PWD: 4567, NAME: 김성필
ID: rerere, PWD: 244443, NAME: 로버트
-----------------------------------------------
                 1 / 3
/ 1. 이전페이지 / 2. 다음페이지 / 3. 검색 / 4. 종료 />3
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
ID 검색어를 입력하세요 >b
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
등록된 총 ID : 7
-----------------------------------------------
ID: bmm522, PWD: 1234, NAME: 김지인
-----------------------------------------------
                 1 / 3
/ 1. 이전페이지 / 2. 다음페이지 / 3. 검색 / 4. 종료 />

다음과 같이 검색된 것을 볼 수 있다.

추가로 '등록된 총 ID'를 '검색된 ID'로 수정하고 검색결과가 없으면 검색결과가 없다고 프린트 해주는 기능을 구현해보자.

	public void searchId() throws ClassNotFoundException, SQLException {
		Scanner sc = new Scanner(System.in); 
		
		System.out.print("ID 검색어를 입력하세요 >");
		searchWord = sc.nextLine();
		
        
        --------------추가한부분-------------------------------------
		MemberConsole checkmc = new MemberConsole();
		List<member> checkEmpty = ms.getMember(checknumber, searchWord); 
        // 비엇는지 안비엇는지 알려주는 용도
		
		if(checkEmpty.isEmpty()) {
			System.out.println("검색결과가 없습니다");
		}
		----------------------------------------------------------
		
	}

처음에는 해당 로직처럼 새로 인스턴스를 만들어서 탐색해주면 될줄 알았다. 그러나 수정해야 할 곳은 등록된 ID에서 검색된 결과 ID로 바꿔줘야하고 현재 리스트에 있는 개수를 나타내야 하기때문에 전역적으로 사용가능하게끔 다시 수정해야 했다.


그러면 등록된 갯수를 구하는 로직을 수정하여 그 값이 0이면 검색결과가 없다고 프린트하고 추가적으로 현재 검색된 아이디의 수를 알려줄 수 있도록 수정해보자.

	public void searchId() throws ClassNotFoundException, SQLException {
		Scanner sc = new Scanner(System.in); 
		//사용자에게 검색키워드를 입력받기
		System.out.print("ID 검색어를 입력하세요 >");
		searchWord = sc.nextLine();
		//리스트를 불러오는 getMember()에서 사용되야 하기때문에 공유를 위해 멤버변수로 선언.
	
		int checkEmptyNumber = ms.getTotal(searchWord);
		if(checkEmptyNumber == 0) {
			System.out.println("검색결과가 없습니다.");
		}
		
	}

getTotal()searchWord를 넣어 해당 키워드를 검색하고 남은 데이터 값을 출력할 수 있도록 수정하였다.

public int getTotal(String searchWord) throws ClassNotFoundException, SQLException {
		int totaldatacount = 0;

		
		 String sql = "SELECT COUNT(*) FROM (SELECT * FROM MEMBER WHERE ID LIKE ?)";
		 //기존의 총 갯수를 구하는 구문에서 searchWord 키워드를 
         //검색하고 그리고 총 갯수를 구하는 구문으로 수정
		  
		  Class.forName(driver); 
		  Connection con = DriverManager.getConnection(url, uid, upwd);
		  PreparedStatement st = con.prepareStatement(sql);
		  
		  st.setString(1, searchWord+"%");
		  ResultSet rs = st.executeQuery();
		  
		  rs.next(); 
		  
		  totaldatacount=rs.getInt("COUNT(*)"); 
		  // 총 갯수를 카운트 함
		 
		return totaldatacount;
	}
//출력결과
검색된 총 ID : 7
-----------------------------------------------
ID: bmm522, PWD: 1234, NAME: 김지인
ID: rlawldls11, PWD: 4567, NAME: 김성필
ID: rerere, PWD: 244443, NAME: 로버트
-----------------------------------------------
                 1 / 3
/ 1. 이전페이지 / 2. 다음페이지 / 3. 검색 / 4. 종료 />3


ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
ID 검색어를 입력하세요 >r
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


검색된 총 ID : 2
-----------------------------------------------
ID: rlawldls11, PWD: 4567, NAME: 김성필
ID: rerere, PWD: 244443, NAME: 로버트
-----------------------------------------------
                 1 / 1
/ 1. 이전페이지 / 2. 다음페이지 / 3. 검색 / 4. 종료 />

이로써 메뉴UI에 있는 기능을 모두 구현해보았다. 다음번엔 차례대로 기능을 추가해서 기능해보자.

profile
에러가 세상에서 제일 좋아

0개의 댓글