1. 경로 [/day039]의 컨텍스트 내의 서블릿 [FrontController]을(를) 위한 Servlet.service() 호출이, 근본 원인(root cause)과 함께, 예외 [서블릿 실행이 예외를 발생시켰습니다.]을(를) 발생시켰습니다.
java.lang.Error: Unresolved compilation problem: The method getAction(String) is undefined for the type ActionFactory
에러난 이유 : ActionFactory 안에 getAction(String commend)가 없어서

해결 : ActionFactory 에 getAction(String commend) 를 추가한다
// ★겟 액션 만들기
public Action getAction(String commend) {
return map.get(commend);
}
2. ClassNotFoundException : com.google.gson.Gson
에러 사유 : 서버에 gson 라이브러리가 없어서

해결 : 서버에 gson 추가

3. NullPointException : Cannot invoke "controller.common.Action.execute
사유 : 액션이 널이어서 생긴 오류다 즉 액션에 주어가 없다는 뜻이다 이 과제를 실행하는 내내 만났던 오류다

에러해결을 위해 체크리스트
1. ActionFactory에 오타는 없는가? 또는 해당 액션 자바파일과 매핑이 잘되어있는가?
ActionFactory
map.put("/updateTitle.do", new UpdateTitleAction());
/로 매핑
빼먹지않도록 주의
2. 해당 액션 자바파일에 오타/오류는 없는가?
ActionForward forward = new ActionForward();
if(boardDAO.update(boardDTO)){// 성공시
forward.setPath("mainPage.do");
forward.setRedirect(true);
}
else{
request.setAttribute("msg","제목 변경 실패...");
request.setAttribute("location", "mainPage.do");
forward.setPath("messege.jsp");
forward.setRedirect(false);
//out.println("<script>alert('제목 변경 실패...');
//location.href='controller.jsp?command=MAINPAGE';</script>");
}
return forward;
}
특히 forward.setRedirect 가 true 인지 false 인지 잘 판단해야한다
true냐 flase냐 = 포워드냐 리다이렉트냐를 결정하는것이다
path가 있으면 true여도 이동은 한다!!
3. 해당 액션의 JSP파일에 오타/오류는 없는가?
<form name="checkForm" action="updateTitle.do" method="POST">
<input type="hidden" name="bid" value="${board.bid}">
<table border="1">
<tr>
<td>글 번호</td><td>제목</td><td>내용</td><td>작성자</td>
</tr>
<tr>
<td>${board.bid}</td><td><input type="text" name="title" value="${board.title}" required></td>
<td>${board.content}</td>
<td><c:if test="${empty board.writerName}">
탈퇴한 사용자
</c:if>
<c:if test="${not empty board.writerName}">
${board.writerName}
</c:if></td>
</tr>
<c:if test="${not empty userInfo and (userMrole eq 'ADMIN' or userInfo eq board.writer)}">
<tr>
<td colspan="4" align="right"><input type="submit" value="제목 변경">
<input type="button" value="글 삭제" onclick="del()"></td>
</tr>
</c:if>
</table>
</form>
특히 폼태그 액션에 제대로된 위치가 매핑되어있는지 확인해야한다
여기까지 확인해서 해결하면 잘실행된다!
4.Uncaught TypeError: Cannot set properties of undefined (setting 'value')
객체가 정의되지 않은 상태에서 속성을 설정하려고 하는 경우거나 객체의 중첩된 속성을 설정하려는데 중간 단계의 객체가 정의되지 않은 경우에 발생하는 에러이다


해결방법
command 기반
controller.jsp?command=deleteBoard
→ controller.jsp 내부에서 command 값을 보고 if문 else로 처리했음.
Factory + FrontController 기반
deleteBoard.do
→ URL 자체가 "명령"이다
→ FrontController가 URL 읽고 Factory에서 찾아 Action 실행.
그래서 hidden input / command 변수 / submit 조작 이런 동작이 전부 불필요해짐.
✨ 그래서 바꿔야 하는 코드
❌ 기존 (controller.jsp 방식)
document.checkForm.command.value = "deleteBoard.do";
document.checkForm.submit();
⭕ 변경 (Factory 패턴 방식)
location.href = "deleteBoard.do?bid=${board.bid}";
➡ 이 한 줄로 "삭제 요청" + "글번호 전달" 둘 다 해결됨.
5. ORA-01400 : 삽입할 값이 없습니다

INSERT INTO REPLY VALUES((SELECT NVL(MAX(RID),10000) FROM REPLY)+1,?,?,?)
현재 insert 문이 받아야하는 파라미터는 3개인데 내가 작성한 코드에는 파라미터로 받아야하는 조건들이 몇개 빠져있다
ReplyDAO replyDAO = new ReplyDAO();
ReplyDTO replyDTO = new ReplyDTO();
// 글번호만 저장됨
replyDTO.setBid(Integer.parseInt(request.getParameter("bid")));
그결과
INSERT INTO REPLY VALUES(10001, NULL, NULL, 1006);
리플테이블 컬럼을 보면
CONTENT VARCHAR(30) NOT NULL
null이면 안된다는 제약조건이 있음
따라서 null이면 안되는데 왜 null줘? 하고 에러가 나버린것이다
DB 문제도 아니고 쿼리 문제도 아니고
InsertReplyAction에서 DTO 값을 제대로 안 넣은 게 원인이었음.
그래서 해결 방법은 InsertReplyAction에 내용과 작성자를 넣어서수정해주면 잘 돌아간다
//댓글 달려면 DTO DAO있어야함
ReplyDAO replyDAO = new ReplyDAO();
ReplyDTO replyDTO = new ReplyDTO();
//내용, 글번호 가져오기
replyDTO.setContent(request.getParameter("content"));
replyDTO.setWriter(request.getParameter("writer"));
//글번호 가져와서 형변환 해주기
replyDTO.setBid(Integer.parseInt(request.getParameter("bid")));'🐢🐢꼬부기 LV.2 | 실습•에러 > 🛡️껍질에 숨기(에러해결)' 카테고리의 다른 글
| 카카오 로그인 API 자바로직 오류 해결 (0) | 2025.11.29 |
|---|---|
| 카카오 로그인 API 연동 오류 정리 (0) | 2025.11.28 |
| 서블릿경로 ClassNotFoundExection 해결 (0) | 2025.11.27 |
| 📌 회원가입 기능 구현 중 발생한 에러 & 해결 과정 정리 (0) | 2025.11.25 |
| 절대 URI인 [http://java.sun.com/jsp/jstl/core]을(를), web.xml 또는 이 애플리케이션과 함께 배치된 JAR 파일 내에서 찾을 수 없습니다. 에러 해결 (0) | 2025.11.25 |