본문 바로가기

Dev.BackEnd/Servlet&JSP

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



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

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

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


Model 1 방식의 웹 애플리케이션 구축

1. 서블릿 작성
회원 정보를 ArrayList 형식으로 갖고 있는 서블릿을 생성한다.
MemberListServlet.java
DriverManager
1
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
cs
mysql Database와 연동할 코드이다.

executeQuery
1
2
3
4
5
6
7
8
9
conn = DriverManager.getConnection(
    "jdbc:mysql://localhost/studydb"//JDBC URL
    "study",    // DBMS 사용자 아이디
    "study");    // DBMS 사용자 암호
stmt = conn.createStatement();
rs = stmt.executeQuery( //쿼리문을 resultset으로 받는다.
    "SELECT MNO,MNAME,EMAIL,CRE_DATE" + 
    " FROM MEMBERS" +
    " ORDER BY MNO ASC");
cs
Servlet 파일에 데이터베이스에 접속하는 URL과 사용자 아이디, 사용자 암호가 모두 들어가 있다.
그리고 실행할 쿼리문까지 포함되어 있다.

PrinterWriter
1
2
3
4
5
6
7
8
9
10
11
12
PrintWriter out = response.getWriter();
    out.println("</body></html>");
    out.println("<body><h1>회원목록</h1>");
    while(rs.next()) {
    out.println(
            rs.getInt("MNO"+ "," +
            rs.getString("MNAME"+ "," +
            rs.getString("EMAIL"+ "," + 
            rs.getDate("CRE_DATE"+ "<br>"
        );
    }
    out.println("</body></html>");
cs
쿼리문 실행 결과를 rs.next( )라는 구문을 통해서 실행시켜준다.
그러면서 PrinterWriter를 통해서, html 코드를 출력하여 웹 페이지 화면을 렌더링 하는 코드도 포함되어 있다.

.close( );
1
2
3
try {if (rs != null) rs.close();} catch(Exception e) {}
try {if (stmt != null) stmt.close();} catch(Exception e) {}
try {if (conn != null) conn.close();} catch(Exception e) {}
cs
Database를 사용하기 위해 '열었으면' 사용을 마치고 닫아줘야 한다.
때문에, close( ) 메소드도 포함되어 있다.



2. 서블릿 초기화 매개변수 xml 파일로 빼내기
MemberListServlet.java
web.xml
xml에 driver 명으로 url, username, password를 mapping 시켜둔다.
이렇게 하면 MemberListServlet.java 파일에
DB 개인정보에 대한 코드가 빠지고 서블릿에서 xml에 초기화 변수를 요청한다.
이 방법을 클래스 로딩이라고 한다.
인자값으로 클래스 이름을 넘기면 해당 클래스를 찾아 로딩한다.
클래스 이름은 반드시 패키지 이름을 포함해야 한다.
1
Class.forName(this.getInitParameter(“driver”));
cs
위 코드가 그 역할을 대신 수행하게 된다.
xml>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    <context-param>
        <param-name>driver</param-name>
        <param-value>com.mysql.jdbc.Driver</param-value>
    </context-param>
    <context-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql://localhost/studydb</param-value>
    </context-param>
    <context-param>
        <param-name>username</param-name>
        <param-value>study</param-value>
    </context-param>
    <context-param>
        <param-name>password</param-name>
        <param-value>study</param-value>
    </context-param>
cs



3. 컨텍스트 초기화 매개변수 xml로 빼내기
컨텍스트 초기화 매개변수를 web.xml 파일에 몰아넣는다.
위 서블릿 초기화 매개변수는 각각의 서블릿 마다 설정을 해줘야 하는데,
컨텍스트 초기화 매개변수는 서블릿에서 이 컨텍스트 초기화 매개변수를 사용하겠다고 하면  
하나 하나 초기화 시켜줄 필요가 없다.
1
2
ServletContext sc = this.getServletContext( );
Class.forName(sc.getInitParameter(“driver”));
cs
이렇게 하면 ServletContext에서 driver라는 이름의 초기화 매개변수를 클래스 로딩한다.
cf> ServletContext는 일종의 데이터 저장소이다.


4. 필터 사용하기
CharacterEncodingFilter.java
필터는 서블릿 실행 전후에 어떤 작업을 하고자 할 때 사용하는 기술이다.
Filter라는 인터페이스를 구현하여 서블릿마다 중복적으로 들어가야하는 코드를 빼준다.

컨텍스트 초기화 매개변수를 빼내는 것은 일종의 데이터를 xml 파일로 빼내는 것이고,
필터는 서블릿으로 공통적인 메소드를 빼내는 것이라고 할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class CharacterEncodingFilter implements Filter{
    FilterConfig config;
    
    @Override
    public void init(FilterConfig config) throws ServletException {
        this.config = config;
    }
    
    @Override
    public void doFilter(
            ServletRequest request, ServletResponse response,
            FilterChain nextFilter) throws IOException, ServletException {
        request.setCharacterEncoding(config.getInitParameter("encoding"));
        nextFilter.doFilter(request, response);
    }
 
    @Override
    public void destroy() {}
}
cs
init( ), destroy( ), 그리고 doFilter 메소드로 나뉜다.
서블릿의 생성주기에서 초기화되고 역할을 수행하고 소멸하는 단계에서,
생성된 다음 service( )를 본격적으로 시작하기 전에, doFilter( )메소드가 호출되는 것이다.



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

-..-