방통대 12, 14장 연습문제
book table 만들기
다음은 방통대
- database 만들기
- 자바빈 클래스 만들기
- 자바빈 클래스 html과 연결하기
1. database 만들기
다음과 같은 구조의 database를 만든다.
필드 이름 | 데이터 타입 | 설명 |
---|---|---|
title | varchar(50) | 제목 |
author | varchar(10) | 저자 |
publisher | varchar(15) | 출판사 |
price | int | 가격 |
create database my_db; 이름이 ‘my_db’인 database를 생성시킨다.
‘my_db’ database 안에 table을 만들기 위해서 먼저 해당 database를 선택한다. 프롬프트에 연결된 database 이름이 ‘my_db’로 변경된 것을 확인한 후 ‘book’ table을 만들기 위해 create 명령어를 실행한다.
use my_db;
create table book(title varchar(50) primary key, author varchar(10), publisher varchar(15), price int);
book table 관리 프로그램 작성을 위해 title을 기본키로 지정해 필수로 입력되어야 하고 다른 필드와 중복값이 들어갈 수 없도록 설정했다. (보통 레코드를 식별할 수 있는 id값을 따로 추가해 기본키로 사용한다.)
show tables;
table 생성이 정상적으로 되었는지 확인하기 위해 현재 연결된 ‘my_db’ database에 존재하는 table 목록을 출력한다. 출력 결과 ‘book’ table이 추가된 것을 다음과 같이 확인할 수 있다.
모든 권한을 가지고 있는 최고 관리자 root의 경우 실수로 중요한 database나 table을 삭제할 위험이 있다. 이를 방지하기 위해 my_db database만을 사용할 권한이 주어지는 사용자 계정 ‘user’을 생성한다. 접속 비밀번호는 ‘1234’로 설정했다. my_db database에 관한 모든 권한을 user에게 부여하고 변경된 사항이 MariaDB에 반영되도록 한다.
create user user@localhost identified by ‘1234’;
grant all privileges on my_db.* to user@localhost with grant option;
flush privileges;
mysql database 로 들어간다. mariaDB의 모든 사용자 계정은 mysql database에서 관리하고 있다. 이곳에서 계정 생성이 정상적으로 되었는지 확인해볼 수 있다. user table에서 user 계정의 host, user, password를 조회한다. 정상적으로 생성된 것을 아래 이미지를 통해 확인할 수 있다.
use mysql;
select host, user, password from user where user=’user’;
2. 자바빈 클래스 만들기
책과 DB 관리를 위한 자바빈 클래스를 만든다. 클래스가 포함될 패키지의 이름은 ‘com.example. book_project’이다. BookDTO.java 에 ‘book’ table과 대응되는 BookDTO를 만든다. title, author, publisher, price라는 book class의 변수 4가지의 초기값을 설정하고 각 변수마다 getter, setter 메서드를 만들었다.
package com.example.book_project;
public class BookDTO {
private String title = null;
private String author = null;
private String publisher = null;
private int price = 0;
이하 생략 ...
Maria DB 데이터베이스와 연동을 담당하는 DAO를 만든다. book_project는 DBMS 연동 프로그램이므로 SQL구문을 실행시킬 수 있도록 JDK에서 제공하는 ‘java.sql’ 패키지의 클래스나 인터페이스를 import한다.book table의 모든 레코드를 리턴하는 selectAll 매서드를 예시로 들면 다음과 같다. ArrayList 클래스 객체를 만들어 book table에서 검색된 레코드를 BookDTO에 저장한 후 이를 ArrayList에 추가한다.
//book_project는 DBMS 연동 프로그램이므로 SQL구문을 실행시킬 수 있도록 JDK에서 제공하는 ‘java.sql’ 패키지의 클래스나 인터페이스를 이곳에서 import 시킨다. 더불어 ArrayList 클래스를 사용하기 위해 java.util를 import했다.
package com.example.book_project;
import java.sql.*;
import java.util.*;
public class BookDAO {
private Connection getConnection() throws Exception {
// MariaDB에서 제공하는 자바 커넥터 ‘org.mariadb.jdbc.Driver’를 로드한다. Class.forName를 통해 ‘org.mariadb.jdbc.Driver’라는 이름의 클래스를 로드하고 있다.
Class.forName("org.mariadb.jdbc.Driver");
// MariaDB 서버에 접속하기 위해 url 변수에 접속 방식(‘jdbc:mariadb’는 JDBC를 이용해 MariaDB서버에 접속한다는 의미이다), 서버 주소(localhost), 포트 번호(3306), 연결할 DB 이름(my_db)을 지정한다. user 변수에는 MariaDB의 사용자 계정(user), pw 변수에는 접속 비밀번호(1234)를 지정한다.
String url = "jdbc:mariadb://localhost:3306/my_db";
String user = "user";
String pass = "1234";
// DriverManager.getConnection 메서드에 위에 설정한 url, user, pass를 인수로 넘기면 MariaDB 서버에 연결하고 연결정보를 리턴한다. 리턴값을 con변수에 저장해 getConnection 매서드의 리턴값으로 사용한다.
Connection con = DriverManager.getConnection(url, user, pass);
return con;
}
// book table의 모든 레코드를 리턴하는 selectAll 매서드를 만든다. ArrayList 클래스 객체를 만들어 book table에서 검색된 레코드를 BookDTO에 저장한 후 이를 ArrayList에 추가한다.
public ArrayList<BookDTO> selectAll() {
ArrayList<BookDTO> bookList = new ArrayList<BookDTO>();
try (
// 앞서 정의한 getConnection 메서드를 호출해 MariaDB에 연결하고 select 구분을 실행한다.
Connection con = getConnection();
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from book");
) {
while (rs.next()) {
BookDTO book = new BookDTO();
book.setTitle(rs.getString("title"));
book.setAuthor(rs.getString("author"));
book.setPublisher(rs.getString("publisher"));
book.setPrice(rs.getInt("price"));
bookList.add(book);
}
} catch (Exception e) {
e.printStackTrace();
}
return bookList;
}
}
아래 화면은 book_project 패키지에서 ‘BookDAO.java’ 파일 위치를 보여준다.(‘/src/main/java/com/example/book_project/BookDAO.java’) JSP 프로그램과 MariaDB가 연동될 수 있게 하는 자바 커넥터 mariadb-java-client-3.5.1.jar가 book_project 폴더를 기준으로 ‘src/main/webapp/WEB-INF/lib’ 폴더 하위에 위치시킨 것도 더불어 확인할 수 있다.
JSP 프로그램별 사용 DAO 메서드는 다음과 같다.
JSP 프로그램 | 기능 | DAO 메서드 |
---|---|---|
index.jsp | 화면에 book table의 모든 레코드 출력하기 | - getConnection( ) - selectAll( ) |
update_book_info_form.jsp update_book_info.jsp |
특정 레코드 수정하기 | - getConnection( ) - updateOne( ) |
delete_book_info.jsp | 특정 레코드 삭제하기 | - getConnection( ) - deleteOne( ) |
insert_book_info_form.html insert_book_info.jsp |
새로운 레코드 삽입하기 | - getConnection( ) - insertOne( ) |
3. 자바빈 클래스 html과 연결하기
- 전체 목록 보기 초기 화면인 index.jsp 는 다음과 같다. 16번 라인에서 selectAll 매서드를 호출했다. 여기서 MariaDB에 연결해 book table에 저장된 모든 레코드를 bookDTO객체가 모인 ArrayList 객체로 만들어 리턴한다. 이를 17번~26번 라인에서 for분을 통해 차례대로 꺼내어 출력하고 있다.
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%@ page import="com.example.book_project.*" %>
<html>
<meta charset="UTF-8">
<title>202334-363406 | select</title>
<body>
<div align="center">
<h3>Book Table 내용 보기</h3>
<table border=1>
<tr>
<th>제목</th><th>저자</th><th>출판사</th><th>가격</th><th>메뉴</th>
</tr>
<%
ArrayList<BookDTO> bookList = new BookDAO().selectAll();
for(BookDTO book: bookList) {
out.print("<tr><td>" + book.getTitle() + "</td>");
out.print("<td>" + book.getAuthor() + "</td>");
out.print("<td>" + book.getPublisher() + "</td>");
out.print("<td>" + book.getPrice() + "</td>");
String update = String.format("<a href='update_book_info_form.jsp?title=%s'>수정</a>", book.getTitle());
out.print("<td>"+update);
String delete = String.format("<a href='delete_book_info.jsp?title=%s'>삭제</a>", book.getTitle());
out.print(delete+"</td></tr>");
}
%>
</table>
<h3><a href="insert_book_info_form.html">레코드 입력하기</a></h3>
</div>
</body>
</html>
- 수정하기 아래 그림은 ‘고래’라는 제목을 가진 레코드의 가격을 10000에서 12000으로 수정하는 모습을 보여준다.
- 추가하기
아래 이미지와 같이 데이터를 입력한 후 확인 버튼을 누른다. 확인 버튼을 누르면 입력받은 값을 post형식으로 insert_book_info.jsp 페이지로 보낸다.
초기 화면 링크를 클릭하면 다음과 같이 ‘묵묵’이라는 제목의 레코드가 추가된 것을 확인할 수 있다.
- 삭제하기
초기화면 링크를 누르면 제목이 ‘묵묵’인 레코드가 삭제된 것을 확인할 수 있다.
회원관리 시스템 만들기
다음은 방통대
- database 만들기
- 자바빈 클래스 만들기
- 자바빈 클래스 html과 연결하기
1. database 만들기
회원관리를 위한 ‘member’ table을 만든다. 데이터베이스는 12장 연습문제에서 사용한 ‘my_db’를 사용하고 사용자 계정은 ‘user’을 동일하게 사용한다. JSTL를 사용할 것이므로 ‘src/main/webapp/WEB-INF/lib’ 폴더에 ~톰캣 홈페이지~에서 다운받은 ‘Impl’, ‘Spec’에 해당하는 jar 파일을 넣어주었다.
‘member’ table의 각 필드의 이름과 데이터 타입, 설명은 다음 표와 같다.
필드 이름 | 데이터 타입 | 설명 |
---|---|---|
id | varchar(20) | 회원의 아이디 |
pass | varchar(20) | 비밀번호 |
name | varchar(20) | 이름 |
phone | varchar(20) | 전화번호 |
varchar(50) | 이메일 주소 |
2. 자바빈 클래스 만들기
회원과 DB 관리를 위한 자바빈 클래스를 만든다. 클래스가 포함될 패키지의 이름은 ‘com.example.member_manager’이다. memberDTO.java 에 ‘member’ table과 대응되는 DTO를 작성하면 다음과 같다.
package com.example.member_manager;
public class MemberDTO {
private String id;
private String pass;
private String name;
private String phone;
private String email;
이하 생략 ...
}
id, pass , name, phone, email라는 member class의 변수 5가지의 초기값을 설정하고 각 변수마다 getter, setter 메서드를 만들었다.
memberDAO.java를 만들면 다음과 같다. BookDAO.java와 크게 다르지 않으나 selectAll 메서드는 사용하지 않으므로 만들지 않았다. JSTL에서 사용하기 위해 selectOne 메서드를 제외한 다른 메서드들은 성공 여부에 따라 true 또는 false를 리턴하도록 했다. 예를 들어 updateOne메서드는 매개변수 MemberDTO 객체를 받아 이 객체에 저장된 정보를 이용한다. member table에서 id 필드 값이 매개변수의 id 값과 같은 레코드를 찾아 수정한다.
package com.example.member_manager;
import java.sql.*;
import java.util.*;
public class MemberDAO {
private Connection getConnection() throws Exception {
중략 ...
}
public boolean updateOne(MemberDTO member) {
boolean res = false;
int upd = 0;
try(
Connection con = getConnection();
Statement stmt = con.createStatement();
){
String sql= String.format("update member set id='%s', pass='%s', name='%s', phone='%s', email='%s' where id='%s'", member.getId(), member.getPass(), member.getName(), member.getPhone(), member.getEmail(), member.getId());
upd = stmt.executeUpdate(sql);
} catch(Exception e) {
e.printStackTrace();
}
res = (upd==0)?false:true;
return res;
}
}
- 첫 화면
초기 화면인 index.jsp 는 다음과 같다. 로그인을 위해 아이디와 비밀번호를 입력하거나 ‘회원가입’ 링크를 통해 회원가입을 할 수 있다.
- 회원가입하기
회원가입 페이지 register_form.jsp는 다음과 같다. 회원가입을 위해 필요한 데이터를 입력받는 form을 만들고 가입 버튼 클릭 시 register.jsp가 실행되도록 한다.아이디가 test인 회원정보를 다음과 같이 입력 후 가입 버튼을 누른다.
register.jsp는 다음과 같다.
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<% request.setCharacterEncoding("UTF-8"); %>
<jsp:useBean id="member" class="com.example.member_manager.MemberDTO" scope="page" />
<jsp:setProperty name="member" property="*" />
<jsp:useBean id="data" class="com.example.member_manager.MemberDAO" scope="page" />
<html>
<title>202334-363406 | register</title>
<body>
<c:choose>
<c:when test="<%=data.isNotMember(member.getId(), member.getPass()) %>">
<c:choose>
<c:when test="<%=data.insertOne(member)%>">
<h3>회원가입에 성공하였습니다</h3>
<h3><a href="index.jsp">로그인 화면으로 돌아가기</a></h3>
</c:when>
<c:otherwise>
<h3>회원가입에 실패하였습니다 잠시 후 다시 시도해주세요</h3>
<h3><a href="register_form.jsp">회원가입 화면으로 돌아가기</a></h3>
</c:otherwise>
</c:choose>
</c:when>
<c:otherwise>
<h3>이미 가입된 아이디입니다. 다시 작성해 주세요.</h3>
<h3><a href="register_form.jsp">회원가입 화면으로 돌아가기</a></h3>
</c:otherwise>
</c:choose>
</body>
</html>
MemberDTO를 생성한 후 입력 폼에서 넘어온 요청 파라미터 값들을 MemberDTO객체의 각 맴버 변수에 자동으로 지정하도록 했다. 다음으로 member table에 id와 pass가 같은 레코드가 있는지 확인한다. 확인 후 없다면 insertOne를 사용해 해당 데이터를 가진 회원을 추가해준다. 실패하면 회원가입 화면으로 돌아갈 수 있는 링크가 화면에 출력된다. id와 pass가 같은 레코드가 있다면 isNotMember 메소드가 false가 되어 회원가입 화면으로 돌아갈 수 있는 링크가 화면에 출력된다. 회원가입에 성공한 화면은 다음과 같다.
이미 가입된 경우 가입에 실패한 화면은 다음과 같다.
- 로그인하기
session에 ‘id’란 이름의 속성을 만들고 값으로는 사용자 아이디를 넣어주었다. 그런 다음 회원정보를 보여주기 위한 페이지 member_info.jsp로 이동하는 링크를 출력해서 보여주었다. 로그인에 실패하면 초기 화면으로 돌아갈 수 있는 링크가 화면에 출력된다.
로그인에 성공한 화면은 다음과 같다. 회원정보 보기 링크를 클릭해 회원정보 페이지로 이동한다.
- 수정하기
member_info.jsp는 다음과 같다. 6번~9번 라인에서 session에 저장된 속성 id의 값을 꺼내와 selectOne 메서드의 매개변수로 넣어준다. 검색된 레코드의 데이터를 MemberDTO 객체에 저장한다. 더불어 표현언어에서도 사용할 수 있도록 request 객체에 속성으로 저장한다. table 태크과 표현 언어를 사용해 현재 회원정보를 화면에 출력했다. 여기서 아이디는 변경할 수 없도록 input 태그에 disabled 속성을 추가했다. member table에서 레코드를 검색할 때 각 레코드를 구별할 수 있는 기본키가 id이기 때문이다. 아래 이미지에서는 ‘정주영’이라는 이름을 ‘정주영2’로 수정한 후 수정 버튼을 눌러 update.jsp를 실행했다.
다음 이미지는 회원정보 수정에 성공한 모습을 보여준다.
다시 회원정보 페이지로 돌아가면 이름이 ‘정주영2’로 수정된 모습을 확인할 수 있다.
- 로그아웃하기
logout.jsp는 다음과 같다. 생성된 세션을 삭제하고 로그아웃이 되었다는 안내문을 출력했다. 로그인 화면으로 돌아갈 수 있는 링크도 더불어 출력했다.
- 삭제하기
delete.jsp는 다음과 같다. 삭제할 회원의 id를 요청 파라미터로 넘겨받아 deleteOne 메서드를 이용해 member table에서 해당 회원정보를 삭제한다. 세션도 함께 삭제해주도록 logout 페이지로 리다이렉션시켰다.
회원 탈퇴 후 다시 로그인을 시도하면 다음과 같이 가입되지 않은 아이디와 비밀밀번호라는 안내문이 나온다.
참고문헌
- JSP프로그래밍 - 한국방송통신대학교 출판문화원ㅡ12, 14장
댓글남기기