코딩항해기

[Team/붕어빵원정대(중프)] 코드 개선 본문

Project

[Team/붕어빵원정대(중프)] 코드 개선

miniBcake 2024. 10. 9. 20:37

 

 

 

[JSP] JDBC - 필터 검색 (Model 파트/HashMap 사용)

기존 방식에서는 검색 쿼리를 실행시키기 위해 C에서 컨디션값을 받아와 해당 고정된 쿼리를 불러와 값을 넣어 필요한 데이터를 반환했다. 이 방식의 단점은 단일 검색이 아니라 다양한 조건이

minibcake.tistory.com

 

placeholderNum = filterKeywordSetter(pstmt,filters,placeholderNum); 		//필터 검색 검색어 
if(placeholderNum < 0) {
	//만약 filterKeywordSetter 메서드에서 오류가 발생했다면 SQL예외처리
	throw new SQLException();
}

 

필터 검색 부분에서 이 부분에 대해 계속 신경쓰이고 다른 처리 방법이 있을 것 같아 다른 방법을 계속 찾아보다 개선 방법을 찾았는데, 블로그에도 같이 기록해두면 나중에 더 놓치지 않을 것 같아 기록으로 남긴다.

 

함수 내에서 예외가 발생하면, -1이 반환되어 후속으로 플레이스 홀더에 값을 넣을 때 예외가 다시 발생하고, 후속으로 오는 플레이스 홀더가 없더라도 값이 전부 들어가지 않으면 예외가 발생하므로 if문이 필요없다는 생각을 계속 했었다. 그런데 만의 하나를 대비해 추가 검증을 달아둔 것이었다.

 

정리 해보면 두 가지 문제가 있다.

1. 함수를 사용하는 측에서 -1이 실패 값이라는 것을 알아야한다는 점

2. 실패 결과 처리가 누락될 수도 있다는 점 (생략 가능하지만 좋은 느낌은 아니다.)

 

그런데 다시 생각해보니 throws를 사용하면 메서드를 호출하는 쪽에서 예외처리를 하기 때문에 예외가 발생했을 때 try-catch로 처리해줄 수 있었다.

 

//컨디션 값이 ABC로 들어가 있는데 블로그 글을 작성할 당시 컨디션 값이 정해지지 않아 임시로 들어있던 값이다.
//혼동을 방지하기 위해 그 당시 코드로 수정했다.
//중간 프로젝트에서는 정해진 컨디션 값을 사용했다.
private int filterKeywordSetter(PreparedStatement pstmt, HashMap<String, String> filters, int placeholderNum) throws NumberFormatException, SQLException {
	System.out.println("log: filterKeyword start");
	if(filters != null && !filters.isEmpty()) {
		System.out.println("log: filterKeyword is not null");
		//만약 필터 검색을 한다면 (== C에게서 넘어온 filter 키워드가 있다면)
		for(Entry<String, String> keyword : filters.entrySet()) {
			if(keyword.getKey().equals("A")) {
				//카테고리 검색어
				pstmt.setInt(placeholderNum++, Integer.parseInt(keyword.getValue()));
				//넘어온 값 확인 로그
				System.out.println("log: parameter ProductCategory Search : "+keywoard.getValue());
			}
			else if(keyword.getKey().equals("B")) {
				//이름 검색어
				pstmt.setString(placeholderNum++, keyword.getValue());
				//넘어온 값 확인 로그
				System.out.println("log: parameter ProductName Search : "+keyword.getValue());
			}
			else if(keyword.getKey().equals("C")) {
				//제목 검색어
				pstmt.setString(placeholderNum++, keyword.getValue());
				//넘어온 값 확인 로그
				System.out.println("log: parameter ProductTitle Search : "+keyword.getValue());
			}
			else if(keyword.getKey().equals("D")) {
				//가격 검색어 
				pstmt.setInt(placeholderNum++, Integer.parseInt(keyword.getValue()));
				//넘어온 값 확인 로그
				System.out.println("log: parameter Price Min Search : "+keyword.getValue());
			}
			else if(keyword.getKey().equals("E")) {
				//가격 검색어 
				pstmt.setInt(placeholderNum++, Integer.parseInt(keyword.getValue()));
				//넘어온 값 확인 로그
				System.out.println("log: parameter Price Max Search : "+keyword.getValue());
			}
		}
	}//필터검색여부 확인 if문 종료
	System.out.println("log: filterKeyword end");
	return placeholderNum;
}

 

 

이렇게 수정하면 함수 중간에 예외가 발생하면 -1이 반환된다는 것을 사용하는 측에서 알아야한다는 문제가 해결된다.

또한 기존에는 main에서 예외 처리 (if(결과<0))가 강제되지 않아 누락될 수 있었는데, 이제는 try-catch가 강제되므로 그 문제도 함께 해결된다.

 

뿐만아니라 지금 if문 분기를 사용하는 이유는 타입이 다르기 때문인데 HashMap<String, Object>로 받아 instanceof를 사용했으면 더욱 깔끔했을 것 같다.

    private int filterKeywordSetter(PreparedStatement pstmt, HashMap<String, String> filters, int placeholderNum) throws NumberFormatException, SQLException {
    	System.out.println("log: filterKeyword start");
    	if(filters != null && !filters.isEmpty()) {
    		System.out.println("log: filterKeyword is not null");
    		//만약 필터 검색을 한다면 (== C에게서 넘어온 filter 키워드가 있다면)
    		for(Object keyword : filters.values()) {
    			if(keyword instanceof Integer) {
    				pstmt.setInt(placeholderNum++, (int)keyword);
    			}
    			else if(keyword instanceof String){
    				pstmt.setString(placeholderNum++, ""+keyword);
    			}
    			System.out.println("log: parameter ProductCategory Search : "+keyword);
    		}
    	}//필터검색여부 확인 if문 종료
    	System.out.println("log: filterKeyword end");
    	return placeholderNum;
    }

 

 

throws이나 instanceof와 박싱, 언박싱을 몰랐던 것도 아닌데 프로젝트가 끝나고 나서 생각 나 많이 아쉽다..