오늘이라도

[Web] 6. NCS 평가 프로젝트 : 작성 조건, 도서 정보 입력, 조회, 삭제 구현 본문

취업성공패키지 SW 개발자 교육/Web

[Web] 6. NCS 평가 프로젝트 : 작성 조건, 도서 정보 입력, 조회, 삭제 구현

upcake_ 2020. 5. 13. 09:26
반응형

https://github.com/upcake/Class_Examples

교육 중에 작성한 예제들은 깃허브에 올려두고 있습니다. 

gif 파일은 클릭해서 보는 것이 정확합니다.


▼프로젝트 작성 조건

○ Book 테이블 생성 : DB Connection → com.hanul.study 패키지 → 우클릭 → New → SQL : book.sql
	- 도서명	: title		varchar2(30)
	- 저자		: auth		varchar2(20)
	- ISBN		: isbn		varchar2(20)	primary key not null
	- 출판사	: comp		varchar2(20)
	- 단가		: cost		number
	- 수량		: su		number
	- 가격		: price		number
	
○ BookMain.html
	도서 정보 입력
	도서명	[					]
	저자	[					]
	ISBN	[xxx-xx-xxxx-xxx-x	]
	출판사	[					]
	단가	[					]
	수량	[					]
	[도서 정보 입력][입력 정보 취소][도서 목록 조회]
	
	- 모든 항목은 반드시 입력되어야 한다.
	- ISBN은 유효성 검사를 수행 : 3개-2개-4개-3개-1개, 숫자만
	- 단가와 수량은 숫자만 입력되어야 한다.
	- 입력정보취소 버튼 클릭 시 확인 창(confirm) 발생 : 정말 취소하시겠습니까?
	- 도서정보입력 버튼 클릭 시 확인 창(confirm) 발생 : 정말 취소하시겠습니까?
	- 위의 작성 조건을 만족하면 서버로 전송(is.do)
	
○ Servlet 정의 : default package ▶ web.xml : Servlet Mapping 수동 설정
	- InsertServlet.java(is.do) : 도서 정보 입력
	- GetAllListServlet.java(gals.do) : 전체 도서 목록 보기
	- DeleteServlet.java(ds.do) : 도서 정보 삭제
	
○ BookDTO.java : com.hanul.study package ▶ 직렬화
	- 멤버 변수(필드) 선언 : title, auth, isbn, comp, cost, su, price
	- 디폴트 생성자 메서드
	- 생성자 메서드 초기화 : 메서드 오버 로딩(필요하면 사용)
	- Getters & Setters 메서드

○ BookDAO.java : com.hanul.study package
	- getConn()		: DB 접속 ▶ ojdbc6.jar 등록
	- insert()		: 도서 정보 등록
	- getAllList() 	: 전체 도서 목록 조회
	- delete()		: 도서 정보 삭제
	- dbClose()		: DB 접속 해제
	
  - 가점부분 : CSS 적용, javaScript/jQuery 적용, JAVA 주석

 

 

 

▲프로젝트 완성 화면

 

 

▼BookMain.html : 도서 정보 입력 화면

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>도서 정보 입력 화면</title>
<style type="text/css">
	* {
		margin: 0 auto;
		text-align: center;
	}
	
	fieldset {
		width: 400px;
	}

	legend {
		font-size: 1.5em;
		font-weight: bold;
	}

	td {
		padding: 5px;
	}
	
	.attribute {
		font-weight: bold;
	}
	
	.inputData {
		text-align: left;
	}
</style>

<script src="https://code.jquery.com/jquery-3.4.1.js"></script>
<script src="jquery-3.4.1.js"></script>
<script type="text/javascript">
	$(document).ready(function() {
		//정규 표현식
		var regIsbn = /^\d{3}[\-]\d{2}[\-]\d{4}[\-]\d{3}[\-]\d{1}$/ // 숫자 3글자 - 2글자 - 4글자 - 3글자 - 1글자
		//ISBN의 정규 표현식은 국립중앙도서관에서 소개하는 ISBN 구조와 ISBN 영문 위키를 참조하여 10진수 숫자로만 구성되게끔 정하였다. 
		//※ 국립중앙도서관 ISBN 구조 : http://seoji.nl.go.kr/front/service/isbn_info09.jsp
		//※ ISBN 영문 위키 : https://en.wikipedia.org/wiki/International_Standard_Book_Number
		
		//확인 버튼
		var isbnCheck = 0;
		var isbn_val = document.getElementById("isbn");
		$("#submit").click(function() {
			//ISBN 유효성 검사
			if(!regIsbn.test(isbn_val.value)) {
				alert("ISBN 형식이 잘못되었습니다." + "\nISBN은 숫자로 구성되어 있으며 XXX-XX-XXXX-XXX-X 형식으로 입력해주세요.");
				$("#isbn").val("");
				$("#isbn").focus();
				return false;
			}
			
			var submitConfirm = confirm("정말 입력하시겠습니까?");
			if(submitConfirm) {
				return true;
			} else {
				return false;
			}
		}); // submit click()
		
		//취소 버튼
		$("#cancel").click(function() {
			var cancelConfirm = confirm("정말 취소하시겠습니까?");
			if(cancelConfirm) {
				return true;
			} else {
				return false;
			}
		}); // cancel click()
	}); // ready()
</script>
</head>
<body>
	<fieldset>
		<legend>도서 정보 입력</legend>
		<form action="is.do" method="get">
			<table border="1">
				<tr>
					<td class="attribute">도서명</td>
					<td><input type="text" name="title" required="required" class="inputData" /></td>
				</tr>
				<tr>
					<td class="attribute">저&nbsp;&nbsp;&nbsp;자</td>
					<td><input type="text" name="auth" required="required" class="inputData" /></td>
				</tr>
				<tr>
					<td style="letter-spacing: 3px" class="attribute">ISBN</td>
					<td><input type="text" name="isbn" required="required" class="inputData" placeholder="xxx-xx-xxxx-xxx-x" id="isbn"/></td>
				</tr>
				<tr>
					<td class="attribute">출판사</td>
					<td><input type="text" name="comp" required="required" class="inputData" /></td>
				</tr>
				<tr>
					<td class="attribute">단&nbsp;&nbsp;&nbsp;가</td>
					<td><input type="number" name="cost" required="required" class="inputData" /></td>
				</tr>
				<tr>
					<td class="attribute">수&nbsp;&nbsp;&nbsp;량</td>
					<td><input type="number" name="su" required="required" class="inputData" /></td>
				</tr>
				<tr >
					<td colspan="3">
						<input type="submit" value="도서 정보 입력" id="submit" />
						<input type="reset" value="입력 정보 취소" id="cancel"/>
						<input type="button" value="도서 목록 조회" onclick="location.href='gals.do'"/>
					</td>
				</tr>
			</table>
		</form>
	</fieldset>
</body>
</html>

 

 

 

 

 

▼BookDTO.html : 도서 정보 양식 클래스

package com.hanul.study;

import java.io.Serializable;

public class BookDTO implements Serializable {
	private String title;
	private String auth;
	private String isbn;
	private String comp;
	private int cost;
	private int su;
	private int price;
	
	public BookDTO() {}

	public BookDTO(String title, String auth, String isbn, String comp, int cost, int su, int price) {
		super();
		this.title = title;
		this.auth = auth;
		this.isbn = isbn;
		this.comp = comp;
		this.cost = cost;
		this.su = su;
		this.price = price;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getAuth() {
		return auth;
	}

	public void setAuth(String auth) {
		this.auth = auth;
	}

	public String getIsbn() {
		return isbn;
	}

	public void setIsbn(String isbn) {
		this.isbn = isbn;
	}

	public String getComp() {
		return comp;
	}

	public void setComp(String comp) {
		this.comp = comp;
	}

	public int getCost() {
		return cost;
	}

	public void setCost(int cost) {
		this.cost = cost;
	}

	public int getSu() {
		return su;
	}

	public void setSu(int su) {
		this.su = su;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}
	
	
}

 

 

▼BookDAO.html : 기능 클래스

package com.hanul.study;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

public class BookDAO {
/*
	- getConn()		: DB 접속 ▶ ojdbc6.jar 등록
	- insert()		: 도서 정보 등록
	- getAllList() 	: 전체 도서 목록 조회
	- delete()		: 도서 정보 삭제
	- dbClose()		: DB 접속 해제
 */
	//객체 선언
	private Connection conn;
	private PreparedStatement ps;
	private ResultSet rs;
	
	//DB 접속 메서드
	public Connection getConn() {
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
		String user = "hanul";
		String password = "0000";
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection(url, user, password);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("getConn() Exception");
		}
		return conn;
	} //getConn()
	
	//도서 정보 등록 메서드
	public int insert(BookDTO dto) {
		conn = getConn();
		String sql ="INSERT INTO book VALUES(?, ?, ?, ?, ?, ?, ?)";
		int succ = 0;
		try {
			ps = conn.prepareStatement(sql);
			ps.setString(1, dto.getTitle());
			ps.setString(2, dto.getAuth());
			ps.setString(3, dto.getIsbn());
			ps.setString(4, dto.getComp());
			ps.setInt(5, dto.getCost());
			ps.setInt(6, dto.getSu());
			ps.setInt(7, dto.getPrice());
			succ = ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("insert() Exception");
		} finally {
			dbClose();
		}
		return succ;
	} //insert()
	
	//도서 목록 조회 메서드
	public ArrayList<BookDTO> getAllList() {
		conn = getConn();
		String sql = "SELECT * FROM book";
		ArrayList<BookDTO> list = new ArrayList<>();
		try {
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			while(rs.next()) {
				String title = rs.getString("title");
				String auth = rs.getString("auth");
				String isbn = rs.getString("isbn");
				String comp = rs.getString("comp");
				int cost = rs.getInt("cost");
				int su = rs.getInt("su");
				int price = rs.getInt("price");
				BookDTO dto = new BookDTO(title, auth, isbn, comp, cost, su, price);
				list.add(dto);
			}
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("getAllList() Exception");
		} finally {
			dbClose();
		}
		return list;
	} //getAllList()
	
	//도서 정보 삭제 메서드
	public int delete(String isbn) {
		conn = getConn();
		String sql = "DELETE FROM book WHERE isbn = ?";
		int succ = 0;
		try {
			ps = conn.prepareStatement(sql);
			ps.setString(1, isbn);
			succ = ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("delete() Exception");
		} finally {
			dbClose();
		}
		return succ;
	} //delete()
	
	//DB 접속 해제 메서드
	public void dbClose() {
		try {
			if(rs != null) rs.close();
			if(ps != null) ps.close();
			if(conn != null) conn.close();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("dbClose() Exception");
		}
	} //dbClose()
} //class

 

 

▼InsertServlet : 도서 정보 입력 화면

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hanul.study.BookDAO;
import com.hanul.study.BookDTO;

@WebServlet("/is.do")	//Servlet Mapping 자동 설정
public class InsertServlet extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//클라이언트의 요청 받기
		request.setCharacterEncoding("utf-8");
		BookDTO dto = new BookDTO();
		dto.setTitle(request.getParameter("title"));
		dto.setAuth(request.getParameter("auth"));
		dto.setIsbn(request.getParameter("isbn"));
		dto.setComp(request.getParameter("comp"));
		dto.setCost(Integer.parseInt(request.getParameter("cost")));
		dto.setSu(Integer.parseInt(request.getParameter("su")));
		dto.setPrice(dto.getCost() * dto.getSu());
		
		//비즈니스 로직
		BookDAO dao = new BookDAO();
		int succ = dao.insert(dto);
		
		//프레젠테이션 로직
		response.setContentType("text/html; charset=utf-8"); //MIME Type
		PrintWriter out = response.getWriter();
		if(succ > 0) {
			out.println("<script>alert('도서 정보 입력 성공');</script>");
			out.println("<a href='BookMain.html'>도서 정보 입력 하기</a>");
			out.println("<br />");
			out.println("<a href='gals.do'>도서 목록 조회 하기</a>");
		} else {
			out.println("<script>alert('도서 정보 입력 실패');</script>");
			out.println("<a href='BookMain.html'>도서 정보 입력 하기</a>");
			out.println("<br />");
			out.println("<a href='gals.do'>도서 목록 조회 하기</a>");
		} //if else
	} //service()
} //class

 

 

▼GetAllListServlet.java : 도서 목록 조회 화면

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hanul.study.BookDAO;
import com.hanul.study.BookDTO;

@WebServlet("/gals.do")
public class GetAllListServlet extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//비즈니스 로직
		BookDAO dao = new BookDAO();
		ArrayList<BookDTO> list = dao.getAllList();
		
		//프레젠테이션 로직
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();
		//CSS
		out.println("<style type=\"text/css\">");
			out.println("* {");
				out.println("margin: 0 auto;");
			out.println("}");
			
			out.println("fieldset {");
				out.println("width: 700px;");
			out.println("}");
		
			out.println("legend {");
				out.println("font-size: 1.5em;");
				out.println("font-weight: bold;");
			out.println("}");

			out.println("td, th {");
				out.println("padding: 5px;");
			out.println("}");
		out.println("</style>");
		
		//HTML
		out.println("<fieldset>");
			out.println("<legend>도서 목록 조회</legend>");
			out.println("<table border='1'>");
				out.println("<tr>");
					out.println("<th>도서명</th>");
					out.println("<th>저&nbsp;&nbsp;&nbsp;자</th>");
					out.println("<th style='letter-spacing: 3px'>ISBN</th>");
					out.println("<th>출판사</th>");
					out.println("<th>단&nbsp;&nbsp;&nbsp;가</th>");
					out.println("<th>수&nbsp;&nbsp;&nbsp;량</th>");
					out.println("<th>가&nbsp;&nbsp;&nbsp;격</th>");
					out.println("<th>삭&nbsp;&nbsp;&nbsp;제</th>");
				out.println("</tr>");
				for (BookDTO dto : list) {
					out.println("<tr align='center'>");
						out.println("<td>" + dto.getTitle() + "</td>");
						out.println("<td>" + dto.getAuth() + "</td>");
						out.println("<td>" + dto.getIsbn() + "</td>");
						out.println("<td>" + dto.getComp() + "</td>");
						out.println("<td>" + dto.getCost() + "</td>");
						out.println("<td>" + dto.getSu() + "</td>");
						out.println("<td>" + dto.getPrice() + "</td>");
						out.println("<td><a href='ds.do?isbn=" + dto.getIsbn() + "' style='text-decoration:none'>삭&nbsp;&nbsp;&nbsp;제</a></td>");
					out.println("</tr>");
				}
				out.println("<tr>");
					out.println("<td colspan='8' align='center'><input type=\"button\" value=\"도서 정보 입력\" onclick=\"location.href='BookMain.html'\"/></td>");
				out.println("</tr>");
			out.println("</table>");
		out.println("</fieldset>");
	}
}

 

 

▼DeleteServlet.java : 도서 정보 삭제 화면

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hanul.study.BookDAO;

@WebServlet("/ds.do")
public class DeleteServlet extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//클라이언트의 요청 받기
		String isbn = request.getParameter("isbn");
		
		//비즈니스 로직
		BookDAO dao = new BookDAO();
		int succ = dao.delete(isbn);
		
		//프레젠테이션 로직
		response.setContentType("text/html; charset=utf-8"); //MIME Type
		PrintWriter out = response.getWriter();
		if(succ > 0) {
			out.println("<script>alert('도서 정보 삭제 성공');</script>");
			out.println("<a href='BookMain.html'>도서 정보 입력 하기</a>");
			out.println("<br />");
			out.println("<a href='gals.do'>도서 목록 조회 하기</a>");
		} else {
			out.println("<script>alert('도서 정보 삭제 실패');</script>");
			out.println("<a href='BookMain.html'>도서 정보 입력 하기</a>");
			out.println("<br />");
			out.println("<a href='gals.do'>도서 목록 조회 하기</a>");
		} //if else
	}
}

 

반응형