콘트롤 서블릿클래스와 DAO 클래스에서 매번 database 연동 Connection 객체나 DAO 객체를 생성하면 많은 가비지(garbage)가 생성되서 반응시간이 길어지는 단점이 있습니다.


그래서 DAO 처럼 여러 서블릿에서 사용하는 객체는 서로 공유하게 하는것이 좋습니다.

그래서  웹 어플리케이션이 시작될때 이러한 객체들을 미리 준비하고 공유할 수 있게 하는것을 설명하겠습니다. 





1

서블릿 컨테이너는 웹 애플리케이션에서 사건(웹 애플리케이션 시작or 종료)이 발생하면

웹 애플리케이션에 등록된 이벤트 리스너에서 아래와 같은 관련된 메소드를 호출합니다.


웹 애플리케이션이

시작되면 contextInitialized() 함수가 실행되고

종료되면 contextDestroyed() 함수가 실행됩니다.

이런 호출되는 함수의 규칙을 정의한게 ServletContextListener 인터페이스 입니다.

그래서 아래와 같이 








3번

ContextLoaderListener 클래스를 만들고 ServletContextListener 인터페이스를 구현합니다.


그럼 애플리케이션이 시작(사건발생)될때 처리해주고 싶은 부분을

ContextLoaderListener 클래스에서 contextInitialized() 함수가 실행될거고

그 함수 안에서 원하는 처리를 해주면 애플리케이션이 실행될때마다 원하는 처리가 실행되겠죠

원하는 처리는Dao 객체와 같은 서블릿들이 공유하는 객체를 준비해 할겁니다.


리스너를 컨테이너에 배치 해야 하는데 방법은 

아래 이미지처럼 


<listener>

 <listener-class>페키지명.클래스명</listener-class>

<listener>

처럼 선언해 주거나


ContextLoaderListener 클래스에서 애노테이션 @WebListener 를 사용해도 됩니다.




우선 ContextLoaderListener 클래스를 만들고 servletContextListener 인터페이스를 구현합니다.


------------------------------------------

 @Override

  public void contextInitialized(ServletContextEvent event) {

    try {

      ServletContext sc = event.getServletContext();


      Class.forName(sc.getInitParameter("driver"));

      conn = DriverManager.getConnection(

          sc.getInitParameter("url"),

          sc.getInitParameter("username"),

          sc.getInitParameter("password"));


      MemberDao memberDao = new MemberDao();

      memberDao.setConnection(conn);


      sc.setAttribute("memberDao", memberDao);


    } catch(Throwable e) {

      e.printStackTrace();

    }

  }

--------------------------------
오버라이드 받은 contextInitialized() 함수안에 위 코드처럼 데이터베이스 연동과 DAO 객체를 준비합니다. 
servletContext 저장소인 sc 객체에 저장을 하면 서블릿 클래스에서 사용할 수 있습니다.

그럼 사용할 서블릿 클래스에서

ServletContext sc = this.getServletContext();

MemberDao memberDao = (MemberDao)sc.getAttribute("memberDao");


를 사용하여 리스너에서 Connection 객체를 Dao(MemberDao)에 담은 Dao 객체를

꺼내 쓸 수 있습니다.


하지만 리스너에서 만든 공유객체는 하나의 Connection 객체에서 롤백해줘야 하기 때문에
한곳에서 롤백이 일어나면 다른 모든 작업도 롤백이 되는 문제가 있습니다.

이런 문제를 해결하기 위한것이 DB 커넥션풀입니다.















+ Recent posts