각진 세상에 둥근 춤을 추자

[JSP] JDBC 프로그래밍 + 실습: User 관리 본문

JSP

[JSP] JDBC 프로그래밍 + 실습: User 관리

circle.j 2022. 10. 14. 03:39

 

 

JDBC(Java Database Connectivity)란 자바로 데이터베이스 연결 및 관련 작업을 할 때 사용하는 API이다. 

JDBC 기술로 구현하는 자바 프로그램의 연동 과정은 다음과 같다.

  • JDBC 프로그램 - JDBC 인터페이스 - JDBC 드라이버 - DB

 

 

JDBC API를 사용하기 위해서는 JDBC 드라이버가 필요하다. 

 

JDBC 드라이버를 사용하기 위해서는 웹 애플리케이션에서 자동으로 인식할 수 있도록 해 준다.

https://dev.mysql.com/downloads/connector/j/

 

MySQL :: Download Connector/J

MySQL Connector/J 8.0 is highly recommended for use with MySQL Server 8.0, 5.7 and 5.6. Please upgrade to MySQL Connector/J 8.0.

dev.mysql.com

 

SQL Connector을 다운 받은 후, 

이클립스의 해당 프로젝트 - scr - main - webapp - WEB-INF - lib 폴더 생성 - 설치한 커넥터를 끌어다 넣는다.

 

 


JDBC 구현하기 

 

 

1. JDBC 드라이버 로드

데이터베이스 작업을 하기 위해 JDBC 드라이버 파일을 사용할 수 있도록 메모리에 로딩한다.

Class.forName("com.mysql.cj.jdbc.Driver");

 

2. 데이터베이스 연결 

DB서버와 연결 작업을 한다. 

Connection conn = DriverManager.getConnection(host, user, pass);

 

3. Statement 생성

Statement를 통해 자바프로그램은 DB로 SQL문을 전송하고, DB는 처리된 결과를 자바프로그램으로 전달한다. 

Statement stmt = conn.createStatement();

 

4. SQL문 전송 +  5.1 결과 받기 (ResultSet)

실행된 결과값을 가지고 온다.

ResultSet rs = stmt.executeQuery("SELECT * FROM `테이블명`");

 

5.2 rs.next()

ResultSet 객체에서 다음 행을 반환한다.

rs.next();

 

6. 연결 해제:  close()

DB 작업을 하며 사용한 객체들을 메모리에서 해제해 준다.

rs.close();
stmt.close();
conn.close();

 


[실습1] User 관리 

 

아래 사진과 같이 User 목록을 관리하는 프로그램을 구현해 본다. 

 

 

(1) 프로젝트 생성 - Java Resources - src/main/java - bean 패키지 생성 - UserBean.java 파일 생성

 

UserBean은 JSP 프로그램에서 일시적으로 하나의 데이터 단위를 담기 위한 용도로 정의되는 객체로 사용한다. 

내용은 MySQL 데이터에서 정의한 내용 그대로 작성하는 것이 일반적이고 해당 내용을 Getters/Setters 처리해 준다. 

Getters는 현재 기록된 데이터를 가져오는 명령어를 의미하고, Setters는 데이터를 기록하는 명령어를 의미한다. 

 

UserBean.java 파일 생성 / MySQLWorkbench에서의 데이터 내용

 

Getters-Setters 처리

 

package bean;

public class UserBean {
	private String uid;
	private String name;
	private String hp;
	private int age;
	
	public String getUid() {
		return uid;
	}
	public void setUid(String uid) {
		this.uid = uid;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getHp() {
		return hp;
	}
	public void setHp(String hp) {
		this.hp = hp;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

 

 

(2) 프로젝트 생성 - src - main - webapp - user 폴더 생성

 

 

 

(3) user 폴더 - list.jsp 생성

 

list.jsp 파일에서는 user 목록의 폼을 작성하고 MySQLWorkbench에서 해당 데이터를 가져온다. 

MySQL Workbench 데이터베이스명/ 서버 접속 시 입력 비밀번호

 

MySQL의 데이터베이스명과 서버 접속 시 입력 비밀번호를 각각 String host와 String pass에 입력한다. 

// 0. 데이터베이스 작업
String host = "jdbc:mysql://127.0.0.1:3306/데이터베이스명";
String user = "root";
String pass = "서버 접속 비밀번호";

 

Driver 객체를 찾지 못하는 예외가 발생할 수 있으므로 try-catch문을 사용하여 예외를 처리한다.

// JDBC 

List<UserBean> users = null;

try{
    // 1단계: 드라이버 로드
    Class.forName("com.mysql.cj.jdbc.Driver");
    
    // 2단계: 데이터베이스 연결
    Connection conn = DriverManager.getConnection(host,user,pass);
    
    // 3단계: Statement 생성
    Statement stmt = conn.createStatement();
    
    // 4단계: SQL문 전송 + 5-1단계: 결과 받기
    ResultSet rs = stmt.executeQuery("SELECT * FROM `user3`");
    
    // 5-2: 다음 결과 받기
    Users = new ArrayList<>();
    
    while(rs.next()){
    	UserBean ub = new UserBean();
        ub.setUid(rs.getString(1));
        ub.setName(rs.getString(2));
        ub.setHp(rs.getString(3));
        ub.setAge(rs.getInt(4));
        
        users.add(ub);
   	}
    
    // 6단계: 연결해제
    rs.close();
    stmt.close();
    conn.close();

 

 

위 코드 밑 부분에는 html을 이용해 user 목록의 폼을 작성한다.

키보드 ! 입력 + 키보드 Enter 클릭을 통해 기본 html문을 쉽게 작성할 수 있다.  

<!DOCTYPE html>
<html>
	<head>
    	<meta charset="UTF-8">
        <title>user::list</title>
    </head>
    <body>
    	<h3>user 목록</h3>
        <a href="./register.jsp">user등록</a>
        
        <table border="1">
        	<tr>
            	<th>아이디</th>
                <th>이름</th>
                <th>휴대폰</th>
                <th>나이</th>
                <th>관리</th>
            </tr>
            <% for(UserBean ub : users) { %>
            <tr>
            	<td><%= ub.getUid %></td>
                <td><%= ub.getName %></td>
                <td><%= ub.getHp %></td>
                <td><%= ub.getAge %></td>
                <td>
                    <a href="./modify.jsp?uid=<%= ub.getUid() %>">수정</a>
                    <a href="./delete.jsp?uid=<%= ub.getUid() %>">삭제</a>
                </td>
            </tr>
            <% } %>
        </table>
        
    </body>
</html>

 

 

list.jsp 파일의 전체 코드는 다음과 같다. 

 

<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="bean.UserBean"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.DriverManager"%>
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%
	// 데이터베이스 작업
	String host = "jdbc:mysql://127.0.0.1:3306/데이터베이스명";
	String user = "root";
	String pass = "서버 접속 시 입력 비밀번호";
	
	List<UserBean> users = null;
	
	try{
		// 1단계
		Class.forName("com.mysql.cj.jdbc.Driver");
		// 2단계
		Connection conn = DriverManager.getConnection(host, user, pass);
		// 3단계
		Statement stmt = conn.createStatement();
		// 4단계
		ResultSet rs = stmt.executeQuery("SELECT * FROM `user3`");
		// 5단계		
		users = new ArrayList<>();
		
		while(rs.next()){
			UserBean ub = new UserBean();
			ub.setUid(rs.getString(1));
			ub.setName(rs.getString(2));
			ub.setHp(rs.getString(3));
			ub.setAge(rs.getInt(4));
			
			users.add(ub);			
		}
		
		// 6단계
		rs.close();
		stmt.close();
		conn.close();		
	}catch(Exception e){
		e.printStackTrace();
	}
%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>user::list</title>
	</head>
	<body>
		<h3>user 목록</h3>
		<a href="./register.jsp">user 등록</a>
		
		<table border="1">
			<tr>
				<th>아이디</th>
				<th>이름</th>
				<th>휴대폰</th>
				<th>나이</th>
				<th>관리</th>
			</tr>
			<% for(UserBean ub : users){ %>
			<tr>
				<td><%= ub.getUid() %></td>
				<td><%= ub.getName() %></td>
				<td><%= ub.getHp() %></td>
				<td><%= ub.getAge() %></td>
				<td>
					<a href="./modify.jsp?uid=<%= ub.getUid() %>">수정</a>
					<a href="./delete.jsp?uid=<%= ub.getUid() %>">삭제</a>
				</td>				
			</tr>
			<% } %>
		</table>
		
	</body>
</html>

여기서 링크 바로가기로 아래 코드를 작성했다.

  • <a href="./register.jsp">user 등록</a>
  • <a href="./modify.jsp?uid=<%= ub.getUid() %>">수정</a>
  • <a href="./delete.jsp?uid=<%= ub.getUid() %>">삭제</a>

 

차례로 register.jsp, modify.jsp, delete.jsp 파일을 생성하고

추가로 register.jsp에서 등록(전송)한 데이터를 수신받고, SQL과 연결하는 registerProc.jsp 파일과

modify.jsp에서 등록(전송)한 데이터를 수신받고, SQL과 연결하는 modifyProc.jsp 파일을 생성한다. 

 

(4) user 폴더 - register.jsp 생성

 

register.jsp파일에서는 해당 입력폼에서 데이터를 직접 입력하는 코드를 작성해 본다.

 

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>user::register</title>
	</head>
	<body>
		<h3>user 등록</h3>
		<a href="../1_JDBCTest.jsp">처음으로</a>
		<a href="./list.jsp">user 목록</a>
        <form action="./registerProc.jsp" method="post">
        	<table border="1">
            	<tr>
                    <td>아이디</td>
                    <td><input type="text" name="uid" placeholder="아이디 입력"/></td>
                </tr>
                <tr>
                    <td>이름</td>
                    <td><input type="text" name="name" placeholder="이름 입력"/></td>
                </tr>
                <tr>
                    <td>휴대폰</td>
                    <td><input type="text" name="hp" placeholder="휴대폰 입력"/></td>
                </tr>
                <tr>
                    <td>나이</td>
                    <td><input type="number" name="age" placeholder="나이 입력"/></td>
                </tr>
                <tr>
                    <td colspan="2" align="right">
                    	<input type="submit" value="등록하기"/>
                    </td>
                </tr>
            </table>
        </form>
	</body>
</html>

 

 

(5) user 폴더 - registerProc.jsp 생성

 

<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.DriverManager"%>
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%
    // register.jsp에서 전송한 데이터 수신
    request.setCharacterEncoding("utf-8");
    String uid = request.getParameter("uid");
    String name = request.getParameter("name");
    String hp = request.getParameter("hp");
    String age = request.getParameter("age");
    
    // 데이터베이스 처리
    String host = "jdbc:mysql://127.0.0.1:3306/데이터베이스명";
    String user = "root";
    String pass = "서버 접속 시 입력 비밀번호";
    
    try{
    	// 1단계: 드라이버 로드
        Class.forName("com.mysql.cj.jdbc.Driver");
        
        // 2단계: 데이터베이스 연결
        Connection conn = DriverManager.getConnection(host,user,pass);
        
        // 3단계: '등록' SQL문 작성
        String sql = "INSERT INTO `user3` VALUES (?,?,?,?)";
        PreparedStatement psmt = conn.preparedStatement(sql);
        psmt.setString(1, uid);
        psmt.setString(2, name);
        psmt.setString(3, hp);
        psmt.setString(4, age);
        
        // 4단계: SQL문 전송
        psmt.executeUpdate();
        
        // (5단계)
        
        // 6단계: 연결 해제
        psmt.close();
        conn.close();
        
    }catch(Exception e){
    	e.printStackTrace();
    }
    
    // 리다이렉트
    response.sendRedirect("./list.jsp");

%>

 

 

(6) user 폴더 - modify.jsp 생성

 

modify.jsp파일에서는 해당 입력폼에서 데이터를 직접 수정하는 코드를 작성해 본다.

register.jsp 파일에서 데이터 전송 시, user마다 구별이 되는 uid(아이디)를 기준으로 수신받는다. 

<%@page import="bean.UserBean"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.DriverManager"%>
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%
    // list.jsp에서 전송한 파일 수신
    request.setCharacterEncoding("utf-8");
    String uid = request.getParameter("uid");
    
    // 데이터베이스 작업
    String host = "jdbc:mysql://127.0.0.1:3306/데이터베이스명";
    String user = "root";
    String pass = "서버 접속 시 비밀번호";
    
    UserBean ub = null;
    
    try{
        // (1단계)
        
        // 2단계: 데이터베이스 연결
        Connection conn = DriverManager.getConnection(host, user, pass);
        
        // 3단계: '조회' SQL문 작성 
        String sql = "SELECT * FROM `user3` WHERE `uid`=?";
        PreparedStatement psmt = conn.preparedStatement(sql);
        psmt.setString(1, uid);
        
        // 4단계: SQL문 전송 + 5-1단계: 결과 받기
        ResultSet rs = stmt.executeQuery();
        
        // 5-2단계: 다음 결과 받기
        if(rs.next()){
            ub = new UserBean();
            ub.setUid(rs.getString(1));
            ub.setName(rs.getString(2));
            ub.setHp(rs.getString(3));
            ub.setAge(rs.getString(4));
        }
        
        // 6단계: 연결 해제
        rs.close();
        psmt.close();
        conn.close();
        
    	
    }catch(Exception e){
    	e.printStackTrace();
    }
    
    
%>

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>user::modify</title>
	</head>
	<body>
		<h3>user 수정</h3>
		<a href="../1_JDBCTest.jsp">처음으로</a>
		<a href="./list.jsp">user 목록</a>
        <form action="./modifyProc.jsp" method="post">
        	<table>
            	<tr>
                    <td>아이디</td>
                    <td><input type="text" name="uid" readonly value="<%= ub.getUid() %>"/></td>
                </tr>
                <tr>
                    <td>이름</td>
                    <td><input type="text" name="name" value="<%= ub.getName() %>"/></td>
                </tr>
                 <tr>
                    <td>휴대폰</td>
                    <td><input type="text" name="hp" value="<%= ub.getHp() %>"/></td>
                </tr>
                 <tr>
                    <td>나이</td>
                    <td><input type="number" name="age" value="<%= ub.getAge() %>"/></td>
                </tr>
                <tr>
                	<td colspan="2" align="right">
                    	<input type="submit" value="수정하기"/>
                    </td>
                </tr>
            </table>
        </form>
		</body>
</html>

 

 

(7) user 폴더 - modifyProc.jsp 생성

 

<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%
    // modify.jsp에서 전송한 데이터 수신
    request.setCharacterEncoding("utf-8");
    String uid = request.getParameter("uid");
    String name = request.getParameter("uid");
    String hp = request.getParameter("hp");
    String age = request.getParameter("age");
    
    // 데이터베이스 처리
    String host = "jdbc:mysql://127.0.0.1:3306/데이터베이스명";
    String user = "root";
    String pass = "서버 접속 시 비밀번호";
    
    try{
    
    	// 1단계: 드라이버 로드
        Class.forName("com.mysql.cj.jdbc.Driver");
        
        // 2단계: 데이터베이스 연결
        Connection conn = DriverManager.getConnection(host,user,pass);
        
        // 3단계: SQL문 작성
        String sql = "UPDATE `user3` SET `name`=?, `hp`=?, `age`=? ";
               sql += "WHERE `uid`=?";
        PreparedStatement psmt = conn.preparedStatement(sql);
        psmt.setString(1, name);
        psmt.setString(2, hp);
        psmt.setString(3, age);
        psmt.setString(4, uid);
    
    	// 4단계: SQL문 전송
        psmt.executeUpdate();
        
        // (5단계)
        
        // 6단계: 연결 해제
        psmt.close();
        conn.close();
        
    }catch(Exception e){
    	e.printStackTrace();
    }
    
    // 리다이렉트
	response.sendRedirect("./list.jsp");
%>

 

 

(8) user 폴더 - delete.jsp 생성

 

delete.jsp파일에서는 해당 입력폼에서 데이터를 직접 삭제하는 코드를 작성해 본다.

 

<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%
    // list.jsp에서 등록(전송)한 데이터 수신
    request.setCharacterEncoding("utf-8");
    String uid = request.getParameter("uid");
    
    // 데이터베이스 처리
    String host = "jdbc:mysql://127.0.0.1:3306/데이터베이스명";
    String user = "root";
    String pass = "서버 접속 시 비밀번호";
    
    try{
    	// (1단계)
        
        // 2단계: 데이터베이스 연결
        Connection conn = DriverManager.getConnection(host,user,pass);
        
        // 3단계: '삭제' SQL문 작성
        String sql = "DELETE * FROM `user3` WHERE=`uid`=?";
        PreparedStatement psmt = conn.preparedStatement(sql);
        psmt.setString(1, uid);
        
        // 4단계: SQL문 전송
        psmt.executeUpdate();
        
        // (5단계)
        
        // 6단계: 연결 해제
        psmt.close();
        conn.close();
    
    }catch(Exception e){
    	e.printStackTrace();
    }
    
    // 리다이렉트
	response.sendRedirect("./list.jsp");
%>