'회원 목록 조회' 서블릿 만들기

src/spms/servlets/MemberListServlet.java

@WebServlet("/member/list")
public class MemberListServlet extends GenericServlet{

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse)
            throws ServletException, IOException {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {
            // 1. 사용할 JDBC 드라이버를 등록
            DriverManager.registerDriver(new com.mysql.jdbc.Driver());

            // 2. 드라이버를 사용하여 MySQL 서버와 연결
            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost/practicedb",  //JDBC URL
                    "study",  // DBMS 사용자 아이디
                    "1111");  //DBMS 사용자 암호

            // 3. 커넥션 객체로부터 SQL를 던질 객체를 준비
            stmt = conn.createStatement();

            // 4. SQL를 던지는 객체를 사용하여 서버에 질의
            rs = stmt.executeQuery(
                    "SELECT MNO,MNAME,EMAIL,CRE_DATE" +
                            " FROM MEMBERS" +
                            " ORDER BY MNO ASC");

            servletResponse.setContentType("text/html; charset=UTF-8");
            PrintWriter out = servletResponse.getWriter();
            out.println("<html><head><title>회원목록</title></head>");
            out.println("<body><h1>회원목록</h1>");

            // 5. 서버에서 가져온 데이터를 사용하여 HTML 만들어서 웹 브라우저로 출력
            while (rs.next()) {
                out.println(
                        rs.getInt("MNO") + "," +
                                rs.getString("MNAME") + "," +
                                rs.getString("EAMIL") + "," +
                                rs.getDate("CRE_DATE") + "<br>"
                );
            }
            out.println("</body></html>");
        } catch (Exception e ){
            throw new ServletException(e);
        } finally {
            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) {}
        }
    }
}

데이터베이스 관련 객체의 참조 변수 선언

service() 에서 처음 부분은 JDBC 객체 주소를 보관할 참조 변수의 선언이다.

Connection conn = null;

Statement stmt = null;

ResultSet rs= null;

DriverManager가 사용할 JDBC 드라이버 등록

DriverManager.registerDriver(new com.mysql.jdbc.Driver());

MySQL 드라이버의 경우 com.mysql.jdbc.Driver 클래스가 해당 인터페이스를 구현한 클래스이다. registerDriver()를 호출하여 구현체를 등록한다. 이 클래스는 MySQL 드라이버 파일(web/lib/mysql-connector-java-5.1.26-bin.jar)안에 있다.

데이터베이스에 연결

2번과 같이 DriverManager의 getConnection()을 호출하여 MySQL 서버에 연결할 수 있다.

SQL 실행 객체 준비

3번과 같이 Connection 구현체를 이용하여 SQL 문을 실행할 객체를 준비한다. createStatement()가 반환하는 것은 java.sql.Statement 인터페이스의 구현체이다. 이 객체를 통해 데이터베이스에 SQL문을 보낼 수 있다. 이 인터페이스에는 데이터베이스에 질의하는 데 필요한 메서드가 정의되어 있다.

  • executeQuery() : 결과가 만들어지는 SQL 문을 실행할 때 사용한다. (SELECT)
  • executeUpdate() : DML과 DDL 관련 SQL 문을 실행할 때 사용한다. (DDL = INSERT ..., DML = CREATE...)
  • execute() : SELECT, DML, DDL 명령문에 모두 사용한다.
  • executeBatch() : addBatch()로 등록한 여러 개의 SQL 문을 한꺼번에 실행할 때 사용한다.

데이터베이스에 SQL 문을 보내기

4번과 같다.

SELECT 결과 가져오기

5번과 같다. ResultSet 객체를 통해 next()를 호출하면 서버에서 레코드(Record)를, 다른 말로 '행(row)'을 가져온다. 서버에서 받은 레코드는 ResultSet 객체에 보관된다. next()는 서버에서 레코드를 받으면 true, 없으면 false를 반환한다.

JDBC 프로그래밍의 마무리

JDBC 프로그래밍을 할 때 주의할 점은 정상적으로 수행되든 오류가 발생하든 간에 반드시 자원 해제를 수행하는 것이다. finally 블록에서 수행한다. 자원을 해제할 때는 역순으로 처리한다.

서블릿 배치 정보 설정

@WebServlet 애노테이션으로 서블릿의 배치 정보를 설정한다. MemberListServlet의 URL 패턴 값은 '/member/list'로 설정한다.

MySQL connection 문제가 발생하는 경우

conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost/practicedb?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC")

JDBC url 뒤에 &useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC 를 삽입한다.

'회원 목록 조회' 서블릿 테스트

Chapter04(1)-1