[jsp/servlet] jsp 파일을 WEB-INF 폴더 안에 위치 후 JDBC 오류

sun·2025년 3월 1일
0

이슈

목록 보기
3/4

✒️ jsp 파일들을 WEB-INF 폴더 안으로 위치시키는 이유

1. 직접 접근 제한 (Access Restriction)

WEB-INF 폴더는 클라이언트(브라우저)에서 직접 접근할 수 없는 보호된 경로.
http://localhost:8080/WEB-INF/index.jsp 로 접근해도 404 발생.
jsp 파일을 WEB-INF 폴더 안에 두면 클라이언트가 직접 접근하지 못하도록 보호 가능.
즉, servlet을 거쳐야만 접근이 가능

2. 보안 강화 (Security)

jsp 파일을 WEB-INF 폴더 밖에 두면 클라이언트가 직접 접근 가능해서 jsp 내부에서 처리하는 로직이 노출될 가능성 있음.
민감한 페이지(관리자페이지 같은..)는 WEB-INF 폴더 안에 두는 것이 안전.

1. 나의 코드

servlet --> service --> dao
요청이 들어오면 JDBC 드라이버 로드 후 해당 쿼리 수행

// 예시 - BoardDAO.java
	/**
     * 게시물 총 개수
     * @return
     * @throws SQLException
     */
    public int selectCnt() throws SQLException {
        int cnt = 0;
        JdbcUtil jdbcUtil = new JdbcUtil();

        try(Connection conn = jdbcUtil.getConnection();
            Statement stmt = conn.createStatement();) {
            String sql = "SELECT COUNT(*) FROM BOARD";

            try(ResultSet rs = stmt.executeQuery(sql)) {
                if (rs.next()) {
                    cnt = rs.getInt(1);
                }
            }
        }
        return cnt;
    }
// 예시 - JdbcUtil.java
/**
 * JDBC 공통화
 */
public class JdbcUtil {
    private final String DB_URL = "jdbc:mysql://localhost:3306/ebrainsoft_study";
    private final String USER = "ebsoft";
    private final String PASS = "ebsoft";

    private static JdbcUtil jdbcUtil;

    public static JdbcUtil getJdbcUtil() throws ClassNotFoundException {
        if (jdbcUtil == null) {
            Class.forName("com.mysql.cj.jdbc.Driver");
            jdbcUtil = new JdbcUtil();
        }
        return jdbcUtil;
    }

    public Connection getConnection() throws SQLException {
        return DriverManager.getConnection(DB_URL, USER, PASS);
    }
}

2. 나의 문제

Class.forName() 호출의 부적절성

Class.forName("com.mysql.cj.jdbc.Driver")는 JDBC 드라이버를 메모리에 로드하는 역할을 한다.
이 코드가 각 DAO의 메서드에서 매번 호출하면 매번 데이터 베이스 연결을 시도할 때마다 드라이버를 로드한다.
이는 불필요한 리소스 낭비이며 성능을 저하시킬 수 있다.
일반적으로 JDBC 드라이버 로딩은 애플리케이션 시작 시 한번만 수행해야한다.

3. 해결방안

1) web.xml 에서 <load-on-startup> 설정 추가

servlet이 시작될 때 JDBC 드라이버를 미리 로드하도록 설정해야한다.

<!-- web.xml에 아래 코드 추가 -->
<servlet>
    <servlet-name>DBInitServlet</servlet-name>
    <servlet-class>com.study.connection.DBInitServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
  • <servlet> : 서블릿을 정의하는 부분. 서블릿은 클라이언트의 요청을 처리하는 java 클래스
  • <servlet-name> : 서블릿의 이름을 정의. 서블릿을 식별하는 데 사용.
  • <servlet-class> : 서블릿 클래스의 전체 경로를 지정. 이 클래스는 서블릿 인터페이스를 구현하여 요청을 처리하는 로직을 담고있음.
  • <load-on-startup> : 서블릿이 언제 로드될지 지정. 값이 1이면 웹 애플리케이션이 시작될 때 서블릿을 초기화하도록 지정. 즉, 서버가 시작할 때 자동으로 이 서블릿을 로드하고 초기화. 값이 0이면 서블릿은 클라이언트 요청이 있을 때 로드.

2) JDBC 드라이버 설정

서블릿이 서버 시작 시 실행되면서 JDBC 드라이버가 미리 로드됨.
"No suitable driver" 에러 해결.

package com.example;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

public class DBInitServlet extends HttpServlet {
    @Override
    public void init() throws ServletException {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("MySQL JDBC Driver Loaded Successfully!");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

결론 : DAO 파일에서 JDBC driver load 하면 안된다.

profile
Please, Steadily

0개의 댓글

관련 채용 정보