[ Servlet ] DB Driver ClassNotFound 오류

jwkwon0817·2023년 9월 1일
0

Web Back-end

목록 보기
1/26
post-thumbnail

먼저 웹 서버는 Tomcat 11을 사용했습니다. Oracle 데이터베이스를 이용해서 웹 화면에 DB 내용을 출력하는 기능을 클론 코딩하고 있었습니다. 이 코드들은 '자바 웹을 다루는 기술'이라는 책에 포함되어 있는 코드입니다.


MemberServlet.java

package com.mng.sec05.ex01;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Date;
import java.util.List;

@WebServlet("/member")
public class MemberServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        MemberDAO dao = new MemberDAO();
        List<MemberVO> list = dao.listMembers();

        out.print("<html><body>");
        out.print("<table border=1><tr align='center' bgcolor='lightgreen'>");
        out.print("<td>아이디</td><td>비밀번호</td><td>이름</td><td>이메일</td><td>가입일</td></tr>");

        for (int i = 0; i < list.size(); i++) {
            MemberVO memberVO = list.get(i);
            String id = memberVO.getId();
            String pwd = memberVO.getPwd();
            String name = memberVO.getName();
            String email = memberVO.getEmail();
            Date joinDate = memberVO.getJoinDate();
            out.print("<tr><td>" + id + "</td><td>" + pwd + "</td><td>" + name + "</td><td>" + email + "</td><td>" + joinDate + "</td></tr>");
        }
        out.print("</table></body></html>");
    }
}

MemberDAO.java

package com.mng.sec05.ex01;

import oracle.jdbc.driver.OracleDriver;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class MemberDAO {
    Statement stmt;
    Connection connection;
    
    String driver = OracleDriver.class.getName();
    String url = "jdbc:oracle:thin:@localhost:1521:XE";
    String loginId = "system";
    String loginPwd = "oracle";
    
    public List<MemberVO> listMembers() {
        List<MemberVO> list = new ArrayList<>();
        try {
            connectDB();
            
            String query = "SELECT * FROM t_member";
            System.out.println(query);
            
            ResultSet rs = stmt.executeQuery(query);
            
            while (rs.next()) {
                String id = rs.getString("id");
                String pwd = rs.getString("pwd");
                String name = rs.getString("name");
                String email = rs.getString("email");
                Date joinDate = rs.getDate("joinDate");
                MemberVO vo = new MemberVO();
                vo.setId(id);
                vo.setPwd(pwd);
                vo.setName(name);
                vo.setEmail(email);
                vo.setJoinDate(joinDate);
                list.add(vo);
            }
            
            rs.close();
            stmt.close();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return list;
    }

    private void connectDB() {
        try {
            Class.forName(driver);
            System.out.println("Oracle 드라이버 로딩 성공");
            
            connection = DriverManager.getConnection(url, loginId, loginPwd);
            System.out.println("Connection 생성 성공");
            
            stmt = connection.createStatement();
            System.out.println("Statement 생성 성공");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

MemberVO.java

package com.mng.sec05.ex01;

import java.sql.Date;

public class MemberVO {
    private String id;
    private String pwd;
    private String name;
    private String email;
    private Date joinDate;

    public MemberVO() {
        System.out.println("MemberVO 생성자 호출");
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Date getJoinDate() {
        return joinDate;
    }

    public void setJoinDate(Date joinDate) {
        this.joinDate = joinDate;
    }
}

MemberServlet에서 메인 메서드를 만들고 출력하면 잘되지만 서블릿을 이용해서 출력하려고 하면 ClassNotFound 오류가 뜹니다.

오류를 잡기 위해서 Statement 대신에 PrepareStatement를 사용해보기도 했고 ConnectionPool을 따로 만들어서 시도도 해보고 ojdbc 버전을 바꿔보기도 했지만 해결되지 않았습니다.

사실 이건 코드 상의 문제가 아니라 라이브러리가 추가가 안된 것이었습니다.

나는 그 전에 IntelliJ 라이브러리에 ojdbc11.jar 파일을 추가해서 라이브러리를 추가해줬는데도 오류가 뜬다고 생각했지만 톰캣 라이브러리에도 추가해줘야 했었습니다.

본인의 Tomcat 설치 경로에서 lib 폴더에 ojdbc11.jar 파일을 넣어주면 됩니다.

profile
SRIHS 119th SW

0개의 댓글