코딩항해기
[Team/붕어빵원정대(중프)] 코드 개선 본문
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와 박싱, 언박싱을 몰랐던 것도 아닌데 프로젝트가 끝나고 나서 생각 나 많이 아쉽다..
'Project' 카테고리의 다른 글
[Team/붕어빵원정대(최프)] Controller 파트 분배 (+ 수정) (0) | 2024.10.11 |
---|---|
[Team/붕어빵원정대(최프)] 개발 계획 (+수정) (0) | 2024.10.10 |
[Team/붕어빵원정대(최프)] 중프(JSP기반)에서 Spring 이관 작업 1차 (4) | 2024.10.09 |
[Team/붕어빵원정대(중프)] 프로젝트 파일 Git 링크 (0) | 2024.09.27 |
[Team/붕어빵원정대(중프)] 담당파트 발표자료 기록 (0) | 2024.09.25 |