본문 바로가기

Dev.BackEnd/Servlet&JSP

4. Model 1 에서 Model 2 까지 변화과정 2편




4. Model 1 에서 Model 2 까지 변화과정 2편

controller역할 뿐만 아니라 view 역할과 model 역할까지 모두 하는 서블릿부터 만든 다음에,

그 서블릿으로부터 기능들이 하나씩 분리되는 과정을 보이려고 한다.

Model 2
1. 값 객체 ( Value Object ) 생성하기
Member.java
VO란 값을 담는 용도로 사용하기 위한 객체를 말한다.
계층 간 또는 데이터를 전달하는데 이용하여 데이터 수송 객체(DTO)라고도 불린다.
각종 들을 갖고 있으며 get메소드와 set메소드로 이루어져 있다.
컨트롤러(Servlet)에서 생성하면 뷰(JSP)에서 그것을 참조하여 화면을 출력하는 것이다.
즉, 서블릿에서 값을 set해 놓으면, JSP에서는 값을 get하여 출력하는 것이다.


2. View 분리하기
PrintWriter 부분을 JSP파일로 빼낸다.
JSP에 데이터를 전송하기 위해 ArrayList를 구현해서,
.next( )라는 JDBC 쿼리 실행 메소드를 통해, ArrayList에 값을 넣어준다.
그리고 그 ArrayList를 request에 보관한다.
그 다음 JSP에게 출력을 위임한다.

servlet code>
1
2
RequestDispatcher rd = request.getRequestDispatcher(“/member/MemberList.jsp” );
rd.include(req, resp);
cs
어느 JSP로 위임할 지 정하고, 어떻게 위임할지 정한다.
jsp code>
1
ArrayList<Member> members = (ArrayList<Member>)request.getAttribute("members");
cs

서블릿에서는 ArrayList에 값들을 add 한 뒤 request에 setAttribute를 하고,
JSP에서는 ArrayList request getAttribute를 하고 get을 한다.
상자(request 객체)에 선물(ArrayList)을 넣고 포장(setAttribute)한 다음 선물을 보낸다.
상자를(request 객체) 받게 되면 포장을 뜯고(getAttribute) 선물(ArrayList)을 꺼내는 것과 같이
당연한 순서이다.


3. Servlet Context 활용 ( 서블릿에서 DB Connection code 빼내기 )
Servlet Context 란 웹 애플리케이션이 시작될 때 생성되어, 종료될 때까지 유지되는 객체를 말한다.
AppInitServlet.java 라는 서블릿을 생성한다.
이 서블릿에는 init( )과 destroy( )을 설정한다.

기존의 init( )의 역할은 그대로 수행해야 하므로, super.init(config)를 해준다.
그리고 init에는 DB Connection 객체를 생성하는 코드를 작성한다.
그리고 Connection 객체를 ServletContext에 conn이라는 키로 setAttribute 해준다.

destroy( )도 마찬가지 이유로 super.destroy( )를 해준다.
그리고 ServletContext에서 conn이라는 Connection 객체를 꺼내 종료시킨다.( close( ) )

코드작성을 마쳤으면, AppInitServlet의 배치정보를 xml 파일에 추가해야 한다.
클라이언트의 요청이 없어도 수행되어야 하는 서블릿이므로,
<load-on-startup>이라는 태그를 추가한다.
1
2
3
4
5
<servlet>
    <servlet-name>AppInitServlet</servlet-name>
    <servlet-class>spms.servlets.AppInitServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
cs
이렇게 해주면 MemberListServlet.java 서블릿에서 ServletContext를 conn이라는 이름을 통해 get하는 코드 말고는,
클래스 로딩 코드나 DriverManager 코드(DB connection을 준비하는 코드)는 없어도 된다.
그리고 finally에 DB 종료 코드도 없어도 된다.


4. DAO 만들기 ( MemberListServlet에 있는 데이터베이스 연동 구문 빼내기 )
모델과 컨트롤러를 분리할 차례다.
MemberListServlet에서 데이터 처리 로직을 분리하여 MemberDao.java 클래스(서블릿아님)를 정의한다.
Dao는 데이터베이스나 파일, 메모리 등을 이용하여
애플리케이션 데이터를 생성, 조회, 변경, 삭제하는 역할을 수행한다.
즉, 데이터 처리 부분을 맡아하는 것이다.
MemberListServlet에 있는 쿼리문을 빼낸다.

이 클래스에서는 ArrayList를 통해 member라는 값 객체에 접근하게 된다.
그리고 setConnection 메소드를 통해 외부로부터 Connection 객체를 주입받는다.
1
2
3
  public void setConnection(Connection connection) {
    this.connection = connection;
  }
cs

서블릿에서는 MemberDao를 new를 통해 생성한다.
그리고 set 메소드를 통해, ServletContext로 부터 꺼낸 Connection 객체를 conn이라는 키를 통해 주입한다.
1
2
MemberDao memberDao = new MemberDao();
memberDao.setConnection(conn);
cs

request에 setAttribute를 할 때, Dao에 있는 메소드를 통해 할당한다. 
1
request.setAttribute("members", memberDao.selectList());
cs






이 포스팅은 '자바 웹 개발 워크북'이라는 교재를 바탕으로 작성되었습니다. 문제가 될 시 삭제하겠습니다.

-..-