JSP 게시판 만들기 - 구현 (MySQL과의 연동)
게시판의 데이터를 불러오거나 저장하기 위해서는 데이터베이스가 필요하다. 지금 MySQL을 사용해서 데이터를 저장하게 되는 데 이러한 데이터베이스와의 접속 후 질의문을 통해 데이터를 얻는 과정을 알아보자. 목록, 보기, 수정, 삭제, 등록 등 공통된 부분과 차이점에 대해 알아볼 것이다.
MySQL Connector 라이브러리 추가
이전에도 설명했지만 데이터베이스와 연동하기 위해서는 커넥터 라이브러리가 필요하다. 어떠한 데이터베이스를 접속하던 지 꼭 필수 파일인데 해당 데이터베이스 사이트에서 받을 수 있다.
http://dev.mysql.com/downloads/connector/
다양한 언어별로 커넥터를 제공해 준다. 우린 자바를 하니까~
ZIP 파일로 된 파일을 Download!
로그인 하지 않고 다운로드
다운로드가 완료된 파일을 압축풀면 아래와 같이 커넥터 라이브러리 파일이 있다. 이 파일은 *.jar 파일로 되어 있다.
이 파일을 프로젝트 WebContent/WEB-INF/lib 디렉토리에 넣자. 이 lib 디렉토리는 library 의 약자로, 자주 사용되는 모듈화된 파일들을 모아둔다. 여기에 있는 라이브러리를 웹 프로젝트내에서 쉽게 빼다 쓸 수 있게 된다.
Tip - jar 파일이란?
Java Archive 의 약어로, 자바프로그램 즉 클래스파일들이 뭉쳐있는 압축된 파일이다. 이 압축은 압축 프로그램 (알집, 빵집 등)으로 압축 및 압축을 풀 수 있다. 주로 사용하는 클래스파일들을 압축하여 lib 디렉토리에 넣은 후 사용하게 된다. 대부분의 프레임워크 (Spring, iBatis, Struts 등)들이 이런 *jar파일 형태로 배포되어 사용되어진다.
JSP내에서 MySQL과 연동
데이터베이스 관련 클래스들을 사용해야 하기 때문에 사용할 클래스들이 있는 패키지를 불러오자. 위에서 말한 *.jar 파일들이 있는 위치를 불러오는 것이다.
// java.sql 패키지 안에 있는 모든 클래스들을 IMPORT 시키는 의미 <%@ page import="java.sql.*" %>
|
목록조회 (SELECT) 에 대한 예제
// 데이터베이스 접속을 위한 클래스 Connection conn = null; // 접속 후 질의문을 실행시킬 클래스 PreparedStatement pstmt = null; // 질의문에 대한 결과값이 있는 클래스 ResultSet rs = null; try { // MySQL Driver 를 불러 들인다. Class.forName("com.mysql.jdbc.Driver"); // 데이터베이스 커넥션을 위한 정보를 인자로 넘기며 커넥션을 얻는다. conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/stone", "root", "1234"); // 커넥션 객체를 얻은 후 질의문을 데이터베이스에 요청 한다. pstmt = conn.prepareStatement("SELECT NUM, SUBJECT, WRITER FROM BOARD"); // 요청한 질의문을 실행 후 결과값을 받는다. rs = pstmt.executeQuery(); while(rs.next()) { // 검색된 게시물의 결과값을 표시 } // try 문 내에서 예외상황이 발생 했을 시 실행 } catch (Exception e) { e.printStackTrace(); // try, catch 문 실행 완료 후 실행되는 데 사용객체들을 닫아준다. } finally { if (rs != null) rs.close(); if (pstmt != null) pstmt.close(); if (conn != null) conn.close(); }
|
상세조회 (SELECT) 에 대한 예제
// 데이터베이스 접속을 위한 클래스 Connection conn = null; // 접속 후 질의문을 실행시킬 클래스 PreparedStatement pstmt = null; // 질의문에 대한 결과값이 있는 클래스 ResultSet rs = null; try { // MySQL Driver 를 불러 들인다. Class.forName("com.mysql.jdbc.Driver"); // 데이터베이스 커넥션을 위한 정보를 인자로 넘기며 커넥션을 얻는다. conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/stone", "root", "1234"); // 커넥션 객체를 얻은 후 질의문을 데이터베이스에 요청 한다. pstmt = conn.prepareStatement("SELECT * FROM BOARD WHERE NUM = ?"); // 값을 바인딩 pstmt.setString(1, num); // 요청한 질의문을 실행 후 결과값을 받는다. rs = pstmt.executeQuery(); rs.next(); // try 문 내에서 예외상황이 발생 했을 시 실행 } catch (Exception e) { e.printStackTrace(); // try, catch 문 실행 완료 후 실행되는 데 사용객체들을 닫아준다. } finally { if (rs != null) rs.close(); if (pstmt != null) pstmt.close(); if (conn != null) conn.close(); }
|
등록 (INSERT) 에 대한 예제
// 데이터베이스 접속을 위한 클래스 Connection conn = null; // 접속 후 질의문을 실행시킬 클래스 PreparedStatement pstmt = null; try { // MySQL Driver 를 불러 들인다. Class.forName("com.mysql.jdbc.Driver"); // 데이터베이스 커넥션을 위한 정보를 인자로 넘기며 커넥션을 얻는다. conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/stone", "root", "1234"); // 커넥션 객체를 얻은 후 질의문을 데이터베이스에 요청 한다. pstmt = conn.prepareStatement( "INSERT INTO BOARD ( SUBJECT, WRITER, REG_DATE ) VALUES ( ?, ?, NOW())"); // 값을 바인딩 pstmt.setString(1, subject); pstmt.setString(2, writer); // 요청한 질의문을 실행 후 결과값을 받는다. pstmt.executeUpdate(); // try 문 내에서 예외상황이 발생 했을 시 실행 } catch (Exception e) { e.printStackTrace(); // try, catch 문 실행 완료 후 실행되는 데 사용객체들을 닫아준다. } finally { if (pstmt != null) pstmt.close(); if (conn != null) conn.close(); } |
수정 (UPDATE) 에 대한 예제
// 데이터베이스 접속을 위한 클래스 Connection conn = null; // 접속 후 질의문을 실행시킬 클래스 PreparedStatement pstmt = null; try { // MySQL Driver 를 불러 들인다. Class.forName("com.mysql.jdbc.Driver"); // 데이터베이스 커넥션을 위한 정보를 인자로 넘기며 커넥션을 얻는다. conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/stone", "root", "1234"); // 커넥션 객체를 얻은 후 질의문을 데이터베이스에 요청 한다. pstmt = conn.prepareStatement( "UPDATE BOARD SET SUBJECT = ?, WRITER = ?, MOD_DATE = NOW() WHERE NUM = ?"); // 값을 바인딩 pstmt.setString(1, subject); pstmt.setString(2, writer); pstmt.setInt(3, num); // 요청한 질의문을 실행 후 결과값을 받는다. pstmt.executeUpdate(); // try 문 내에서 예외상황이 발생 했을 시 실행 } catch (Exception e) { e.printStackTrace(); // try, catch 문 실행 완료 후 실행되는 데 사용객체들을 닫아준다. } finally { if (pstmt != null) pstmt.close(); if (conn != null) conn.close(); } |
삭제 (DELETE) 에 대한 예제
// 데이터베이스 접속을 위한 클래스 Connection conn = null; // 접속 후 질의문을 실행시킬 클래스 PreparedStatement pstmt = null; try { // MySQL Driver 를 불러 들인다. Class.forName("com.mysql.jdbc.Driver"); // 데이터베이스 커넥션을 위한 정보를 인자로 넘기며 커넥션을 얻는다. conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/stone", "root", "1234"); // 커넥션 객체를 얻은 후 질의문을 데이터베이스에 요청 한다. pstmt = conn.prepareStatement( "DELETE FROM BOARD WHERE NUM = ?"); // 값을 바인딩 pstmt.setInt(1, num); // 요청한 질의문을 실행 후 결과값을 받는다. pstmt.executeUpdate(); // try 문 내에서 예외상황이 발생 했을 시 실행 } catch (Exception e) { e.printStackTrace(); // try, catch 문 실행 완료 후 실행되는 데 사용객체들을 닫아준다. } finally { if (pstmt != null) pstmt.close(); if (conn != null) conn.close(); } |
간단하게 CRUD(등록, 보기, 수정, 삭제, 목록보기)의 기능들이 완료되었다. 위의 소스들을 보게되면 비슷한 부분들이 참 많다. 즉, 데이터베이스의 연동 부분은 똑같고, 질의문과 질의문을 실행시키는 함수의 차이가 있을 뿐이다. 더 쉽게 이해하기 위해 정리해보자.
기능들의 공통된 소스
// 데이터베이스 접속을 위한 클래스 Connection conn = null; // 접속 후 질의문을 실행시킬 클래스 PreparedStatement pstmt = null; try { // MySQL Driver 를 불러 들인다. Class.forName("com.mysql.jdbc.Driver"); // 데이터베이스 커넥션을 위한 정보를 인자로 넘기며 커넥션을 얻는다. conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/stone", "root", "1234"); // 커넥션 객체를 얻은 후 질의문을 데이터베이스에 요청 한다. pstmt = conn.prepareStatement("질의문"); // try 문 내에서 예외상황이 발생 했을 시 실행 } catch (Exception e) { e.printStackTrace(); // try, catch 문 실행 완료 후 실행되는 데 사용객체들을 닫아준다. } finally { if (pstmt != null) pstmt.close(); if (conn != null) conn.close(); }
|
이 공통된 부분들만 제외하면 이 CRUD 기능들이 얼마나 간단한지 대략 알 수 있다. 자 그럼 공통되지 않는 부분은 두개로 나뉠 수 있다.
조회 (SELECT) 의 경우
... ResultSet rs = null; try { ... pstmt = conn.prepareStatement("SELECT 질의문"); ... rs = pstmt.executeQuery(); rs.next(); } catch (Exception e) { .. } finally { if (rs != null) rs.close(); .. }
|
등록(INSERT), 수정(UPDATE), 삭제(DELETE) 의 경우
... try { ... pstmt = conn.prepareStatement("INSERT or UPDATE or DELETE 질의문"); ... pstmt.executeUpdate(); } catch (Exception e) { .. } finally { .. }
|
얼마나 단순한가? 크게는 executeQuery() or executeUpdate() 차이 이다. 이러한 차이를 알고 개발한다면 데이터베이스의 테이블에 값을 조회하거나 등록하는 건 금방 기능구현이 된다. 다음은 더 기초적이고 개념적인 것에 대해 정리해야지~