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.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 서버에 연결할 수 있다.
3번과 같이 Connection 구현체를 이용하여 SQL 문을 실행할 객체를 준비한다. createStatement()가 반환하는 것은 java.sql.Statement 인터페이스의 구현체이다. 이 객체를 통해 데이터베이스에 SQL문을 보낼 수 있다. 이 인터페이스에는 데이터베이스에 질의하는 데 필요한 메서드가 정의되어 있다.
4번과 같다.
5번과 같다. ResultSet 객체를 통해 next()를 호출하면 서버에서 레코드(Record)를, 다른 말로 '행(row)'을 가져온다. 서버에서 받은 레코드는 ResultSet 객체에 보관된다. next()는 서버에서 레코드를 받으면 true, 없으면 false를 반환한다.
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 를 삽입한다.