Cannot invoke "java.sql.Connection.prepareStatement(String)" because "conn" is null 문제 ) 자바, 톰캣

konut ko·2023년 5월 24일
1

ERROR & ETC...

목록 보기
5/7
post-thumbnail

JDBC JSP 연결 이슈

배경

webapp/JDBC_EL_JSTL.jsp에서 JavaResources에 있는 dao.getEmpAllList()함수를 호출하여 emp데이터들을 불러오는 상황

이슈


No suitable driver found for jdbc:oracle:thin:@localhost:1521:xe >> 적절한 드라이버 못찾겠다.
Cannot invoke "java.sql.Connection.prepareStatement(String)" because "conn" is null >> 커넥션이 null값이다.
[ ] >> 내가 view에 뿌리려던 데이터 객체를 담은 배열이 빈배열로 나옴.

이슈 요약

1) webapp에서 javaResources에 있는 함수를 호출하면
그 함수가 db connection을 하는 singletonhelper 함수를 부르고
singletonhelper가 db연결을 생성해야하는데 그게 안되는 상태.
conn = SingletonHelper.getConnection("oracle");
~
2) DriverManager로 직접 연결을 생성해도 마찬가지로 연결이 안되는 상태.
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhos....

해결법 & 원인

Class.forName("oracle.jdbc.OracleDriver");
위 코드를 추가하면 해결됨.
위 코드는 그냥 java프로젝트에서는 클래스를 알아서 찾아주기 때문에 명시하지 않아도 되지만 webapp에서 javaResource에 있는 함수를 호출(또는 db 연결을 생성하는 코드를 실행)하는 상황에서는 멍청한 톰캣이 알아서 찾지를 못하고 길을 잃어버리기 때문에 꼭 써주어야한다.
즉 Class.forName("oracle.jdbc.OracleDriver");이코드를 적지않고 conn을 한 것이 원인!!

<%@page import="kr.or.kosa.dto.Emp"%>
<%@page import="java.util.*"%>
<%@page import="kr.or.kosa.dao.EmpDao"%>
<%@page import="kr.or.kosa.util.SingletonHelper"%>
<%@page import="java.sql.Connection"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
<% 
	EmpDao dao = new EmpDao();
	List<Emp> emplist = dao.getEmpAllList();
	request.setAttribute("list", emplist);
	System.out.print(emplist);
%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Insert title here</title>
	<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
	<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-Fy6S3B9q64WdZWQUiU+q4/2Lc9npb8tCaSX9FK7E8HnRr0Jz8D6OP9dO5Vg3Q9ct" crossorigin="anonymous"></script>
	
</head>
<body>
	<h3>emp table</h3>
	<table class="table table-striped">
	  <thead>
	    <tr  class="table-primary">
	      <th scope="col">#</th>
	      <th scope="col">empno</th>
	      <th scope="col">ename</th>
	      <th scope="col">job</th>
	      <th scope="col">sal</th>
	      <th scope="col">hiredate</th>
	    </tr>
	  </thead>
	  <tbody>
	  		<c:forEach var="emp" items="${requestScope.list}" varStatus="status">
			    <tr>
			      <th scope="row">${status.count}</th>
			      <td>${emp.empno}</td>
			      <td>${emp.ename}</td>
			      <td>${emp.job}</td>
			      <td>${emp.sal}</td>
			      <td>${emp.hiredate}</td>
			    </tr>
				
			</c:forEach>
	  </tbody>
	</table>
</body>
</html>

해결하니 좋구나~!

설명

자바 JDK JRE 차이점








profile
보초딩코라 틀린 내용 있을 수도 있습니다. 댓글 지적 환영

0개의 댓글