배경
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>
해결하니 좋구나~!