각진 세상에 둥근 춤을 추자
[JSP] JDBC 프로그래밍 + 실습: User 관리 본문
JDBC(Java Database Connectivity)란 자바로 데이터베이스 연결 및 관련 작업을 할 때 사용하는 API이다.
JDBC 기술로 구현하는 자바 프로그램의 연동 과정은 다음과 같다.
- JDBC 프로그램 - JDBC 인터페이스 - JDBC 드라이버 - DB
JDBC API를 사용하기 위해서는 JDBC 드라이버가 필요하다.
JDBC 드라이버를 사용하기 위해서는 웹 애플리케이션에서 자동으로 인식할 수 있도록 해 준다.
https://dev.mysql.com/downloads/connector/j/
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는 데이터를 기록하는 명령어를 의미한다.
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의 데이터베이스명과 서버 접속 시 입력 비밀번호를 각각 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");
%>
'JSP' 카테고리의 다른 글
[JSP] 프로젝트 실습 - 게시판 만들기 1 ( 유스케이스 작성) (0) | 2022.10.19 |
---|---|
[JSP] JDBC 프로그래밍 실습 1: Member 관리 (0) | 2022.10.14 |
[JSP] <jsp: useBean> (0) | 2022.10.12 |
[JSP] 액션 태그 - <jsp: forward> (0) | 2022.10.11 |
[JSP] 액션 태그 - <jsp: include> (0) | 2022.10.11 |