3. 기존의 서블릿 변경하기
기존의 서블릿을 변경한다. 직접 MemberDao 클래스 객체를 생성하는 대신, ServletContext에 저장된 DAO 객체를 꺼내 쓰는 것으로 변경한다.
MemberListServlet 클래스를 다음과 같이 변경한다.
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
//데이터베이스 관련 코드를 위한 try ~ catch 블록 (JDBC API 사용시 예외가 발생할 수 있기 때문)
try {
//JDBC 드라이버를 로딩하고 데이터베이스 연결 시 컨텍스트 초기화 매개변수에서 해당 정보 가져와 처리.
ServletContext sc = this.getServletContext();
//ServletContext에 저장된 DB 커넥션 사용
/*conn = (Connection)sc.getAttribute("conn");
MemberDao memberDao = new MemberDao();
memberDao.setConnection(conn);*/ //셋터 메서드 호출
//ServletContext에 저장된 DAO 객체 사용
MemberDao memberDao = (MemberDao)sc.getAttribute("memberDao");
//DAO의 selectList() 메서드 반환값을 request에 담기
request.setAttribute("members", memberDao.selectList());
response.setContentType("text/html; charset=UTF-8");
//JSP로 출력을 위임한다.
RequestDispatcher rd = request.getRequestDispatcher("/member/MemberList.jsp");
rd.include(request, response); //인클루딩
} catch (Exception e) {
request.setAttribute("error", e); //예외 객체를 request에 보관
RequestDispatcher rd = request.getRequestDispatcher("/Error.jsp");
rd.forward(request, response); //포워딩
} finally {
try {if (rs != null) rs.close();} catch(Exception e) {}
try {if (stmt != null) stmt.close();} catch(Exception e) {}
}
}
- 기존 코드 삭제
ServletContext로부터 DB 커넥션 객체를 뽑아 오는 부분을 제거한다. MemberDao 객체를 생성하는 코드도 제거한다. 또한 DB 커넥션 객체를 주입하는 MemberDao 객체의 setConnection() 메서드도 삭제한다.
//conn = (Connection)sc.getAttribute("conn");
//MemberDao memberDao = new MemberDao();
//memberDao.setConnection(conn);
대신, MemberDao 객체는 ServletContext로부터 꺼낸다.
MemberDao memberDao = (MemberDao)sc.getAttribute("memberDao");
이렇게 ServletContext에 들어 있는 MemberDao 객체를 재사용하게 되면, 객체를 생성할 필요가 없기 때문에 실행 속도가 빨라지고, 가비지(garbage)가 발생하지 않는다.
4. AppInitServlet 클래스 제거
AppInitServlet 클래스가 하던 일은 ContextLoaderListener 클래스로 이관되었다. AppInitServlet 클래스는 더이상 서블릿으로서 역할을 수행할 필요가 없다.
web.xml 파일에서 AppInitServlet 클래스 배치 정보를 제거한다. 또는 다음과 같이 XML 주석(<!-- -->)으로 막아도 된다.
<!-- 서블릿 선언 -->
<!--
<servlet>
<servlet-name>AppInitServlet</servlet-name>
<servlet-class>spms.servlets.AppInitServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
-->
톰캣 서버를 다시 시작하고 회원 목록 기능을 확인한다(그림 1).

잘 실행된다. 이전과 달라진 기능은 없고 내부 구조가 바뀌었을 뿐이다. 좀 더 유지 보수가 쉬운 구조로 바뀐 것이다.
MemberListServlet 클래스 뿐만 아니라 MemberAddServlet 클래스, MemberUpdateServlet 클래스, MemberDeleteServlet 클래스, LogInServlet 클래스도 ServletContext에 저장된 DAO 객체를 꺼내 쓰는 구조로 변경했다.
참고도서 : https://freelec.co.kr/book/1674/
[열혈강의] 자바 웹 개발 워크북
[열혈강의] 자바 웹 개발 워크북
freelec.co.kr
'교재 실습 > 자바 웹 개발 워크북' 카테고리의 다른 글
| 68. DB 커넥션풀 (2) (1) | 2022.07.13 |
|---|---|
| 67. DB 커넥션풀 (1) (0) | 2022.07.12 |
| 65. ServletContextListener와 객체 공유 (2) (0) | 2022.07.10 |
| 64. ServletContextListener와 객체 공유 (1) (0) | 2022.07.09 |
| 63. DAO 만들기 (2) (1) | 2022.07.07 |
댓글