본문 바로가기

교재 실습253

73. DataSource와 JNDI (4) - ContextLoaderListener 클래스 변경 ContextLoaderListener 클래스를 수정한다. package spms.listeners; import java.sql.SQLException; import javax.naming.InitialContext; //import java.sql.Connection; //import java.sql.DriverManager; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; //import javax.servlet.annotation.WebListener; import jav.. 2022. 7. 19.
72. DataSource와 JNDI (3) 4. 서버에서 제공하는 DataSource 사용하기 DataSource를 사용하는 이유는 서버에서 관리하기 때문에 데이터베이스에 대한 정보가 바뀌거나 JDBC 드라이버가 교체되더라도 애플리케이션에는 영향을 주지 않기 때문이다. 그런데 앞의 예제는 BasicDataSource를 사용하기 때문에, DataSource의 이점을 누리지 못했다. 이번에는 서버에서 관리하는 DataSource를 사용해 보겠다. 실무에서도 주로 이 방법을 사용한다. - 톰캣 서버에 DataSource 설정하기 톰캣 실행 환경에서 DataSource를 설정한다. 서버 제품에 따라 DataSource를 설정하는 방법이 다르니 항상 서버의 메뉴얼을 참고한다. 톰캣 실행 환경 폴더에서 context.xml 파일을 찾는다(그림 1). 서버가.. 2022. 7. 18.
71. DataSource와 JNDI (2) 3. DataSource의 적용 MemberDao 클래스에 DBConnectionPool 대신 DataSource를 적용해본다. - DataSource 구현체 준비 JDBC를 사용하려면 JDBC API에 따라 작성한 구현체, 즉 JDBC 드라이버가 필요하듯이, DataSource를 사용하려면 javax.sql 패키지의 구현체가 필요하다. 웹 브라우저로 https://commons.apache.org/ 사이트에 접속한다. 컴포넌트 목록에서 'DBCP' 링크를 클릭한다. DBPC 컴포넌트 페이지에서 왼쪽 카테고리의 'Downloads' 링크를 클릭한다(그림 2). 다운로드 페이지에서 다음 그림과 같이 파일 목록에서 'commons-dbcp2-2.9.0-bin.zip' 링크를 클릭하여 파일을 내려받는다. 다만.. 2022. 7. 17.
70. DataSource와 JNDI (1) JDK 1.4 버전부터 포함된 DataSource에 대해 배운다. DataSource는 JDBC 확장 API를 정의한 javax.sql 패키지에 들어 있다. Java EE 서버(예 : 톰캣 서버)에서 DB 커넥션 풀을 관리하는 방법에 대해 알아본다. JNDI API를 사용하여 Java EE 서버 자원에 접근하는 방법을 배운다. 1. javax.sql 확장 패키지 javax.sql 패키지는 java.sql 패키지의 기능을 보조하기 위해 만든 확장 패키지다. 서버 쪽 데이터 소스에 대한 접근을 쉽게 하고, 좀 더 다양한 방법으로 데이터를 다룰 수 있는 API를 제공한다. 이 패키지는 JDK 1.4 부터 포함되었다. Java EE 에서도 기본 패키지로 정의되어 있다. javax.sql 패키지가 제공하는 주요 .. 2022. 7. 16.
69. DB 커넥션풀 (3) 3. MemberDAO에 DB 커넥션풀 적용하기 MemberDao 클래스에 DBConnectionPool을 적용한다. - DBConnectionPool 객체를 주입하기 위한 코드 준비 MemberDao 클래스 코드를 수정한다. public class MemberDao { //Connection connection; //Connection 객체 주입(의존성 주입, 역제어) /*public void setConnection(Connection connection) { this.connection = connection; }*/ DBConnectionPool connPool; //DBConnectionPool 객체 주입 public void setDbConnectionPool(DBConnectionPool c.. 2022. 7. 14.
68. DB 커넥션풀 (2) 2. DB 커넥션풀 만들기 web05 프로젝트의 spms.util 패키지를 생성하여 DBConnectionPool 클래스를 생성한다(그림 1). package spms.util; import java.sql.Connection; import java.sql.DriverManager; import java.util.ArrayList; public class DBConnectionPool { String url; String username; String password; ArrayList connList = new ArrayList(); //Connection 객체 보관할 ArrayList //DB커넥션 생성에 필요한 값 준비 public DBConnectionPool(String driver, Strin.. 2022. 7. 13.
67. DB 커넥션풀 (1) DB 커넥션풀은 DB 커넥션 객체를 여러 개 생성하여 풀(Pool)에 담아 놓고 필요할 때 꺼내 쓰는 방식이다. 즉, 자주 쓰는 객체를 미리 만들어 두고, 필요할 때마다 빌리고, 사용한 다음 반납하는 방식을 '풀링(pooling)'이라 한다. 이렇게 여러 개의 객체를 모아둔 것을 '객체 풀(object pool)'이라고 하고, 여러 개의 DB 커넥션을 관리하는 객체를 'DB 커넥션풀'이라고 부른다. 사용이 끝난 DB 커넥션 객체는 다른 작업에서 다시 쓸 수 있도록 풀에 반환한다. 지금까지는 DB 커넥션 객체를 하나만 만들어 사용했고 테스트할 때도 잘 실행되었다. 그런데 DB 커넥션 객체를 여러 개 생성할 필요가 있을까? 그 이유는 다음 그림을 보면 알 수 있다(그림 1). 그림 1에서 DAO 1, 2, .. 2022. 7. 12.
66. ServletContextListener와 객체 공유 (3) 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 사용시 예외가 발생할 수 있기 .. 2022. 7. 11.
65. ServletContextListener와 객체 공유 (2) 2. 리스너 ServletContextListener 만들기 웹 애플리케이션의 시작과 종료 이벤트를 처리할 리스너는 ServletContextListener 인터페이스를 구현해야 한다. 다음 그림은 이번 실습에서 만들 리스너의 계층도이다(그림 1). ▶ contextInitialized() 메서드는 웹 애플리케이션이 시작될 때 호출된다. 공용 객체를 준비해야 한다면, 이 메서드에 작성하면 된다. ▶ contextDestroyed() 메서드는 웹 애플리케이션이 종료되기 전에 호출된다. 자원 해제를 해야 한다면, 이 메서드에 작성하면 된다. 클래스의 이름을 ContextLoaderListener로 정한 이유는, 나중에 스프링 프레임워크를 배울 때 좀 더 이해하기 쉽게 만들기 위함이다. 스프링 프레임워크에서도.. 2022. 7. 10.