jsp 오류는 별로 친절하지 않은 것 같아...
오류 종류만 알려주고 어디서 오류가 난 건지는 알려주지 않잖아...😭😭
jsp 하면서 맨날천날 만나는 NullPointerException
차라리 sql 구문 오류 뜨는 게 더 나은 것 같아
NullPointerException
나올 때마다
뭐가 Null이라는 거야 하면서
처음부터 봐도 도저히 오류가 보이질 않더라
대체 어디 값이 안 넘어간 거야...
게시판 목록을 불러오고 싶은데 오류가 나는 거라서
혹시 글 번호랑 페이지 번호가 안 넘어간 건가 싶어서
콘솔창에 출력해봤는데 굳이 콘솔창에 출력할 필요가 없더라?
굳이 콘솔창에 출력 안해도 주소창에서 확인이 가능하다!
주소창 보니까 글 번호랑 페이지 번호 둘 다 잘 넘어갔더라
그럼 뭐가 안 넘어갔지? 할 때!!!!
사용할 수 있는 방법!!!
글 번호랑 페이지 번호도 잘 넘어갔고
게시판 목록 만드는 페이지에서 따로 빨간 줄 그인 것도 없어서
대체 어디서 오류가 난 건지 알 수가 없었는데
보통 이런 경우는 DAO에서 생긴 오류일 확률이 높댜
그래서 DAO 클래스에서 메서드를 하나하나 보는 데
여기도 빨간줄 그인 게 없어서 대체 왜 오류가 난 건지 알 수가 없었다😇😇
이럴 때!!
위에서 했던 것처럼 콘솔창에 출력해보면 됨!!
근데 뭐를...?
뭐를 출력해야 알 수 있는 거지...?
- DTO 객체 출력해보기
제일 먼저 DTO 객체가 제대로 넘어온 게 맞는지 DTO 객체를 출력해보자!
이 방법은 SELECT
구문을 썼을 떄 해보는 거고
SELECT
구문을 안 썼다면 바로 2번으로 넘어가기!
while(rs.next()) {
fileBoardDTO dto = new fileBoardDTO();
dto.setIdx(rs.getInt("idx"));
dto.setName(rs.getString("name"));
dto.setPass(rs.getString("pass"));
dto.setSubject(rs.getString("subject"));
dto.setContent(rs.getString("content"));
dto.setOriginal_file(rs.getString("original_file"));
dto.setReal_file(rs.getString("real_file"));
dto.setDate(rs.getTimestamp("date"));
dto.setReadcount(rs.getInt("readcount"));
fileboardList.add(dto);
System.out.println(dto.toString());
}
toString()
메서드를 이용해서 출력해주면 되는데
나는 여기서 아무것도 안 나왔음...😱😱😱
여전히 NullPointerException
만 콘솔창에 출력됨...
그러면 2번으로 넘어가서 pstmt
에서 sql 구문이 제대로 입력됐는지 확인해보면 되는데
그 전에
이 단계에서 찾을 수 있는 오류들!
set으로 열심히 DTO 객체에 있는 값을 넣어놓고 배열에 넣는 걸 깜빡하지는 않았나요?
마지막에 add()
메서드를 통해서 배열에 값을 추가해줘야 함!
-> 이 경우에도 NullPointerException
오류 발생함!!
컬럼을 모두 저장한 게 확실한가요?
물론 필요한 것만 저장해서 jsp파일에서 꺼내 쓰면 되는데 만약 저장하지 않았다면??
-> 이 경우에도 NullPointerException
오류 발생함!!
-> 모든 값을 넣은 게 맞는지 확인하기!
while(rs.next()) {
fileBoardDTO dto = new fileBoardDTO();
dto.setIdx(rs.getInt("idx"));
dto.setName(rs.getString("name"));
dto.setPass(rs.getString("pass"));
// dto.setSubject 코드 삭제했음
dto.setContent(rs.getString("content"));
dto.setOriginal_file(rs.getString("original_file"));
dto.setReal_file(rs.getString("real_file"));
dto.setDate(rs.getTimestamp("date"));
dto.setReadcount(rs.getInt("readcount"));
fileboardList.add(dto);
System.out.println(dto.toString());
}
위와 같이 dto.setSubject
를 저장하지 않은 경우를 살펴보자!
이 경우에는 jsp파일에서 메서드를 호출하더라도 setSubject
값이 없기 때문에 코드를 실행했을 경우 NullPointerException
오류가 발생한다
while(rs.next()) {
fileBoardDTO dto = new fileBoardDTO();
dto.setIdx(rs.getInt("idx"));
dto.setName(rs.getString("name"));
dto.setPass(rs.getString("pass"));
// dto.setSubject 코드도 없고 setContent 코드도 없음
dto.setSubject(rs.getString("content"));
dto.setOriginal_file(rs.getString("original_file"));
dto.setReal_file(rs.getString("real_file"));
dto.setDate(rs.getTimestamp("date"));
dto.setReadcount(rs.getInt("readcount"));
fileboardList.add(dto);
System.out.println(dto.toString());
}
위보다 더 멍청한 경우를 살펴보자!
이건 내가 했던 실수! 🤬🤬🤬🤬
dto.setSubject
에 당당하게 들어가있는 "Content"
이건 subject
값도 없고 content
값도 없음...
있는 게 없는데 jsp파일에서 getXXX()
로 호출해서 사용하려고 하면
당연히 NullPointerException
오류가 발생함...
pstmt
에서 sql 구문을 제대로 처리했는지 출력해보기
DTO 객체 값이 안 넘어갔다면 pstmt
에서 오류가 났을 확률이 높음!
System.out.println(pstmt);
rs = pstmt.executeQuery();
rs
를 실행하기 전(=rs
코드 위)에 println
으로 pstmt
를 출력해주면 sql 구문이 제대로 적용됐는지 알 수 있다!
그리고 나는 여기서 오류를 찾을 수 있었음!
LIMIT 10,
뒤에
NOT SPECIFIED
너 누구야👀
여기서 내가 썼던 sql 구문을 다시 보면
String sql ="SELECT * FROM fileboard WHERE subject LIKE ? ORDER BY idx DESC LIMIT ?, ?";
오!
마지막 물음표에 들어가는 값에서 문제가 일어났다는 것을 알 수 있다!
드디어 찾았다!
오류 발생 위치!
그러면 pstmt.set
에서 뭔가 이상한 게 있다는 건데 뭐라고 썼길래 오류가 났지?
만능문자 순서 번호 마지막에 2 뭐지?
왜 2가 두 번이나 들어가있지?
왜 3번이 없지?
물음표 3번에 값이 없으니까 당연히 NULL 값이 나올 수밖에...
pstmt.setInt(2, listLimit);
를
pstmt.setInt(3, listLimit);
로 고쳐주면 오류 해결 완...
너무 어이없지만
그래도 오류 위치 쉽게 찾을 수 있게 되었으니까
난 그걸로 만족해...
INSERT INTO board VALUES (16,'1','1','1',** BYTE ARRAY DATA **,now(),0)
이건 폼 파라미터 이름이 틀려서 생긴 오류...
jsp파일에서 name 속성값으로 넘겨준 이름이랑 DAO에서 set으로 넣은 이름이 달라서 생긴 오류였음😓😓