백엔드/Database

Jdbc(ojdbc) 검색 서비스 추가하기 | TIL_140

ran4 2022. 9. 2. 20:55

https://www.youtube.com/playlist?list=PLq8wAnVUcTFWxwoc41CqmwnO-ZyRDL0og

강의를 듣고 정리한 내용입니다

 


검색 메뉴 붙이기

NoticeConsole에 추가 

System.out.printf("1.상세조회/ 2.이전/ 3.다음/ 4.글쓰기 / 5.검색 / 6.종료>");

 

 

 

NoticeProgram

switch문 수정

case 4 : //글쓰기
break;

case 5 : //검색
console.inputSearchWord();
break;

case 6 : //종료
System.out.println("종료합니다.");
break EXIT;

 

 

NoticeConsole

입력을 받을 때 2가지 키워드가 필요하다

  • 검색어와 검색을 위한 필드(제목, 작성자 등)

 

검색을 위한 searchWord, searchField 변수선언 

어떤 변수로 선언할 것인가?

> list를 가지고 올 때 검색 키워드로 사용해야 하기 때문에 다른 메서드와 공유해야하는 정보를 가지고 있다

-> 멤버 변수로 선언한다 //지역변수는 메서드 내에서만 사용가능하다

  • private String searchWord;
  • private String searchField; 

 

 

NoticeConsole() 메서드 생성 

public NoticeConsole() {
service = new NoticeService();
page = 1;

searchWord = "";
searchField = "";
}

 

 

검색 범주를 입력받는 inputSearchWord() 메서드 생성

public void inputSearchWord() {
Scanner kb = new Scanner(System.in);
System.out.println("검색 범주(title/content/writerId) 중에 하나를 입력하세요");
System.out.println(" > ");

searchField = kb.nextLine();
System.out.println("검색어 > ");

searchWord = kb.nextLine();
}

 

 


검색 서비스 추가하기

NoticeService

목록을 제공해주는 getList(int page) 속 변수를 추가한다 

사용자로부터 페이지 정보만 전달 했지만, 검색 기준값인 field

실질적으로 검색어가 입력되는 query 변수를 추가로 선언한다

public List<Notice> getList(int page, String field, String query) 
throws ClassNotFoundException, SQLException {

 

 

 

sql문 수정

field의 값을 넣어야 할 때 위치 홀더인 "?"로 지정하고

pstmt.setString(1, field);로 값을 넘겨주는 방법을 이용하기 위해 sql문을 수정한다 

 

String sql = "SELECT * FROM NOTICE_VIEW WHERE ? LIKE '%A%' AND NUM BETWEEN ? AND ?";

-> 필드의 값을 세팅하는 방식을 사용하면 결과 집합이 'field'식으로 들어가는데,

''(작은따옴표)는 값이 아니기 때문에 쿼리를 실행할 때 문제가 발생한다

 

 

"+"를 이용하여 수정

String sql = "SELECT * FROM NOTICE_VIEW WHERE" + field + " LIKE ? AND NUM BETWEEN ? AND ?";

-> LIKE 뒤의 ?는 값으로 채워도 무방하다

-> 원래 넣는 값이 '%A%'의 형태였기 때문이다 

 

 

query의 값을 넘겨줄 수 있도록 메서드 내용을 수정한다 

pstmt.setString(1, "%"+query+"%"); 
pstmt.setInt(2, start);
pstmt.setInt(3, end);

 

 

NoticeConsole에서 값을 넘겨준다

> printNoticeList() 메서드에 

List<Notice> list = service.getList(page, searchField, searchWord); 매개변수 추가

public void printNoticeList() throws ClassNotFoundException, IOException, SQLException  {
//변경된 부분
List<Notice> list = service.getList(page, searchField, searchWord); 
count = service.getCount(); //항상 값을 구해야 한다 
int lastPage = count / 10;
lastPage = count % 10 > 0 ? lastPage+1 : lastPage;

    System.out.println("─────────────────────────"); 
    System.out.printf("<공지사항> 총%d 게시글", count);
    System.out.println("─────────────────────────");

    for(Notice n : list) { //forEach문으로 반복 
        System.out.printf("%d. %s / %s / %s\n", 
                n.getId(), n.getTitle(), n.getWriterId(), n.getRegDate());
    }
    System.out.println("─────────────────────────");
    System.out.printf(" 			%d/%d pages\n", page, lastPage);
}

 

 

**누락된 표현식이라는 오류가 발생**

NoticeConsole() 검색 필드에 아무것도 넣지 않아서 발생한 오류이다

기본 문자열로 TITLE을 넣어준다

searchField = "TITLE";

public NoticeConsole() {
    service = new NoticeService();
    page = 1;
    searchField = "TITLE";
    searchWord = "";
}