1. 문제 발생
전체 가입자 수를 나타내는 객체인 custcnt 데이터가 프로그램 화면상에서 0값으로 표시된다.
내가 xml, biz, 서비스 구현 자바 파일에서 null 값이 반환되면 0값으로 대체하여 반환되도록 코드를 작성했기 때문에
실제로는 데이터베이스에 쿼리를 입력해보면 정수의 값이 나오는데도 불구하고
자바 코드에서 null값이 반환되어 0값으로 대체되면서 프로그램 화면상에서 custcnt가 0값으로 표시되었다.
요약하자면,
정수값이 custcnt 데이터가 null값으로 반환되어 0값으로 대체되어 표시되는 문제 발생.
2. 문제 해결 과정
2-1. 연관 된 파일 리스트
- XML
- DAO
- BIZ
이렇게 3개의 파일 중 어느 파일이 데이터를 null값으로 반환할 가능성이 있다.
2-2. 각 파일 별 디버깅 코드 작성
2-2-1. XML
쿼리가 잘못된건 아닌지 살펴봤지만 쿼리는 문제가 없다.
2-2-2. DAO
System.out.println("DAO.Result Map: " + resultMap); // 디버깅 출력
프로그램 실행 시 DAO 파일에서 custcnt 데이터값을 null로 반환하고 있다면
콘솔창에 "DAO.Result Map: { CUSTCNT=0 }" 으로 표시될 것이다.
2-2-3. BIZ
System.out.println("BIZ.custcnt: " + custcnt); // 디버깅 출력
프로그램 실행 시 BIZ 파일에서 custcnt 데이터값을 null로 반환하고 있다면
콘솔창에 "BIZ.custcnt: 0"으로 표시될 것이다.
2-3. 프로그램 테스트 실행 및 콘솔 출력값 확인
디버깅 코드 작성 후 프로그램을 실행했을 때 Console 출력값은 아래와 같다.
DAO.Result Map: { CUSTCNT=100 }
BIZ.custcnt: 0
DAO 파일에서는 custcnt 값을 성공적으로 반환하였고,
문제는 BIZ 파일이었다.
BIZ 파일에서 custcnt 값을 null로 반환하여 0값으로 대체하여 화면에 내보내고 있었던 것이다.
따라서 BIZ 파일의 해당 부분의 코드를 점검할 필요가 있다.
3. 문제 해결
문제의 원인은 BIZ 클래스에서 resultMap.get("custcnt")를 호출할 때,
키 이름을 대문자가 아닌 소문자로 호출하고 있어서 null이 반환되고 있었다는 것이다.
기존 BIZ 코드
@SuppressWarnings("unchecked")
public Object select(Object obj) {
Object[] returnObj = new Object[6];
ArrayList<DTO> dtol = null;
int custCnt = 0; // 전체 가입자 수
try {
dtol = DAO.select(sqlMap, (HashMap<String, Object>) obj);
// select 메서드 호출
HashMap<String, Object> resultMap = oDAO.select(sqlMap, null);
if (resultMap != null) {
custCnt = resultMap.get("custcnt") != null ? ((Number) resultMap.get("custcnt")).intValue() : 0; //수정 필요
System.out.println("BIZ.custcnt: " + custcnt); // 디버깅 출력
}
returnObj[2] = custCnt; // 전체 가입자 수
} catch (Exception e) {
e.printStackTrace();
}
return returnObj;
}
XML에서 설정한 resultMap의 키 이름은 CUSTCNT와 같이 대문자인데,
이를 DAO에서 받아와 BIZ로 넘겨주는 과정에서 문제가 생겼다.
BIZ에서는 resultMap의 키 이름을 소문자로 호출하고 있어서 해당 값을 찾지 못해 null로 반환한 것이다.
이를 해결하려면 BIZ에서 resultMap의 키 이름을 대문자로 변경해 호출하도록 수정해야 한다.
수정 된 BIZ 코드
@SuppressWarnings("unchecked")
public Object select(Object obj) {
Object[] returnObj = new Object[6];
ArrayList<DTO> dtol = null;
int custCnt = 0; // 전체 가입자 수
try {
dtol = DAO.select(sqlMap, (HashMap<String, Object>) obj);
// select 메서드 호출
HashMap<String, Object> resultMap = oDAO.select(sqlMap, null);
if (resultMap != null) {
custCnt = resultMap.get("CUSTCNT") != null ? ((Number) resultMap.get("CUSTCNT")).intValue() : 0; //대문자로 수정 완료
System.out.println("BIZ.custcnt: " + custcnt); // 디버깅 출력
}
returnObj[2] = custCnt; // 전체 가입자 수
} catch (Exception e) {
e.printStackTrace();
}
return returnObj;
}
4. 확인
프로그램 실행 및 콘솔 출력값을 보니 정상적으로 값이 반영되었다.
콘솔 출력값
DAO.Result Map: { CUSTCNT=100 }
BIZ.custcnt: 100
'[Project] > 업무일지' 카테고리의 다른 글
[MySQL] Error Code: 1055. this is incompatible with sql_mode=only_full_group_by (0) | 2024.07.26 |
---|---|
[Java] 배민원, 쿠팡이츠 계산 예외처리 (0) | 2024.07.22 |
[Java] NumberFormatException: For input string: "null" (1) | 2024.07.18 |
[Java/XML/SQL/Oracle] NestedSQLException, SQLSyntaxErrorException: ORA-00911: invalid character (0) | 2024.07.17 |
[Java] NullPointerException (0) | 2024.07.17 |