WEB-INF 폴더는 클라이언트(브라우저)에서 직접 접근할 수 없는 보호된 경로.
http://localhost:8080/WEB-INF/index.jsp 로 접근해도 404 발생.
jsp 파일을 WEB-INF 폴더 안에 두면 클라이언트가 직접 접근하지 못하도록 보호 가능.
즉, servlet을 거쳐야만 접근이 가능
jsp 파일을 WEB-INF 폴더 밖에 두면 클라이언트가 직접 접근 가능해서 jsp 내부에서 처리하는 로직이 노출될 가능성 있음.
민감한 페이지(관리자페이지 같은..)는 WEB-INF 폴더 안에 두는 것이 안전.
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);
}
}
Class.forName("com.mysql.cj.jdbc.Driver")
는 JDBC 드라이버를 메모리에 로드하는 역할을 한다.
이 코드가 각 DAO의 메서드에서 매번 호출하면 매번 데이터 베이스 연결을 시도할 때마다 드라이버를 로드한다.
이는 불필요한 리소스 낭비이며 성능을 저하시킬 수 있다.
일반적으로 JDBC 드라이버 로딩은 애플리케이션 시작 시 한번만 수행해야한다.
<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이면 서블릿은 클라이언트 요청이 있을 때 로드.서블릿이 서버 시작 시 실행되면서 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 하면 안된다.