๐ŸŒฑ[๊ตฌ๋””์•„์นด๋ฐ๋ฏธ IT๊ตญ๋น„์ง€์›] - ๋‹ค์ด์–ด๋ฆฌ ํ”„๋กœ์ ํŠธ ์™„์„ฑ

๊น€ํฌ์ง„ยท2023๋…„ 4์›” 25์ผ
0

ํ”„๋กœ์ ํŠธ

๋ชฉ๋ก ๋ณด๊ธฐ
1/2

[๊ตฌ๋””์•„์นด๋ฐ๋ฏธ IT๊ตญ๋น„์ง€์›] 15์ผ์ฐจ๋งŒ์— ๋‹ค์ด์–ด๋ฆฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์™„์„ฑํ–ˆ๋‹ค.


โœ” home.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.sql.Connection" %>
<%@ page import = "java.sql.DriverManager" %>
<%@ page import = "java.sql.PreparedStatement" %>
<%@ page import = "java.sql.ResultSet" %>
<%@ page import = "java.util.*" %>
<%@ page import = "vo.*" %>
<%
	// select notice_no, notice_title, createdate from notice
	// notice_no๋Š” ์ถœ๋ ฅ๋˜์ง€๋Š” ์•Š์•„๋„ ํ•„์š”ํ•˜๋ฏ€๋กœ ๊ฐ™์ด ๋ถˆ๋Ÿฌ์˜จ๋‹ค!
	// order by createdate desc
	// limit 0, 5
		
	// 1) ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉ // mariadb๋ฅผ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๋“œ๋ผ์ด๋ฒ„ ํด๋ž˜์Šค ์œ„์น˜์˜ ํ’€๋„ค์ž„์„ ์ ๋Š”๋‹ค (๊ตณ์ด ์™ธ์šฐ๋ ค๊ณ  ํ•  ํ•„์š”x)
	Class.forName("org.mariadb.jdbc.Driver"); 
		
	// 2) mariadb ์„œ๋ฒ„์— ์ ‘์†, ์ ‘์† ์œ ์ง€
	Connection conn = DriverManager.getConnection(
			"jdbc:mariadb://127.0.0.1:3306/diary","****","****"); // ๋งค๊ฐœ๋ณ€์ˆ˜ 3๊ฐœ (์ฃผ์†Œ,๊ณ„์ •,์•”ํ˜ธ)
		
	// 3) ์ฟผ๋ฆฌ ์ƒ์„ฑ ํ›„ ์‹คํ–‰
	// String sql ๋งŒ๋“ค์–ด์„œ ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•˜๊ณ  ํ•˜๋Š” ๊ฒŒ ๋” ํŽธํ•จ
	// ๋‚ ์งœ์ˆœ ์ตœ๊ทผ ๊ณต์ง€ 5๊ฐœ (๋‚ด๋ฆผ์ฐจ์ˆœ)
	String sql1 = "SELECT notice_no noticeNo, notice_title noticeTitle, createdate FROM notice ORDER BY createdate DESC limit 0, 5";
	PreparedStatement stmt1 = conn.prepareStatement(sql1);
	System.out.println("home stmt1: " + stmt1); // ๋””๋ฒ„๊น…
	
	ResultSet rs1 = stmt1.executeQuery();
	// ResultSet -> ArrayList<Notice>
	ArrayList<Notice> noticeList = new ArrayList<Notice>();
	while(rs1.next()) {
		Notice n = new Notice();
		n.noticeNo = rs1.getInt("noticeNo"); // ์ด๋ฆ„์ด ๋ถˆ์ผ์น˜ // sql ์ž‘์„ฑ์‹œ ๋ณ„๋ช…์œผ๋กœ ๋ฐ›์•„์„œ ํ†ต์ผ์‹œ์ผœ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์Œ
		n.noticeTitle = rs1.getString("noticeTitle");
		n.createdate = rs1.getString("createdate");
		noticeList.add(n);
	}
	
	// ์˜ค๋Š˜ ์ผ์ • (์˜ค๋ฆ„์ฐจ์ˆœ)
	String sql2 = "SELECT schedule_no scheduleNo, schedule_date scheduleDate, schedule_time scheduleTime, substr(schedule_memo,1,5) scheduleMemo, schedule_color scheduleColor FROM schedule WHERE schedule_date = CURDATE() ORDER BY schedule_time ASC";
	PreparedStatement stmt2 = conn.prepareStatement(sql2);
	System.out.println("home stmt2: " + stmt2); // ๋””๋ฒ„๊น…
	
	ResultSet rs2 = stmt2.executeQuery();
	// ResultSet -> ArrayList<Schedule>
	ArrayList<Schedule> scheduleList = new ArrayList<Schedule>();
	while(rs2.next()) {
		Schedule s = new Schedule();
		s.scheduleNo = rs2.getInt("scheduleNo"); // ์ด๋ฆ„์ด ๋ถˆ์ผ์น˜ // sql ์ž‘์„ฑ์‹œ ๋ณ„๋ช…์œผ๋กœ ๋ฐ›์•„์„œ ํ†ต์ผ์‹œ์ผœ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์Œ
		s.scheduleDate = rs2.getString("scheduleDate"); 
		s.scheduleTime = rs2.getString("scheduleTime");
		s.scheduleMemo = rs2.getString("scheduleMemo"); // ๋ฉ”๋ชจ ์ „์ฒด๊ฐ€ ์•„๋‹Œ ์ผ๋ถ€(5๊ธ€์ž)๋งŒ ๊ฐ€์ ธ์˜ด
		s.scheduleColor = rs2.getString("scheduleColor");
		scheduleList.add(s);
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>home.jsp</title>
<!-- ํฐํŠธ๋ณ€๊ฒฝ -->
	<link rel="preconnect" href="https://fonts.googleapis.com">
	<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
	<link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@600&display=swap" rel="stylesheet">
	<link href="https://fonts.googleapis.com/css2?family=Gowun+Dodum&display=swap" rel="stylesheet">
<!-- ๋ถ€ํŠธ์ŠคํŠธ๋žฉ5 -->
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
	<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
<style>
	a {text-decoration: none;}
	a:hover {text-decoration: underline;}
	.center {text-align: center;}
	.enFont {
		font-family: 'Comfortaa', cursive;
	}
	.krFont {
		font-family: 'Gowun Dodum', sans-serif;
	}
</style>
</head>
<body>
<div class="p-5 bg-warning text-white text-center">
  <h1 class="enFont">Diary Project</h1>
  <p class="krFont">๊ฐœ๋ฐœํ™˜๊ฒฝ: Eclipse(2022-12), JDK(17.0.6), Mariadb(10.5.19), Apache Tomcat(10.1.7), HeidiSQL<br>์‚ฌ์šฉ์–ธ์–ด: java, sql, html, css, bootstrap5</p> 
</div>
<div class="container mt-3 center krFont">
	<div class="center"><!-- ๋ฉ”์ธ๋ฉ”๋‰ด -->
		<a class="btn btn-warning krFont" href="./home.jsp">ํ™ˆ์œผ๋กœ</a>
		<a class="btn btn-outline-warning krFont" href="./noticeList.jsp">๊ณต์ง€ ๋ฆฌ์ŠคํŠธ</a> <!-- ์ตœ๊ทผ 10๊ฐœ์”ฉ -->
		<a class="btn btn-outline-warning krFont" href="./scheduleList.jsp">์ผ์ • ๋ฆฌ์ŠคํŠธ</a> <!-- ์ด๋ฒˆ๋‹ฌ ์ „์ฒด -->
	</div>
	<br>
	<h1> ํ”„๋กœ์ ํŠธ ๋‚ด์šฉ &#128187; </h1>
	<h4>
		1. mariadb๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ<br>
		2. DML(Select, Insert, Delete, Update)์„ ์ด์šฉํ•˜์—ฌ ๊ณต์ง€์‚ฌํ•ญ ๋˜๋Š” ์ผ์ •์„ <br> ์กฐํšŒ, ์ž…๋ ฅ, ์‚ญ์ œ, ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” Form ํŽ˜์ด์ง€์™€ Action ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ<br>
		3. Calendar ๊ธฐ๋ณธAPI๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‹ฌ๋ ฅ ๋งŒ๋“ค๊ธฐ<br>
		4. ๋‹ฌ๋ ฅ์— ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐ์‹œ์ผœ ์ผ์ • ๋ฏธ๋ฆฌ๋ณด๊ธฐ<br>
		4. Bootstrap5๋ฅผ ์ด์šฉํ•˜์—ฌ CSSํ•˜๊ธฐ<br>
	</h4>
	<br><br>
	<h1> &#x1F49B; ์ตœ๊ทผ ๊ณต์ง€ &#x1F33B; </h1>
	<table class="table">
		<thead class="table-warning h5 krFont">
			<tr>
				<th>๊ณต์ง€ ์ œ๋ชฉ</th>
				<th>์ž‘์„ฑ์ผ์ž</th>
			</tr>
		</thead>
		<tbody>
			<%
				for(Notice n : noticeList) {
			%>
				<tr>
					<td>
						<a class="text-dark" href="./noticeOne.jsp?noticeNo=<%=n.noticeNo%>">
						<!-- notice_title์˜ ๊ฐ’์€ ์ค‘๋ณต๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์€ notice_no์˜ ๊ฐ’์„ ๋„˜๊ธด๋‹ค -->
						<!-- ์ฃผ์†Œ?ํ‚ค=๊ฐ’ -->
							<%=n.noticeTitle%>
						</a>
					</td>
					<td><%=n.createdate.substring(0, 10) %></td>
					<!-- ์ž๋ฐ”์˜ ๋‚ ์งœํƒ€์ž…๊ณผ ๋˜‘๊ฐ™์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Stringํƒ€์ž…์œผ๋กœ ๋ฐ›๋Š”๋‹ค (์ฐธ์กฐํƒ€์ž…๋ผ๋ฆฌ๋Š” ์ž๋™ํ˜•๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—)-->
					<!-- ์‹œ๊ฐ„์ด ์ œ๋Œ€๋กœ ์ถœ๋ ฅ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— substring ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋‚ ์งœ๋ถ€๋ถ„๋งŒ ์ถœ๋ ฅ -->
					<!-- (์‹œ์ž‘ ์ธ๋ฑ์Šค, ๋ ์ธ๋ฑ์Šค) ์‹œ์ž‘ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ~ ๋ ์ธ๋ฑ์Šค ์•ž๊นŒ์ง€ ์ถœ๋ ฅ, ์ธ๋ฑ์Šค์˜ ์‹œ์ž‘์€ 0 -->
				</tr>
			<%
				}
			%>
		</tbody>
	</table>
	<br><br>
	<h1> &#x1F49B; ์˜ค๋Š˜์˜ ์ผ์ • &#x1F33B; </h1>
	<table class="table">
		<thead class="table-warning h5 krFont">
			<tr>
				<th>๋‚ ์งœ</th>
				<th>์‹œ๊ฐ„</th>
				<th>์ผ์ •๋ฉ”๋ชจ</th>
			</tr>
		</thead>
		<tbody>
			<%
				for(Schedule s : scheduleList) {
			%>
				<tr>
					<td>
						<%
							// scheduleDate์—์„œ y,m,d ๊ฐ’ ๋ฐ›๊ธฐ
							String y = s.scheduleDate.substring(0,4);
							int m = Integer.parseInt(s.scheduleDate.substring(5,7)) - 1; // ์ž๋ฐ” API๋Š” 0์›”๋ถ€ํ„ฐ ์‹œ์ž‘
							String d = s.scheduleDate.substring(8);
						%>
						<a class="text-dark" href="./scheduleListByDate.jsp?y=<%=y%>&m=<%=m%>&d=<%=d%>">
							<%=s.scheduleDate%>
						</a>
					</td>
					<td><%=s.scheduleTime.substring(0, 5)%></td>
					<td>
						<!-- ๋ณ„๋ช… ์‚ฌ์šฉ -->
						<div style="color: <%=s.scheduleColor%>">
							<%=s.scheduleMemo%>
						</div>
					</td>
				</tr>
			<%
				}
			%>
		</tbody>
	</table>
</div>
<div class="mt-5 p-4 bg-secondary text-white text-center krFont">
  <p>๊ตฌ๋””์•„์นด๋ฐ๋ฏธ GDJ 66๊ธฐ ๊น€ํฌ์ง„</p>
</div>
</body>
</html>



โœ” noticeList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.sql.Connection" %>
<%@ page import = "java.sql.DriverManager" %>
<%@ page import = "java.sql.PreparedStatement" %>
<%@ page import = "java.sql.ResultSet" %> <!-- ์กฐํšŒํ•  ๋•Œ๋งŒ ์‚ฌ์šฉ -->
<%@ page import = "java.util.*" %> <!-- arraylist ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด -->
<%@ page import = "vo.*" %> <!-- ๋งŒ๋“  ํด๋ž˜์Šค ๊ฐ€์ ธ์˜ค๊ธฐ -->
<%
	// ์š”์ฒญ๋ถ„์„
	// ํ˜„์žฌํŽ˜์ด์ง€
	int currentPage = 1; // ํ˜„์žฌ ํŽ˜์ด์ง€๋Š” 1ํŽ˜์ด์ง€๋ถ€ํ„ฐ ์‹œ์ž‘
	if(request.getParameter("currentPage") != null) { // ์ฆ‰, ์ด์ „ or ๋‹ค์Œ์„ ๋ˆŒ๋ €์„ ๊ฒฝ์šฐ
		currentPage = Integer.parseInt(request.getParameter("currentPage"));
	}
	System.out.println("currentPage: " + currentPage); // ๋””๋ฒ„๊น…
	
	// ํŽ˜์ด์ง€๋‹น ์ถœ๋ ฅํ•  ํ–‰์˜ ์ˆ˜
	int rowPerPage = 10; // ๊ณต์ง€๋ฅผ ๋ช‡๊ฐœ์”ฉ ์ถœ๋ ฅํ• ์ง€
	
	// ์‹œ์ž‘ ํ–‰ ๋ฒˆํ˜ธ
	int startRow = (currentPage-1)*rowPerPage; 
	/*
	currentPage		startRow(rowPerPage 10์ผ๋•Œ)	
	1				0	<-- (currentPage-1)*rowPerPage
	2				10
	3				20
	4				30
	*/
	// int startRow = 0; // 1ํŽ˜์ด์ง€ ์ผ๋•Œ๋Š” 0์œผ๋กœ ์‹œ์ž‘
	
	
	// DB์—ฐ๊ฒฐ ์„ค์ •
	// select notice_no, notice_title, createdate from notice
	// order by createdate desc
	// limit ?, ?
	// ๊ฐ’์€ ํŽ˜์ด์ง€๋งˆ๋‹ค ๊ณ„์† ๋ฐ”๋€” ๊ฒƒ์ด๋ฏ€๋กœ ?๋กœ ๋‘”๋‹ค
				
	// 1) ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉ
	Class.forName("org.mariadb.jdbc.Driver"); 
	// 2) mariadb ์„œ๋ฒ„์— ์ ‘์†, ์ ‘์† ์œ ์ง€
	Connection conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3306/diary","****","****");
	// 3) ์ฟผ๋ฆฌ ์ƒ์„ฑ ํ›„ ์‹คํ–‰
	String sql = "SELECT notice_no noticeNo, notice_title noticeTitle, createdate FROM notice ORDER BY createdate DESC limit ?, ?";
	PreparedStatement stmt = conn.prepareStatement(sql);
	// ? ์ด 2๊ฐœ
	stmt.setInt(1, startRow);
	stmt.setInt(2, rowPerPage); 
	System.out.println("noticeList sql: " + stmt); // ๋””๋ฒ„๊น…
	
	// ๊ณต์ง€ ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅํ•˜๊ธฐ
	ResultSet rs = stmt.executeQuery();
	// ResultSetํƒ€์ž…(์ง‘ํ•ฉ ์ž๋ฃŒ๊ตฌ์กฐํƒ€์ž…)์„ ์ผ๋ฐ˜์ ์ธ ํƒ€์ž…(์ž๋ฐ” ๋ฐฐ์—ด ๋˜๋Š” ๊ธฐ๋ณธAPI์•ˆ์— ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ํƒ€์ž…์ธ List, Set, Map ๋“ฑ..)์œผ๋กœ ๋ฐ”๊พธ๊ธฐ
	// ResultSet -> ArrayList<Notice>
	ArrayList<Notice> noticeList = new ArrayList<Notice>();
	while(rs.next()) {
		Notice n = new Notice();
		n.noticeNo = rs.getInt("noticeNo"); // ์ด๋ฆ„์ด ๋ถˆ์ผ์น˜ // sql ์ž‘์„ฑ์‹œ ๋ณ„๋ช…์œผ๋กœ ๋ฐ›์•„์„œ ํ†ต์ผ์‹œ์ผœ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์Œ
		n.noticeTitle = rs.getString("noticeTitle");
		n.createdate = rs.getString("createdate");
		noticeList.add(n);
	}
	
	// ๋ฐ์ดํ„ฐ ์ด ๊ฐฏ์ˆ˜
	// select count(*) from notice
	PreparedStatement stmt2 = conn.prepareStatement("select count(*) from notice");
	ResultSet rs2 = stmt2.executeQuery();
	int totalRow = 0;
	if(rs2.next()) {
		totalRow = rs2.getInt("count(*)"); // ์ด ResultSet์€ ๊ตณ์ด ๋ฐ”๊ฟ€ ํ•„์š” ์—†์Œ // ์ด๋ฏธ intํƒ€์ž…์ธ totalRow๋ผ๋Š” ๋ณ€์ˆ˜๋กœ ๋ฐ”๋€Œ์—ˆ๊ธฐ ๋•Œ๋ฌธ
	}
	
	// ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€
	int lastPage = totalRow / rowPerPage;
	if(totalRow % rowPerPage != 0) { // ํŽ˜์ด์ง€๊ฐ€ ๋”ฑ ๋‚˜๋ˆ„์–ด๋–จ์–ด์ง€์ง€ ์•Š์œผ๋ฉด ํ•œํŽ˜์ด์ง€๊ฐ€ ๋” ํ•„์š”ํ•˜๋‹ค
		lastPage = lastPage + 1;
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>noticeList.jsp</title>
<!-- ํฐํŠธ๋ณ€๊ฒฝ -->
	<link rel="preconnect" href="https://fonts.googleapis.com">
	<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
	<link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@600&display=swap" rel="stylesheet">
	<link href="https://fonts.googleapis.com/css2?family=Gowun+Dodum&display=swap" rel="stylesheet">
<!-- ๋ถ€ํŠธ์ŠคํŠธ๋žฉ5 -->
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
	<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
<style>
	a {text-decoration: none;}
	a:hover {text-decoration: underline;}
	.center {text-align: center;}
	.enFont {
		font-family: 'Comfortaa', cursive;
	}
	.krFont {
		font-family: 'Gowun Dodum', sans-serif;
	}
</style>
</head>
<body>
<div class="p-5 bg-warning text-white text-center">
  <h1 class="enFont">Diary Project</h1>
  <p class="krFont">๊ฐœ๋ฐœํ™˜๊ฒฝ: Eclipse(2022-12), JDK(17.0.6), Mariadb(10.5.19), Apache Tomcat(10.1.7), HeidiSQL<br>์‚ฌ์šฉ์–ธ์–ด: java, sql, html, css, bootstrap5</p> 
</div>
<div class="container mt-3 center">
	<div><!-- ๋ฉ”์ธ๋ฉ”๋‰ด -->
		<a class="btn btn-warning krFont" href="./home.jsp">ํ™ˆ์œผ๋กœ</a>
		<a class="btn btn-outline-warning krFont" href="./noticeList.jsp">๊ณต์ง€ ๋ฆฌ์ŠคํŠธ</a> <!-- ์ตœ๊ทผ 10๊ฐœ์”ฉ -->
		<a class="btn btn-outline-warning krFont" href="./scheduleList.jsp">์ผ์ • ๋ฆฌ์ŠคํŠธ</a> <!-- ์ด๋ฒˆ๋‹ฌ ์ „์ฒด -->
	</div>
	<br>
	<table class="container">
		<tr>
			<td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
			<td>
				<h1 class="enFont"> &#x1F49B notice list &#x1F33B </h1> <!-- ์ถœ๋ ฅํ•  ๋• month +1 -->
			</td>
			<td>
				<a class="btn btn-outline-secondary btn-sm krFont" href="./insertNoticeForm.jsp">๊ณต์ง€์ž…๋ ฅ</a>
			</td>
		</tr>
	</table>	
	<table class="table">
		<thead class="table-warning h5 krFont">
		<tr>
			<th>๊ณต์ง€ ์ œ๋ชฉ</th>
			<th>์ž‘์„ฑ์ผ์ž</th>
		</tr>
		</thead>
		<tbody>
		<%
			// while(rs.next()) {
			for(Notice n : noticeList) {
		%>
			<tr>
				<td>
					<a class="krFont text-dark" href="./noticeOne.jsp?noticeNo=<%=n.noticeNo%>">
						<%=n.noticeTitle %>
					</a>
				</td>
				<td class="krFont"><%=n.createdate.substring(0, 10) %></td>
			</tr>
		<%
			}
		%>
		</tbody>
	</table>
	
	<%
		if(currentPage > 1) { // ์ด์ „์€ 1ํŽ˜์ด์ง€์—์„œ๋Š” ์ถœ๋ ฅ๋˜๋ฉด ์•ˆ๋œ๋‹ค
	%>
			<a class="krFont text-dark" href="./noticeList.jsp?currentPage=<%=currentPage-1%>">์ด์ „</a>
	<%
		}
 	%>
		<span class="enFont"> <%=currentPage%> </span> <!-- ํ˜„์žฌํŽ˜์ด์ง€ -->
	<%
		if(currentPage < lastPage) { // ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€์—์„œ๋Š” ๋‹ค์Œ์ด ์ด๋ ฅ๋˜๋ฉด ์•ˆ๋œ๋‹ค
	%>
			<a class="krFont text-dark" href="./noticeList.jsp?currentPage=<%=currentPage+1%>">๋‹ค์Œ</a>
	<%
		}
	%>
</div>
<div class="mt-5 p-4 bg-secondary text-white text-center krFont">
  <p>๊ตฌ๋””์•„์นด๋ฐ๋ฏธ GDJ 66๊ธฐ ๊น€ํฌ์ง„</p>
</div>
</body>
</html>



โœ” insertNoticeForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>insertNoticeForm.jsp</title>
<!-- ํฐํŠธ๋ณ€๊ฒฝ -->
	<link rel="preconnect" href="https://fonts.googleapis.com">
	<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
	<link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@600&display=swap" rel="stylesheet">
	<link href="https://fonts.googleapis.com/css2?family=Gowun+Dodum&display=swap" rel="stylesheet">
<!-- ๋ถ€ํŠธ์ŠคํŠธ๋žฉ5 -->
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
	<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
<style>
	a {text-decoration: none;}
	a:hover {text-decoration: underline;}
	.center {text-align: center;}
	.enFont {
		font-family: 'Comfortaa', cursive;
	}
	.krFont {
		font-family: 'Gowun Dodum', sans-serif;
	}
</style>
</head>
<body>
<div class="p-5 bg-warning text-white text-center">
  <h1 class="enFont">Diary Project</h1>
  <p class="krFont">๊ฐœ๋ฐœํ™˜๊ฒฝ: Eclipse(2022-12), JDK(17.0.6), Mariadb(10.5.19), Apache Tomcat(10.1.7), HeidiSQL<br>์‚ฌ์šฉ์–ธ์–ด: java, sql, html, css, bootstrap5</p> 
</div>
<div class="container mt-3 center krFont">
	<div><!-- ๋ฉ”์ธ๋ฉ”๋‰ด -->
		<a class="btn btn-warning" href="./home.jsp">ํ™ˆ์œผ๋กœ</a>
		<a class="btn btn-outline-warning" href="./noticeList.jsp">๊ณต์ง€ ๋ฆฌ์ŠคํŠธ</a> <!-- ์ตœ๊ทผ 10๊ฐœ์”ฉ -->
		<a class="btn btn-outline-warning" href="./scheduleList.jsp">์ผ์ • ๋ฆฌ์ŠคํŠธ</a> <!-- ์ด๋ฒˆ๋‹ฌ ์ „์ฒด -->
	</div>
	<br>
	<h1 class="krFont"> ๊ณต์ง€ ์ž‘์„ฑํ•˜๊ธฐ &#x1F4DD </h1>
	<div class="text-bg-danger" >
		<!-- ์—๋Ÿฌ๋ฌธ๊ตฌ ๋ฐœ์ƒ์‹œ -->
		<%
			if(request.getParameter("msg") != null) {
		%>
				<%=request.getParameter("msg") %>
		<%
			}
		%>
	</div>
	<form action="./insertNoticeAction.jsp" method="post">
		<table class="table container">
			<tr>
				<th class="table-warning">๊ณต์ง€ ์ œ๋ชฉ</th>
				<td>
					<input type="text" name="noticeTitle">
				</td>
			</tr>
			<tr>
				<th class="table-warning">๊ณต์ง€ ๋‚ด์šฉ</th>
				<td>
					<textarea rows="5" cols="80" name="noticeContent"></textarea>
				</td>
			</tr>
			<tr>
				<th class="table-warning">์ž‘์„ฑ์ž</th>
				<td>
					<input type="text" name="noticeWriter">
				</td>
			</tr>
			<tr>
				<th class="table-warning">๋น„๋ฐ€๋ฒˆํ˜ธ</th>
				<td>
					<input type="password" name="noticePw" placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”">
				</td>
			</tr>
		</table>
			<div>
			<a class="btn btn-outline-secondary" href="./noticeList.jsp">๋’ค๋กœ</a>
			<button type="submit" class="btn btn-outline-secondary">์ž‘์„ฑ</button>
		</div>
	</form>
</div>
<div class="mt-5 p-4 bg-secondary text-white text-center krFont">
  <p>๊ตฌ๋””์•„์นด๋ฐ๋ฏธ GDJ 66๊ธฐ ๊น€ํฌ์ง„</p>
</div>
</body>
</html>



โœ” insertNoticeAction.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.sql.Connection" %>
<%@ page import = "java.sql.DriverManager" %>
<%@ page import = "java.sql.PreparedStatement" %>
<%
	// post๋ฐฉ์‹ ์ธ์ฝ”๋”ฉ ์ฒ˜๋ฆฌ (ํ•œ๊ธ€ ๊นจ์ง€์ง€ ์•Š๊ฒŒ)
	request.setCharacterEncoding("utf-8");

	// validation (์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ’ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ)
	// ๊ณต๋ฐฑ๋„ ์žŠ์ง€ ๋ง๊ธฐ! ๊ณต๋ฐฑ์€ equals๋กœ
	String msg = null;
	if(request.getParameter("noticeTitle") == null
			|| request.getParameter("noticeTitle").equals("")) {
		msg = "Title is required!";
	} else if(request.getParameter("noticeContent") == null
			|| request.getParameter("noticeContent").equals("")) {
		msg = "Content is required!";
	} else if(request.getParameter("noticeWriter") == null
			|| request.getParameter("noticeWriter").equals("")) {
		msg = "Writer is required!";
	} else if(request.getParameter("noticePw") == null
			|| request.getParameter("noticePw").equals("")) {
		msg = "Password is required!";
	}
	System.out.println("insertNoticeAction msg: " + msg); // ๋””๋ฒ„๊น…
	
	if(msg != null) {
		response.sendRedirect("./insertNoticeForm.jsp?msg=" + msg);
		return;
	}

	// ๊ฐ’ ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„๋†“๊ธฐ
	String noticeTitle = request.getParameter("noticeTitle");
	String noticeContent = request.getParameter("noticeContent");
	String noticeWriter = request.getParameter("noticeWriter");
	String noticePw = request.getParameter("noticePw");
	
	// ๊ฐ’๋“ค์„ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์— ์ž…๋ ฅ(insert)
	/*
		insert into notice(
				notice_title, notice_content, notice_writer, notice_pw, createdate, updatedate
		) values(?,?,?,?,now(),now())
	*/
	
	// 1) ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉ
	Class.forName("org.mariadb.jdbc.Driver"); 
			
	// 2) mariadb ์„œ๋ฒ„์— ์ ‘์†, ์ ‘์† ์œ ์ง€
	Connection conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3306/diary","****","****");
	
	// 3) ์ฟผ๋ฆฌ ์ƒ์„ฑ ํ›„ ์‹คํ–‰
	String sql = "INSERT INTO notice(notice_title, notice_content, notice_writer, notice_pw, createdate, updatedate) values(?,?,?,?,now(),now())";
	PreparedStatement stmt = conn.prepareStatement(sql);
	// ? ์ด 4๊ฐœ (1~4)
	stmt.setString(1, noticeTitle);
	stmt.setString(2, noticeContent);
	stmt.setString(3, noticeWriter);
	stmt.setString(4, noticePw);
	System.out.println("insertNoticeAction sql: " + stmt); // ๋””๋ฒ„๊น…
	
	// 4) ์ฟผ๋ฆฌ๊ฐ€ ์ž˜ ์‹คํ–‰๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
	int row = stmt.executeUpdate(); // ๋””๋ฒ„๊น…์šฉ๋„, 1์ด๋ฉด 1ํ–‰ insert์„ฑ๊ณต/ 2๋ฉด 2ํ–‰ insert์„ฑ๊ณต / 0์ด๋ฉด insert๋œ ํ–‰์ด ์—†์Œ
	// conn.commit(); // conn.setAutoCommit์˜ ๋””ํดํŠธ๊ฐ’์ด ture์ด๋ฏ€๋กœ ์ž๋™ commit๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋žต
	if(row == 1) {
		System.out.println("insertNoticeAction ์ฟผ๋ฆฌ ์‹คํ–‰ ์„ฑ๊ณต");
	} else {
		System.out.println("insertNoticeAction ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹คํŒจ");
	}
	
	// view๊ฐ€ ์—†์œผ๋ฏ€๋กœ redirection
	response.sendRedirect("./noticeList.jsp");
%>



โœ” noticeOne.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.sql.Connection" %>
<%@ page import = "java.sql.DriverManager" %>
<%@ page import = "java.sql.PreparedStatement" %>
<%@ page import = "java.sql.ResultSet" %>
<%@ page import = "vo.*" %>
<%
	// ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
	if(request.getParameter("noticeNo") == null){
		response.sendRedirect("./noticeList.jsp");
		// ๋‹ค์‹œ ๋Œ์•„๊ฐ€์•ผํ•  ์ฃผ์†Œ๋ฅผ ์•Œ๋ ค์คŒ
		// ํŽ˜์ด์ง€ ๋‹จ์œ„์˜ ํ”„๋กœ๊ทธ๋žจ์ด๋ฏ€๋กœ ๋‚ด๊ฐ€ ์„ค์ •ํ•œ ๋ฃจํŠธ๋Œ€๋กœ ๋„˜์–ด์˜ค์ง€ ์•Š์„์ˆ˜๋„(=noticeNo์˜ ๊ฐ’์ด null์ผ์ˆ˜๋„) ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
		return;
		// 1) ์ฝ”๋“œ์ง„ํ–‰์ข…๋ฃŒ 2) ๋ฐ˜ํ™˜๊ฐ’์„ ๋„˜๊ฒจ์คŒ
	}

	int noticeNo = Integer.parseInt(request.getParameter("noticeNo"));
	// noticeNo์˜ ๊ฐ’ ๊ฐ€์ ธ์™€์„œ intํƒ€์ž…์œผ๋กœ ๋ฐ”๊พธ๊ธฐ
	
	// 1) ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉ
	Class.forName("org.mariadb.jdbc.Driver");
	// 2) db ์„œ๋ฒ„ ์ ‘์†
	Connection conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3306/diary","****","****");
	// 3) ์ฟผ๋ฆฌ ์ž‘์„ฑ ํ›„ ์‹คํ–‰
	// ์ฟผ๋ฆฌ๋Š” ํ•ด๋‹น ํŽ˜์ด์ง€์— ์‚ฌ์šฉํ•˜๋Š” ์ •๋ณด์— ๋งž๊ฒŒ ๋‹ค์‹œ ์ž‘์„ฑ
	String sql = "SELECT notice_no noticeNo, notice_title noticeTitle, notice_content noticeContent, notice_writer noticeWriter, createdate, updatedate FROM notice WHERE notice_no = ?";
	// String sql = "select * from notice where notice_no = ?";
	// ๋„˜์–ด์˜ค๋Š” notice_no์˜ ๊ฐ’์ด ๊ณ„์† ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ?๋กœ ์ž…๋ ฅ
	PreparedStatement stmt = conn.prepareStatement(sql);
	stmt.setInt(1, noticeNo);
	// ?๋กœ ์ž…๋ ฅ๋œ notice_no์˜ ๊ฐ’์„ set๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ noticeNo๋กœ ๋ฐ”๊พธ๊ธฐ
	// ์ฒซ๋ฒˆ์งธ ? = 1 // 1๋ถ€ํ„ฐ ์„ผ๋‹ค
	System.out.println("noticeOne sql: " + stmt); // ๋””๋ฒ„๊น…
	
	ResultSet rs = stmt.executeQuery();
	// ResultSet -> ๋ฐ์ดํ„ฐ ํƒ€์ž…(Notice)์˜ ํด๋ž˜์Šค๋กœ ๋ฐ”๊พธ๊ธฐ
	Notice notice = null;
	// ํ•œ๋ฒˆ์— ์“ฐ๋ฉด Notice notice = new Notice();
	if(rs.next()) {
		notice = new Notice();
		notice.noticeNo = rs.getInt("noticeNo");
		notice.noticeTitle = rs.getString("noticeTitle");
		notice.noticeContent = rs.getString("noticeContent");
		notice.noticeWriter = rs.getString("noticeWriter");
		notice.createdate = rs.getString("createdate");
		notice.updatedate = rs.getString("updatedate");
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>noticeOne.jsp</title>
<!-- ํฐํŠธ๋ณ€๊ฒฝ -->
	<link rel="preconnect" href="https://fonts.googleapis.com">
	<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
	<link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@600&display=swap" rel="stylesheet">
	<link href="https://fonts.googleapis.com/css2?family=Gowun+Dodum&display=swap" rel="stylesheet">
<!-- ๋ถ€ํŠธ์ŠคํŠธ๋žฉ5 -->
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
	<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
<style>
	a {text-decoration: none;}
	a:hover {text-decoration: underline;}
	.center {text-align: center;}
	.enFont {
		font-family: 'Comfortaa', cursive;
	}
	.krFont {
		font-family: 'Gowun Dodum', sans-serif;
	}
</style>
</head>
<body>
<div class="p-5 bg-warning text-white text-center">
  <h1 class="enFont">Diary Project</h1>
  <p class="krFont">๊ฐœ๋ฐœํ™˜๊ฒฝ: Eclipse(2022-12), JDK(17.0.6), Mariadb(10.5.19), Apache Tomcat(10.1.7), HeidiSQL<br>์‚ฌ์šฉ์–ธ์–ด: java, sql, html, css, bootstrap5</p> 
</div>
<div class="container mt-3 center krFont">
	<div><!-- ๋ฉ”์ธ๋ฉ”๋‰ด -->
		<a class="btn btn-warning krFont" href="./home.jsp">ํ™ˆ์œผ๋กœ</a>
		<a class="btn btn-outline-warning krFont" href="./noticeList.jsp">๊ณต์ง€ ๋ฆฌ์ŠคํŠธ</a> <!-- ์ตœ๊ทผ 10๊ฐœ์”ฉ -->
		<a class="btn btn-outline-warning krFont" href="./scheduleList.jsp">์ผ์ • ๋ฆฌ์ŠคํŠธ</a> <!-- ์ด๋ฒˆ๋‹ฌ ์ „์ฒด -->
	</div>
	<br>
	<h1 class="krFont">๊ณต์ง€ ์ƒ์„ธ๋ณด๊ธฐ &#x1F4DD </h1>
		<table class="table container">
				<tr>
					<th class="table-warning">๊ธ€๋ฒˆํ˜ธ</th>
					<td><%=notice.noticeNo%></td>
				</tr>
				<tr>
					<th class="table-warning">๊ณต์ง€ ์ œ๋ชฉ</th>
					<td><%=notice.noticeTitle%></td>
				</tr>
				<tr>
					<th class="table-warning">๊ณต์ง€ ๋‚ด์šฉ</th>
					<td><%=notice.noticeContent%></td>
				</tr>
				<tr>
					<th class="table-warning">์ž‘์„ฑ์ž</th>
					<td><%=notice.noticeWriter%></td>
				</tr>
				<tr>
					<th class="table-warning">์ž‘์„ฑ์ผ์ž</th>
					<td><%=notice.createdate.substring(0, 10)%></td>
				</tr>
				<tr>
					<th class="table-warning">์ˆ˜์ •์ผ์ž</th>
					<td><%=notice.updatedate.substring(0, 10)%></td>
				</tr>
		</table>
	<div class="center">
		<a class="btn btn-outline-secondary" href="./noticeList.jsp">๋’ค๋กœ</a>
		<!-- ์–ด๋–ค ๊ฒŒ์‹œ๊ธ€์„(noticeNo๋กœ ๊ตฌ๋ถ„) ์‚ญ์ œ/์ˆ˜์ •ํ• ์ง€ -->
		<a class="btn btn-outline-secondary" href="./updateNoticeForm.jsp?noticeNo=<%=noticeNo%>">์ˆ˜์ •</a>
		<a class="btn btn-outline-secondary" href="./deleteNoticeForm.jsp?noticeNo=<%=noticeNo%>">์‚ญ์ œ</a>
	</div>
</div>
<div class="mt-5 p-4 bg-secondary text-white text-center krFont">
  <p>๊ตฌ๋””์•„์นด๋ฐ๋ฏธ GDJ 66๊ธฐ ๊น€ํฌ์ง„</p>
</div>
</body>
</html>



โœ” updateNoticeForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.sql.Connection" %>
<%@ page import = "java.sql.DriverManager" %>
<%@ page import = "java.sql.PreparedStatement" %>
<%@ page import = "java.sql.ResultSet" %> <!-- ์ˆ˜์ •ํผ๋„ select ํ•ด์•ผํ•˜๋ฏ€๋กœ rs ์ด์šฉ -->
<%@ page import = "vo.*" %>
<%
	// ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
	// null์ผ ๊ฒฝ์šฐ ๋ฆฌ๋‹ค์ด๋ ‰์…˜
	// ๋ฆฌํ„ด // ์ฝ”๋“œ์ง„ํ–‰์ข…๋ฃŒ // ๋ฐ˜ํ™˜๊ฐ’์„ ๋„˜๊ธธ๋•Œ
	if(request.getParameter("noticeNo") == null) {
		response.sendRedirect("./noticeList.jsp");
		return;
	}
	
	// null์ด ์•„๋‹๊ฒฝ์šฐ
	// ๋ณ€์ˆ˜์— ๊ฐ’ ๋ฐ›๊ธฐ // int ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜
	int noticeNo = Integer.parseInt(request.getParameter("noticeNo"));
	System.out.println("updateNoticeForm noticeNo: " + noticeNo); // ๋””๋ฒ„๊น…
	
	// 1) ๋“œ๋ผ์ด๋ฒ„๋กœ๋”ฉ
	Class.forName("org.mariadb.jdbc.Driver"); 
	// 2) db์„œ๋ฒ„์— ์ ‘์†
	Connection conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3306/diary","****","****");
	// 3) ์ฟผ๋ฆฌ ์ž‘์„ฑ
	// ํ•ด๋‹น no์— ๋งž๋Š” ํŽ˜์ด์ง€ ์ถœ๋ ฅ == noticeOne ํŽ˜์ด์ง€์™€ ๊ฐ™์€ sql
	String sql = "SELECT notice_no noticeNo, notice_title noticeTitle, notice_content noticeContent, notice_writer noticeWriter, createdate, updatedate FROM notice WHERE notice_no = ?";
	PreparedStatement stmt = conn.prepareStatement(sql);
	// ์ฒซ๋ฒˆ์งธ ?์— noticeNo ๊ฐ’์„ set
	stmt.setInt(1, noticeNo);
	System.out.println("updateNoticeForm sql: " + stmt); // ๋””๋ฒ„๊น…
	
	ResultSet rs = stmt.executeQuery();
	// ResultSet -> ๋ฐ์ดํ„ฐ ํƒ€์ž…(Notice)์˜ ํด๋ž˜์Šค๋กœ ๋ฐ”๊พธ๊ธฐ
	Notice notice = null;
	// ํ•œ๋ฒˆ์— ์“ฐ๋ฉด Notice notice = new Notice();
	if(rs.next()) {
		notice = new Notice();
		notice.noticeNo = rs.getInt("noticeNo");
		notice.noticeTitle = rs.getString("noticeTitle");
		notice.noticeContent = rs.getString("noticeContent");
		notice.noticeWriter = rs.getString("noticeWriter");
		notice.createdate = rs.getString("createdate");
		notice.updatedate = rs.getString("updatedate");
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>updateNoticeForm.jsp</title>
<!-- ํฐํŠธ๋ณ€๊ฒฝ -->
	<link rel="preconnect" href="https://fonts.googleapis.com">
	<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
	<link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@600&display=swap" rel="stylesheet">
	<link href="https://fonts.googleapis.com/css2?family=Gowun+Dodum&display=swap" rel="stylesheet">
<!-- ๋ถ€ํŠธ์ŠคํŠธ๋žฉ5 -->
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
	<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
<style>
	a {text-decoration: none;}
	a:hover {text-decoration: underline;}
	.center {text-align: center;}
	.enFont {
		font-family: 'Comfortaa', cursive;
	}
	.krFont {
		font-family: 'Gowun Dodum', sans-serif;
	}
</style>
</head>
<body>
<div class="p-5 bg-warning text-white text-center">
  <h1 class="enFont">Diary Project</h1>
  <p class="krFont">๊ฐœ๋ฐœํ™˜๊ฒฝ: Eclipse(2022-12), JDK(17.0.6), Mariadb(10.5.19), Apache Tomcat(10.1.7), HeidiSQL<br>์‚ฌ์šฉ์–ธ์–ด: java, sql, html, css, bootstrap5</p> 
</div>
<div class="container mt-3 center krFont">
	<div><!-- ๋ฉ”์ธ๋ฉ”๋‰ด -->
		<a class="btn btn-warning" href="./home.jsp">ํ™ˆ์œผ๋กœ</a>
		<a class="btn btn-outline-warning" href="./noticeList.jsp">๊ณต์ง€ ๋ฆฌ์ŠคํŠธ</a> <!-- ์ตœ๊ทผ 10๊ฐœ์”ฉ -->
		<a class="btn btn-outline-warning" href="./scheduleList.jsp">์ผ์ • ๋ฆฌ์ŠคํŠธ</a> <!-- ์ด๋ฒˆ๋‹ฌ ์ „์ฒด -->
	</div>
	<br>
	<h1 class="krFont"> ๊ณต์ง€ ์ˆ˜์ •ํ•˜๊ธฐ &#x1F4DD </h1>
	<div class="text-bg-danger" >
		<!-- ์—๋Ÿฌ๋ฌธ๊ตฌ ๋ฐœ์ƒ์‹œ -->
		<%
			if(request.getParameter("msg") != null) {
		%>
				<%=request.getParameter("msg") %>
		<%
			}
		%>
	</div>
	<form action="./updateNoticeAction.jsp" method="post">
		<table class="table container">
			<tr>
				<!-- ์ˆ˜์ •๋ถˆ๊ฐ€์ง€๋งŒ, actionํŽ˜์ด์ง€์—์„œ where์ ˆ์— ๋“ค์–ด๊ฐ€์•ผํ•˜๋ฏ€๋กœ (๊ฐ’์„ ๋„˜๊ฒจ์•ผํ•˜๋ฏ€๋กœ) input type์€ hidden์œผ๋กœ ์ˆจ๊ธฐ๊ธฐ -->
				<th class="table-warning">๊ธ€๋ฒˆํ˜ธ</th>
				<td>
					<%=notice.noticeNo%> <!-- ๋‹จ์ˆœ ์ถœ๋ ฅ -->
					<input type="hidden" name="noticeNo" value="<%=notice.noticeNo%>">
				</td>
			</tr>
			<tr>
				<!-- ์ˆ˜์ •๊ฐ€๋Šฅ๋ž€, inputํƒœ๊ทธ -->
				<th class="table-warning">๊ณต์ง€ ์ œ๋ชฉ</th>
				<td>
					<input type="text" name="noticeTitle" value="<%=notice.noticeTitle%>">
				</td>
			</tr>
			<tr>
				<!-- ์ˆ˜์ •๊ฐ€๋Šฅ๋ž€, inputํƒœ๊ทธ -->
				<th class="table-warning">๊ณต์ง€ ๋‚ด์šฉ</th>
				<td>
					<textarea rows="5" cols="80" name="noticeContent"><%=notice.noticeContent%></textarea>
				</td>
			</tr>
			<tr>
				<!-- ์ˆ˜์ •๋ถˆ๊ฐ€๋ž€, ์ถœ๋ ฅ๋งŒ ํ•˜๊ธฐ -->
				<th class="table-warning">์ž‘์„ฑ์ž</th>
				<td>
					<%=notice.noticeWriter%>
				</td>
			</tr>
			<tr>
				<!-- ์ˆ˜์ •๋ถˆ๊ฐ€๋ž€, ์ถœ๋ ฅ๋งŒ ํ•˜๊ธฐ -->
				<th class="table-warning">์ƒ์„ฑ์ผ์ž</th>
				<td>
					<%=notice.createdate.substring(0, 10)%>
				</td>
			</tr>
			<tr>
				<!-- ์ˆ˜์ •๋ถˆ๊ฐ€๋ž€, ์ถœ๋ ฅ๋งŒ ํ•˜๊ธฐ -->
				<th class="table-warning">์ˆ˜์ •์ผ์ž</th>
				<td>
					<%=notice.updatedate.substring(0, 10)%>
				</td>
			</tr>
			<tr>
				<!-- ํŒจ์Šค์›Œ๋“œ์ž…๋ ฅ๋ž€, actionํŽ˜์ด์ง€์—์„œ where์ ˆ์— ๋“ค์–ด๊ฐ€์•ผํ•˜๋ฏ€๋กœ (๊ฐ’์„ ๋„˜๊ฒจ์•ผํ•˜๋ฏ€๋กœ) inputํƒœ๊ทธ -->
				<th class="table-warning">๋น„๋ฐ€๋ฒˆํ˜ธ</th>
				<td>
					<input type="password" name="noticePw" placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”">
				</td>
			</tr>
		</table>
		<div>
			<a class="btn btn-outline-secondary" href="./noticeOne.jsp?noticeNo=<%=noticeNo%>">๋’ค๋กœ</a>
			<button type="submit" class="btn btn-outline-secondary">์ˆ˜์ •</button>
		</div>
	</form>
</div>
<div class="mt-5 p-4 bg-secondary text-white text-center krFont">
  <p>๊ตฌ๋””์•„์นด๋ฐ๋ฏธ GDJ 66๊ธฐ ๊น€ํฌ์ง„</p>
</div>
</body>
</html>



โœ” updateNoticeAction.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.sql.Connection" %>
<%@ page import = "java.sql.DriverManager" %>
<%@ page import = "java.sql.PreparedStatement" %>
<%
	// post๋ฐฉ์‹ ์ธ์ฝ”๋”ฉ์ฒ˜๋ฆฌ // ํ•œ๊ธ€ ๊นจ์ง€์ง€ ์•Š๊ฒŒ
	request.setCharacterEncoding("utf-8");
	
	//์œ ํšจ์„ฑ ๊ฒ€์‚ฌ (1)
	// noticNo๊ฐ€ null์ด๋ฉด formํŽ˜์ด์ง€๋กœ ๊ฐˆ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ listํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜
	if(request.getParameter("noticeNo") == null) {
		response.sendRedirect("./noticeList.jsp");
		return; // ์ฝ”๋“œ์ง„ํ–‰์ข…๋ฃŒ
	}

	// ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ (2)
	// null ์ด๊ฑฐ๋‚˜ ๊ณต๋ฐฑ์ธ ๊ฒƒ์—๋”ฐ๋ผ ์—๋Ÿฌ๋ฉ”์„ธ์ง€(msg) ๋ถ„๊ธฐ
	String msg = null;
	if(request.getParameter("noticeTitle") == null
			|| request.getParameter("noticeTitle").equals("")) {
			msg = "Title is required!";
	} else if(request.getParameter("noticeContent") == null
			|| request.getParameter("noticeContent").equals("")) {
			msg = "Content is required!";
	} else if(request.getParameter("noticePw") == null
			|| request.getParameter("noticePw").equals("")) {
			msg = "Password is required!";
	}
	System.out.println("updateNoticeAction msg: " + msg); // ๋””๋ฒ„๊น…
	
	// msg ๋ฐœ์ƒ ์‹œ ์ˆ˜์ •ํผ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ // msg๋„ ์ถœ๋ ฅ๋˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ™์ด ๋„˜๊ฒจ์ค€๋‹ค
	if(msg != null) {
		response.sendRedirect("./updateNoticeForm.jsp?noticeNo=" + request.getParameter("noticeNo") + "&msg=" + msg);
		return; // ์ฝ”๋“œ์ง„ํ–‰์ข…๋ฃŒ
	}
	
	// null ์ด๊ฑฐ๋‚˜ ๊ณต๋ฐฑ์ด ์•„๋‹ ๊ฒฝ์šฐ
	// ๊ฐ’ ๋ณ€์ˆ˜์— ๋ฐ›๊ธฐ (ํ˜•๋ณ€ํ™˜)
	int noticeNo = Integer.parseInt(request.getParameter("noticeNo")); // intํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜
	String noticePw = request.getParameter("noticePw");
	String noticeTitle = request.getParameter("noticeTitle");
	String noticeContent = request.getParameter("noticeContent");
	
	// ๋””๋ฒ„๊น…
	// ์–ด๋А ํŽ˜์ด์ง€์˜ ์–ด๋–ค ๋””๋ฒ„๊น…์ธ์ง€๋„ ์ž˜ ์ ์–ด์ฃผ๊ธฐ
	System.out.println("updateNoticeAction noticeNo: " + noticeNo);
	System.out.println("updateNoticeAction noticePw: " + noticePw);
	System.out.println("updateNoticeAction noticeTitle: " + noticeTitle);
	System.out.println("updateNoticeAction noticeContent: " + noticeContent);
	
	// 1) ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉ
	Class.forName("org.mariadb.jdbc.Driver"); 
				
	// 2) mariadb ์„œ๋ฒ„์— ์ ‘์†, ์ ‘์† ์œ ์ง€
	Connection conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3306/diary","****","****");
		
	// 3) ์ฟผ๋ฆฌ ์ƒ์„ฑ ํ›„ ์‹คํ–‰
	// UPDATE notice SET notice_title=? , notice_content=? , updatedate=now() WHERE notice_no=? AND notice_pw=?
	String sql = "UPDATE notice SET notice_title=? , notice_content=? , updatedate=now() WHERE notice_no=? AND notice_pw=?";
	PreparedStatement stmt = conn.prepareStatement(sql);
	// ? ์ด 4๊ฐœ
	stmt.setString(1, noticeTitle);
	stmt.setString(2, noticeContent);
	stmt.setInt(3, noticeNo); // noticeNo๋Š” intํƒ€์ž…
	stmt.setString(4, noticePw);
	System.out.println("updateNoticeAction sql: " + stmt); // ๋””๋ฒ„๊น…
	
	// ์ฟผ๋ฆฌ๊ฐ€ ์ž˜ ์‹คํ–‰๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
	int row = stmt.executeUpdate(); // ์ˆ˜์ • ์„ฑ๊ณต์‹œ 1, ์‹คํŒจ์‹œ 0
	System.out.println("updateNoticeAction row: " + row);
	
	// ์ˆ˜์ • ์„ฑ๊ณต ์œ ๋ฌด์— ๋”ฐ๋ผ ๋ฆฌ๋‹ค์ด๋ ‰์…˜
	// = ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ํŽ˜์ด์ง€(View)๋ฅผ ๋ถ„๊ธฐํ•œ๋‹ค
	if(row == 0) { // ํŒจ์Šค์›Œ๋“œ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
		msg = "incorrect Password!";
		response.sendRedirect("./updateNoticeForm.jsp?noticeNo=" + noticeNo + "&msg=" + msg);
		// formํŽ˜์ด์ง€๋กœ // msg ๋ฐœ์ƒ
   	} else if(row == 1) { // ์ฟผ๋ฆฌ ์‹คํ–‰ ์„ฑ๊ณต
      response.sendRedirect("./noticeOne.jsp?noticeNo="+noticeNo);
   		// ํ™•์ธ์„ ์œ„ํ•ด ์ƒ์„ธํŽ˜์ด์ง€(noticeOne)๋กœ
  	} else { // ๊ทธ ์™ธ ๊ฒฝ์šฐ์˜ ์—๋Ÿฌ ๋ฐœ์ƒ์€ update๋ฌธ ์‹คํ–‰์„ ์ทจ์†Œ(rollback)ํ•ด์•ผ ํ•œ๋‹ค
      System.out.println("error ๋ฐœ์ƒ row๊ฐ’ : "+row);
 	}

%>



โœ” deleteNoticeForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.sql.*" %>
<%@ page import = "vo.*" %>
<%
	// ์š”์ฒญ๊ฐ’ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
	if(request.getParameter("noticeNo") == null
			|| request.getParameter("noticeNo").equals("")) {
		response.sendRedirect("./noticeList.jsp");
		return; // 1) ์ฝ”๋“œ์ง„ํ–‰์ข…๋ฃŒ 2) ๋ฐ˜ํ™˜๊ฐ’์„ ๋„˜๊ธธ๋•Œ
	}
	
	// ๊ฐ’ ๋ณ€์ˆ˜์— ๋ฐ›๊ธฐ
	// int ํƒ€์ž…์ด๋ฏ€๋กœ Integer.parseInt
	int noticeNo = Integer.parseInt(request.getParameter("noticeNo"));
	System.out.println("deleteNoticeForm noticeNo: " + noticeNo); // ๋””๋ฒ„๊น…ํ•  ๋•Œ ์˜†์— ์„ค๋ช…๋„ ์ž˜ ๋„ฃ๊ธฐ
	
	// 1) ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉ
	Class.forName("org.mariadb.jdbc.Driver"); 
	// 2) db ์„œ๋ฒ„ ์ ‘์†
	Connection conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3306/diary","****","****");
	// 3) ์ฟผ๋ฆฌ ์ž‘์„ฑ ๋ฐ ์‹คํ–‰
	// ์ฟผ๋ฆฌ๋Š” ํ•ด๋‹น ํŽ˜์ด์ง€์— ์‚ฌ์šฉํ•˜๋Š” ์ •๋ณด์— ๋งž๊ฒŒ ๋‹ค์‹œ ์ž‘์„ฑ
	String sql = "SELECT notice_no noticeNo, notice_title noticeTitle, notice_content noticeContent, notice_writer noticeWriter, createdate, updatedate FROM notice WHERE notice_no = ?";
	// String sql = "select * from notice where notice_no = ?";
	// ๋„˜์–ด์˜ค๋Š” notice_no์˜ ๊ฐ’์ด ๊ณ„์† ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ?๋กœ ์ž…๋ ฅ
	PreparedStatement stmt = conn.prepareStatement(sql);
	stmt.setInt(1, noticeNo);
	// ?๋กœ ์ž…๋ ฅ๋œ notice_no์˜ ๊ฐ’์„ set๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ noticeNo๋กœ ๋ฐ”๊พธ๊ธฐ
	// ์ฒซ๋ฒˆ์งธ ? = 1 // 1๋ถ€ํ„ฐ ์„ผ๋‹ค
	System.out.println("deleteNoticeForm sql: " + stmt); // ๋””๋ฒ„๊น…
	
	ResultSet rs = stmt.executeQuery();
	// ResultSet -> ๋ฐ์ดํ„ฐ ํƒ€์ž…(Notice)์˜ ํด๋ž˜์Šค๋กœ ๋ฐ”๊พธ๊ธฐ
	Notice notice = null;
	// ํ•œ๋ฒˆ์— ์“ฐ๋ฉด Notice notice = new Notice();
	if(rs.next()) {
		notice = new Notice();
		notice.noticeNo = rs.getInt("noticeNo");
		notice.noticeTitle = rs.getString("noticeTitle");
		notice.noticeContent = rs.getString("noticeContent");
		notice.noticeWriter = rs.getString("noticeWriter");
		notice.createdate = rs.getString("createdate");
		notice.updatedate = rs.getString("updatedate");
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>deleteNoticeForm.jsp</title>
<!-- ํฐํŠธ๋ณ€๊ฒฝ -->
	<link rel="preconnect" href="https://fonts.googleapis.com">
	<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
	<link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@600&display=swap" rel="stylesheet">
	<link href="https://fonts.googleapis.com/css2?family=Gowun+Dodum&display=swap" rel="stylesheet">
<!-- ๋ถ€ํŠธ์ŠคํŠธ๋žฉ5 -->
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
	<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
<style>
	a {text-decoration: none;}
	a:hover {text-decoration: underline;}
	.center {text-align: center;}
	.enFont {
		font-family: 'Comfortaa', cursive;
	}
	.krFont {
		font-family: 'Gowun Dodum', sans-serif;
	}
</style>
</head>
<body>
<div class="p-5 bg-warning text-white text-center">
  <h1 class="enFont">Diary Project</h1>
  <p class="krFont">๊ฐœ๋ฐœํ™˜๊ฒฝ: Eclipse(2022-12), JDK(17.0.6), Mariadb(10.5.19), Apache Tomcat(10.1.7), HeidiSQL<br>์‚ฌ์šฉ์–ธ์–ด: java, sql, html, css, bootstrap5</p> 
</div>
<div class="container mt-3 center krFont">
	<div><!-- ๋ฉ”์ธ๋ฉ”๋‰ด -->
		<a class="btn btn-warning" href="./home.jsp">ํ™ˆ์œผ๋กœ</a>
		<a class="btn btn-outline-warning" href="./noticeList.jsp">๊ณต์ง€ ๋ฆฌ์ŠคํŠธ</a> <!-- ์ตœ๊ทผ 10๊ฐœ์”ฉ -->
		<a class="btn btn-outline-warning" href="./scheduleList.jsp">์ผ์ • ๋ฆฌ์ŠคํŠธ</a> <!-- ์ด๋ฒˆ๋‹ฌ ์ „์ฒด -->
	</div>
	<br>
	<h1 class="krFont"> ๊ณต์ง€ ์‚ญ์ œํ•˜๊ธฐ &#x1F4DD </h1>
	<div class="text-bg-danger" >
		<!-- ์—๋Ÿฌ๋ฌธ๊ตฌ ๋ฐœ์ƒ์‹œ -->
		<%
			if(request.getParameter("msg") != null) {
		%>
				<%=request.getParameter("msg") %>
		<%
			}
		%>
	</div>
	<form action="./deleteNoticeAction.jsp" method="post">
		<table class="table container">
			<tr>
				<!-- noticeNo๋Š” actionํŽ˜์ด์ง€๋กœ ๊ฐ’์„ ๋„˜๊ธฐ๊ณ  hidden์œผ๋กœ ์ˆจ๊ธฐ๊ธฐ -->
				<th class="table-warning">๊ธ€๋ฒˆํ˜ธ</th>
				<td>
					<%=notice.noticeNo%> <!-- ๋‹จ์ˆœ ์ถœ๋ ฅ -->
					<input type="hidden" name="noticeNo" value="<%=noticeNo%>">
				</td>
			</tr>
			<tr>
				<th class="table-warning">๊ณต์ง€ ์ œ๋ชฉ</th>
				<td><%=notice.noticeTitle%></td>
			</tr>
			<tr>
				<th class="table-warning">๊ณต์ง€ ๋‚ด์šฉ</th>
				<td><%=notice.noticeContent%></td>
			</tr>
			<tr>
				<th class="table-warning">์ž‘์„ฑ์ž</th>
				<td><%=notice.noticeWriter%></td>
			</tr>
			<tr>
				<th class="table-warning">์ž‘์„ฑ์ผ์ž</th>
				<td><%=notice.createdate.substring(0, 10)%></td>
			</tr>
			<tr>
				<th class="table-warning">์ˆ˜์ •์ผ์ž</th>
				<td><%=notice.updatedate.substring(0, 10)%></td>
			</tr>
			<tr>
				<th class="table-warning">๋น„๋ฐ€๋ฒˆํ˜ธ</th>
				<td>
					<!-- action ํŽ˜์ด์ง€์—์„œ pw๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ -->
					<input type="password" name="noticePw" placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”">
				</td>
			</tr>
		</table>
		<div>
			<a class="btn btn-outline-secondary" href="./noticeOne.jsp?noticeNo=<%=noticeNo%>">๋’ค๋กœ</a>
			<button type="submit" class="btn btn-outline-secondary">์‚ญ์ œ</button>
		</div>
	</form>
</div>
<div class="mt-5 p-4 bg-secondary text-white text-center krFont">
  <p>๊ตฌ๋””์•„์นด๋ฐ๋ฏธ GDJ 66๊ธฐ ๊น€ํฌ์ง„</p>
</div>
</body>
</html>



โœ” deleteNoticeAction.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.sql.Connection" %>
<%@ page import = "java.sql.DriverManager" %>
<%@ page import = "java.sql.PreparedStatement" %>
<%
	// ์š”์ฒญ๊ฐ’ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
	String msg = null;
	if(request.getParameter("noticeNo") == null
			|| request.getParameter("noticeNo").equals("")) {
		response.sendRedirect("./noticeList.jsp");
		// ๋น„์ •์ƒ์ ์ธ ์ ‘๊ทผ(noticeNo๊ฐ€ null์ด๊ฑฐ๋‚˜ ๊ณต๋ฐฑ)์€ listํŽ˜์ด์ง€๋กœ
		return;
	} else if(request.getParameter("noticePw") == null
			|| request.getParameter("noticePw").equals("")) {
		msg = "Password is required!"; // ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ null์ด๊ฑฐ๋‚˜ ๊ณต๋ฐฑ์ผ ๊ฒฝ์šฐ msg ๋ฐœ์ƒ
	}
	System.out.println("deleteNoticeAction msg: " + msg); // ๋””๋ฒ„๊น…
	
	// msg ๋ฐœ์ƒ ์‹œ ํ•ด๋‹น form ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ // msg๋„ ์ถœ๋ ฅ๋˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ™์ด ๋„˜๊ฒจ์ค€๋‹ค
	if(msg != null) {
		response.sendRedirect("./deleteNoticeForm.jsp?noticeNo=" + request.getParameter("noticeNo") + "&msg=" + msg);
		return;
	}

	// ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ๊ฑธ๋ฆฌ์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ ๊ฐ’ ๋ณ€์ˆ˜์— ๋ฐ›๊ธฐ
	int noticeNo = Integer.parseInt(request.getParameter("noticeNo"));
	String noticePw = request.getParameter("noticePw");
	
	// ๋””๋ฒ„๊น… // ์–ด๋””์—์„œ ์ถœ๋ ฅํ•˜๋Š” ๊ฑด์ง€๋„ ๊ฐ™์ด ์ ์–ด์ฃผ๊ธฐ
	System.out.println("deleteNoticeAction noticeNo: " + noticeNo);
	System.out.println("deleteNoticeAction noticePw: " + noticePw);
	
	// 1) ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉ
	Class.forName("org.mariadb.jdbc.Driver");
	// 2) mariadb ์„œ๋ฒ„์— ์ ‘์†, ์ ‘์† ์œ ์ง€
	Connection conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3306/diary","****","****");
	// 3) ์‚ญ์ œ ์ฟผ๋ฆฌ ์ƒ์„ฑ
	// storeNo์™€ storepw๊ฐ€ ๋ชจ๋‘ ์ผ์น˜ํ•ด์•ผํ•˜๋ฏ€๋กœ and์ ˆ ์‚ฌ์šฉ
	String sql = "DELETE FROM notice WHERE notice_no=? AND notice_pw=?";
	PreparedStatement stmt = conn.prepareStatement(sql);
	// ? ์ด 2๊ฐœ (1~2)
	stmt.setInt(1, noticeNo);
	stmt.setString(2, noticePw);
	System.out.println("deleteNoticeAction sql: " + stmt); // ๋””๋ฒ„๊น…
	
	// ์‚ญ์ œ ์ฟผ๋ฆฌ๊ฐ€ ์ž˜ ์‹คํ–‰๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
	int row = stmt.executeUpdate(); // ์ •์ƒ ์‹คํ–‰์‹œ 1, ์‹คํŒจ์‹œ 0
	System.out.println("deleteNoticeAction row: " + row);
	
	if(row == 0) { // 0์ผ๊ฒฝ์šฐ ํŒจ์Šค์›Œ๋“œ ์˜ค๋ฅ˜
		msg = "incorrect Password!";
		response.sendRedirect("./deleteNoticeForm.jsp?noticeNo=" + noticeNo + "&msg=" + msg);
	} else { // 1์ผ๊ฒฝ์šฐ ์ฟผ๋ฆฌ ์‹คํ–‰ ์„ฑ๊ณต
		response.sendRedirect("./noticeList.jsp");
	}
%>



โœ” scheduleList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.util.*" %> <!-- *๋กœ ๋ชจ๋“  ๋ช…๋ น์–ด๋ฅผ import ๊ฐ€๋Šฅ -->
<%@ page import = "java.sql.*" %>
<%@ page import = "vo.*" %>
<%
	// if๋ฌธ๋ณด๋‹ค ๋จผ์ € ์„ ์–ธ
	int targetYear = 0;
	int targetMonth = 0;
	
	// ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ // null์ด๋ฉด ์˜ค๋Š˜ ๋‚ ์งœ์˜ ๋…„์›”๊ฐ’ ์ฃผ๊ธฐ
	if (request.getParameter("targetYear") == null
			|| request.getParameter("targetMonth") == null) {
		Calendar c =  Calendar.getInstance();
		targetYear = c.get(Calendar.YEAR);
		targetMonth = c.get(Calendar.MONTH); // 0~11์›”์ด์ง€๋งŒ ์—ฌ๊ธฐ์„œ +1์„ ํ•˜๋ฉด ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊นจ์ง
	} else { // null์ด ์•„๋‹ ๊ฒฝ์šฐ ํ˜•๋ณ€ํ™˜
		targetYear = Integer.parseInt(request.getParameter("targetYear"));
		targetMonth = Integer.parseInt(request.getParameter("targetMonth"));
	}
	// ๋””๋ฒ„๊น…
	System.out.println("scheduleList targetYear: " + targetYear + "๋…„");
	System.out.println("scheduleList targetMonth: " + targetMonth + "์›”");
	
	// ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋‚ ์งœ ๊ตฌํ•˜๊ธฐ
	// ์˜ค๋Š˜ ๋‚ ์งœ (์˜ค๋Š˜ ๋‚ ์งœ๋ฅผ ํ‘œ์‹œํ•ด์ฃผ๊ธฐ ์œ„ํ•ด!)
	Calendar today = Calendar.getInstance();
	int todayYear = today.get(Calendar.YEAR);
	int todayMonth = today.get(Calendar.MONTH);
	int todayDate = today.get(Calendar.DATE);
	System.out.println("today: " + todayYear + "-" + todayMonth + "-" + todayDate);
	
	// targetMonth(์ถœ๋ ฅํ•  ์›”)์˜ 1์ผ๋กœ ์…‹ํŒ…
	Calendar targetDay = Calendar.getInstance();
	targetDay.set(Calendar.YEAR, targetYear);
	targetDay.set(Calendar.MONTH, targetMonth);
	targetDay.set(Calendar.DATE, 1);
	
	// ์…‹ํŒ…ํ•œ ๋’ค, api ๋‚ด๋ถ€์—์„œ ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝ๋œ ๊ฐ’ ๋‹ค์‹œ ๋ณ€์ˆ˜์— ๋„ฃ๊ธฐ
	/*
		๋…„23์›”12 ์ž…๋ ฅ Calendar API๋‚ด๋ถ€์—์„œ ๋…„24 ์›”1๋ณ€๊ฒฝ
		๋…„23์›”-1 ์ž…๋ ฅ Calendar API๋‚ด๋ถ€์—์„œ ๋…„22 ์›”12 ๋ณ€๊ฒฝ
	*/
	targetYear = targetDay.get(Calendar.YEAR);
	targetMonth = targetDay.get(Calendar.MONTH);
	System.out.println("scheduleList api ์‹คํ–‰ ํ›„ targetYear: " + targetYear + "๋…„");
	System.out.println("scheduleList api ์‹คํ–‰ ํ›„ targetMonth: " + targetMonth + "์›”");
	
	// targetMonth(์ถœ๋ ฅํ•  ์›”)์˜ 1์ผ์˜ ์š”์ผ ๊ตฌํ•˜๊ธฐ
	// DAY_OF_WEEK (์ผ์š”์ผ๋ถ€ํ„ฐ ํ† ์š”์ผ๊นŒ์ง€ 1,2,3,4,5,6,7)			
	int firstYoil = targetDay.get(Calendar.DAY_OF_WEEK);
	System.out.println("firstYoil: " + firstYoil);
	// 1์ผ ์•ž์˜ ๊ณต๋ฐฑ์นธ ์ˆ˜ ๊ตฌํ•˜๊ธฐ
	int startBlank = firstYoil - 1;
	System.out.println("startBlank: " + startBlank + "๊ฐœ");
	
	// targetMonth(์ถœ๋ ฅํ•  ์›”)์˜ ๋งˆ์ง€๋ง‰์ผ ๊ตฌํ•˜๊ธฐ
	// ActualMaximum ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋‚ ์งœ ์ค‘์— ๊ฐ€์žฅ ํฐ ๋‚ ์งœ ์ฆ‰, ๋งˆ์ง€๋ง‰ ๋‚ ์งœ
	int lastDate = targetDay.getActualMaximum(Calendar.DATE);
	System.out.println("lastDate: " + lastDate + "์ผ");
	// ๋งˆ์ง€๋ง‰์ผ ๋’ค์˜ ๊ณต๋ฐฑ์นธ ์ˆ˜ ๊ตฌํ•˜๊ธฐ
	int endBlank = 0;
	if((startBlank + lastDate) % 7 != 0 ) {
		endBlank = 7 - ((startBlank + lastDate) % 7);
		// ๋‚˜๋จธ์ง€๋Š” ๋งˆ์ง€๋ง‰ ์ค„์—์„œ ์ถœ๋ ฅ๋œ ์นธ ์ˆ˜์ด๋ฏ€๋กœ 7์—์„œ ๋นผ์ฃผ๋ฉด ๊ณต๋ฐฑ์นธ ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค
	}
	System.out.println("endBlank: " + endBlank + "๊ฐœ");
	
	// targetMonth(์ถœ๋ ฅํ•  ์›”)์˜ ์ด td์˜ ๊ฐฏ์ˆ˜
	int totalTd = startBlank + lastDate + endBlank;
	System.out.println("totalTd: ์ด " + totalTd + "๊ฐœ");
	
	// ์ „์›” ๋งˆ์ง€๋ง‰๋‚ ์งœ ๊ตฌํ•˜๊ธฐ
	Calendar preDate = Calendar.getInstance();
 	preDate.set(Calendar.YEAR, targetYear);
	preDate.set(Calendar.MONTH, targetMonth-1);
	int preEndDate = preDate.getActualMaximum(Calendar.DATE);
	
	// DB date๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
	// 1) ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉ
	Class.forName("org.mariadb.jdbc.Driver"); 	
	// 2) mariadb ์„œ๋ฒ„์— ์ ‘์†, ์ ‘์† ์œ ์ง€
	Connection conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3306/diary","****","****");
	// 3) ์ฟผ๋ฆฌ ์ƒ์„ฑ ํ›„ ์‹คํ–‰
	String sql = "SELECT schedule_no scheduleNo, DAY(schedule_date) scheduleDate, substr(schedule_memo, 1, 5) scheduleMemo, schedule_color scheduleColor FROM schedule WHERE YEAR(schedule_date)=? AND MONTH(schedule_date)=? ORDER BY MONTH(schedule_date) ASC;";
	PreparedStatement stmt = conn.prepareStatement(sql);
	stmt.setInt(1, targetYear);
	stmt.setInt(2, targetMonth + 1); // ์ž๋ฐ”API์™€ ๋งˆ๋ฆฌ์•„DB์˜ ์‹œ์ž‘์›”์ด 0๊ณผ 1๋กœ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— +1์„ ํ•ด์ค€๋‹ค
	System.out.println("scheduleList sql: " + stmt);
	
	ResultSet rs = stmt.executeQuery();
	// ResultSet -> ArrayList<Schedule>
	ArrayList<Schedule> scheduleList = new ArrayList<Schedule>();
	while(rs.next()) {
		Schedule s = new Schedule(); // rs์˜ ๊ฐฏ์ˆ˜๋งŒํผ ๋งŒ๋“ค์–ด์ง
		s.scheduleNo = rs.getInt("scheduleNo");
		s.scheduleDate = rs.getString("scheduleDate"); // ์‹ค์ œ๋กœ๋Š” day(์ผ)๋งŒ ๊ฐ€์ ธ์˜ด
		s.scheduleMemo = rs.getString("scheduleMemo"); // ๋ฉ”๋ชจ ์ „์ฒด๊ฐ€ ์•„๋‹Œ ์ผ๋ถ€(5๊ธ€์ž)๋งŒ ๊ฐ€์ ธ์˜ด
		s.scheduleColor = rs.getString("scheduleColor");
		scheduleList.add(s);
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>scheduleList.jsp</title>
<!-- ํฐํŠธ๋ณ€๊ฒฝ -->
	<link rel="preconnect" href="https://fonts.googleapis.com">
	<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
	<link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@600&display=swap" rel="stylesheet">
	<link href="https://fonts.googleapis.com/css2?family=Gowun+Dodum&display=swap" rel="stylesheet">
<!-- ๋ถ€ํŠธ์ŠคํŠธ๋žฉ5 -->
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
	<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
<style>
	a {text-decoration: none;}
	a:hover {text-decoration: underline;}
	.center {text-align: center;}
	.enFont {
		font-family: 'Comfortaa', cursive;
	}
	.krFont {
		font-family: 'Gowun Dodum', sans-serif;
	}
</style>
</head>
<body>
<div class="p-5 bg-warning text-white text-center">
  <h1 class="enFont">Diary Project</h1>
  <p class="krFont">๊ฐœ๋ฐœํ™˜๊ฒฝ: Eclipse(2022-12), JDK(17.0.6), Mariadb(10.5.19), Apache Tomcat(10.1.7), HeidiSQL<br>์‚ฌ์šฉ์–ธ์–ด: java, sql, html, css, bootstrap5</p> 
</div>
<div class="container mt-3 center">
	<div><!-- ๋ฉ”์ธ๋ฉ”๋‰ด -->
		<a class="btn btn-warning krFont" href="./home.jsp">ํ™ˆ์œผ๋กœ</a>
		<a class="btn btn-outline-warning krFont" href="./noticeList.jsp">๊ณต์ง€ ๋ฆฌ์ŠคํŠธ</a> <!-- ์ตœ๊ทผ 10๊ฐœ์”ฉ -->
		<a class="btn btn-outline-warning krFont" href="./scheduleList.jsp">์ผ์ • ๋ฆฌ์ŠคํŠธ</a> <!-- ์ด๋ฒˆ๋‹ฌ ์ „์ฒด -->
	</div>
	<br>
	<table class="container">
		<tr>
			<td>
				<a class="btn btn-outline-secondary btn-sm krFont" href="./scheduleList.jsp?targetYear=<%=targetYear%>&targetMonth=<%=targetMonth - 1%>">์ด์ „๋‹ฌ</a>
			</td>
			<td>
				<h1 class="enFont"> &#x1F49B <%=targetYear%>.<%=targetMonth + 1%> calendar &#x1F33B </h1> <!-- ์ถœ๋ ฅํ•  ๋• month +1 -->
			</td>
			<td>
				<a class="btn btn-outline-secondary btn-sm krFont" href="./scheduleList.jsp?targetYear=<%=targetYear%>&targetMonth=<%=targetMonth + 1%>">๋‹ค์Œ๋‹ฌ</a>
			</td>
		</tr>
	</table>
	<table class="table">
		<thead class="table-warning h5 krFont">
			<tr>
				<th>์ผ</th>
				<th>์›”</th>
				<th>ํ™”</th>
				<th>์ˆ˜</th>
				<th>๋ชฉ</th>
				<th>๊ธˆ</th>
				<th>ํ† </th>
			</tr>
		</thead>
		<tbody>
			<tr>
				<%
					for(int i=0; i<totalTd; i+=1) { // totalTd๋งŒํผ ์ถœ๋ ฅ
						if(i != 0 && i % 7 == 0) { // 7์นธ๋งˆ๋‹ค ์ค„๋ฐ”๊ฟˆ(tr)
				%>
							</tr><tr>
					<%
						}
						String tdStyle = "";
						int num = i - startBlank + 1; // td์— ์ถœ๋ ฅ๋˜๋Š” ์ผ
						if(num > 0 && num <= lastDate) { // ์ถœ๋ ฅ๋˜๋Š” ์ผ์€ 1์ผ~๋งˆ์ง€๋ง‰์ผ
							// ์˜ค๋Š˜ ๋‚ ์งœ ํ‘œ์‹œํ•ด์ฃผ๊ธฐ // tdStyle ๋ณ€์ˆ˜ ์ด์šฉ
							if(todayYear == targetYear
								&& todayMonth == targetMonth
								&& todayDate == num) {
								tdStyle ="background-color: #FFE08C;";
							}
							if(i % 7 == 0) { // ์ผ์š”์ผ
					%>
							<td style = "<%=tdStyle%>">
								<div class="h5 enFont"> <!-- num์ผ -->
									<a class="text-danger" href="./scheduleListByDate.jsp?y=<%=targetYear%>&m=<%=targetMonth%>&d=<%=num%>"><%=num%></a>
								</div>
								<div> <!-- ์ผ์ • memo ์ž˜๋ผ์„œ(5๊ธ€์ž๋งŒ) ๋ณด์—ฌ์ฃผ๊ธฐ -->
									<%
										for(Schedule s : scheduleList) { // ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ผ๋งˆ๋‹ค ๋ชจ๋“  ๊ฐ’์ด ์ถœ๋ ฅ๋จ
											if(num == Integer.parseInt(s.scheduleDate)) { // num์ผ๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฐ’๋งŒ ์ถœ๋ ฅ๋จ // num์€ intํƒ€์ž…์ด๋ฏ€๋กœ ๋งž์ถฐ์ฃผ๊ธฐ
									%>
												<div class="krFont" style="color: <%=s.scheduleColor%>"><%=s.scheduleMemo%></div>
												<!-- style์— color๊ฐ’ ๋„ฃ์–ด์ฃผ๊ธฐ -->
									<%
											}
										}
									%>
								</div>
							</td>
					<%
							} else if(i % 7 == 6) { // ํ† ์š”์ผ
					%>
							<td style = "<%=tdStyle%>">
								<div class="h5 enFont"> <!-- num์ผ -->
									<a class="text-primary" href="./scheduleListByDate.jsp?y=<%=targetYear%>&m=<%=targetMonth%>&d=<%=num%>"><%=num%></a>
								</div>
								<div> <!-- ์ผ์ • memo ์ž˜๋ผ์„œ(5๊ธ€์ž๋งŒ) ๋ณด์—ฌ์ฃผ๊ธฐ -->
									<%
										for(Schedule s : scheduleList) { // ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ผ๋งˆ๋‹ค ๋ชจ๋“  ๊ฐ’์ด ์ถœ๋ ฅ๋จ
											if(num == Integer.parseInt(s.scheduleDate)) { // num์ผ๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฐ’๋งŒ ์ถœ๋ ฅ๋จ // num์€ intํƒ€์ž…์ด๋ฏ€๋กœ ๋งž์ถฐ์ฃผ๊ธฐ
									%>
												<div class="krFont" style="color: <%=s.scheduleColor%>"><%=s.scheduleMemo%></div>
												<!-- style์— color๊ฐ’ ๋„ฃ์–ด์ฃผ๊ธฐ -->
									<%
											}
										}
									%>
								</div>
							</td>
					<%
							} else { // ๊ทธ ๋ฐ– ํ‰์ผ
					%>
							<td style = "<%=tdStyle%>">
								<div class="h5 enFont"> <!-- num์ผ -->
									<a class="text-dark" href="./scheduleListByDate.jsp?y=<%=targetYear%>&m=<%=targetMonth%>&d=<%=num%>"><%=num%></a>
								</div>
								<div> <!-- ์ผ์ • memo ์ž˜๋ผ์„œ(5๊ธ€์ž๋งŒ) ๋ณด์—ฌ์ฃผ๊ธฐ -->
									<%
										for(Schedule s : scheduleList) { // ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ผ๋งˆ๋‹ค ๋ชจ๋“  ๊ฐ’์ด ์ถœ๋ ฅ๋จ
											if(num == Integer.parseInt(s.scheduleDate)) { // num์ผ๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฐ’๋งŒ ์ถœ๋ ฅ๋จ // num์€ intํƒ€์ž…์ด๋ฏ€๋กœ ๋งž์ถฐ์ฃผ๊ธฐ
									%>
												<div class="krFont" style="color: <%=s.scheduleColor%>"><%=s.scheduleMemo%></div>
												<!-- style์— color๊ฐ’ ๋„ฃ์–ด์ฃผ๊ธฐ -->
									<%
											}
										}
									%>
								</div>
							</td>
				<%
							}	
						} else if(num < 1){ // 1์ผ ์ „
				%>
							<td class="text-black-50 h5 enFont">
								<%=preEndDate + num%>
							</td>
				<%			
						} else { // ๋งˆ์ง€๋ง‰๋‚  ์ดํ›„
				%>
							<td class="text-black-50 h5 enFont">
								<%=num - lastDate%>
							</td>
				<%
						}
					}
				%>
			</tr>
		</tbody>
	</table>
</div>
<div class="mt-5 p-4 bg-secondary text-white text-center krFont">
  <p>๊ตฌ๋””์•„์นด๋ฐ๋ฏธ GDJ 66๊ธฐ ๊น€ํฌ์ง„</p>
</div>
</body>
</html>



โœ” scheduleListByDate.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.sql.*" %> <!-- *๋กœ ๋ชจ๋“  ๋ช…๋ น์–ด๋ฅผ import ๊ฐ€๋Šฅ -->
<%@ page import = "java.util.*" %>
<%@ page import = "vo.*" %>
<%
	// ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
	// y, m, d์˜ ๊ฐ’์ด null ์ด๊ฑฐ๋‚˜ ๊ณต๋ฐฑ์ผ ๊ฒฝ์šฐ
	if(request.getParameter("y") == null
			|| request.getParameter("y").equals("")
			|| request.getParameter("m") == null
			|| request.getParameter("m").equals("")
			|| request.getParameter("d") == null
			|| request.getParameter("d").equals("")) {
		response.sendRedirect("./scheduleList.jsp");
		return;
	}
	
	//  y, m, d์˜ ๊ฐ’์ด null ์ด๊ฑฐ๋‚˜ ๊ณต๋ฐฑ์ด ์•„๋‹๊ฒฝ์šฐ ํ˜•๋ณ€ํ™˜
	int y = Integer.parseInt(request.getParameter("y"));
	int m = Integer.parseInt(request.getParameter("m")) + 1; // ์ž๋ฐ”API์—์„œ๋Š” 0์›”๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ +1์„ ํ•ด์ค€๋‹ค
	int d = Integer.parseInt(request.getParameter("d"));
	
	// ๋””๋ฒ„๊น…
	System.out.println("scheduleListByDate y: " + y);
	System.out.println("scheduleListByDate m: " + m);
	System.out.println("scheduleListByDate d: " + d);
	
	// yyyy-mm-dd ํ˜•์‹์— ๋งž์ถ”๊ธฐ ์œ„ํ•ด
	String strM = m+""; // ๊ณต๋ฐฑ ๋ถ™์—ฌ์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ Stringํƒ€์ž…์œผ๋กœ ๋ฐ”๊พธ๊ธฐ
	if(m<10) { // ์ผ์˜ ์ž๋ฆฌ ์ˆ˜๋ฉด ์•ž์— 0 ๋ถ™์—ฌ์ฃผ๊ธฐ
		strM = "0" + strM;
	}
	String strD = d+"";
	if(d<10) {
		strD = "0" + strD;
	}
	
	// ์Šค์ผ€์ค„ ๋ชฉ๋ก ๊ณต๊ฐ„์— ์ถœ๋ ฅ (์ผ๋ณ„ ์Šค์ผ€์ค„ ๋ฆฌ์ŠคํŠธ)
	// 1) ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉ
	Class.forName("org.mariadb.jdbc.Driver"); 	
	// 2) mariadb ์„œ๋ฒ„์— ์ ‘์†, ์ ‘์† ์œ ์ง€
	Connection conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3306/diary","****","****");
	// 3) ์ฟผ๋ฆฌ ์ƒ์„ฑ ํ›„ ์‹คํ–‰
	String sql = "SELECT schedule_no scheduleNo, schedule_date scheduleDate, schedule_time scheduleTime, schedule_memo scheduleMemo, schedule_color scheduleColor, createdate, updatedate FROM schedule WHERE schedule_date=? ORDER BY schedule_time DESC";
	PreparedStatement stmt = conn.prepareStatement(sql);
	stmt.setString(1, y + "-" + strM + "-" + strD); // yyyy-mm-dd ํ˜•์‹์— ๋งž์ถ”๊ธฐ
	System.out.println("scheduleListByDate sql: " + stmt);
	
	ResultSet rs = stmt.executeQuery();
	// ResultSet -> ArrayList<Schedule>
	ArrayList<Schedule> scheduleList = new ArrayList<Schedule>();
	while(rs.next()) {
		Schedule s = new Schedule(); // rs์˜ ๊ฐฏ์ˆ˜๋งŒํผ ๋งŒ๋“ค์–ด์ง
		s.scheduleNo = rs.getInt("scheduleNo");
		s.scheduleDate = rs.getString("scheduleDate"); // ์‹ค์ œ๋กœ๋Š” day(์ผ)๋งŒ ๊ฐ€์ ธ์˜ด
		s.scheduleTime = rs.getString("scheduleTime");
		s.scheduleMemo = rs.getString("scheduleMemo"); // ๋ฉ”๋ชจ ์ „์ฒด๊ฐ€ ์•„๋‹Œ ์ผ๋ถ€(5๊ธ€์ž)๋งŒ ๊ฐ€์ ธ์˜ด
		s.scheduleColor = rs.getString("scheduleColor");
		s.createdate = rs.getString("createdate");
		s.updatedate = rs.getString("updatedate");
		scheduleList.add(s);
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>scheduleListByDate.jsp</title>
<!-- ํฐํŠธ๋ณ€๊ฒฝ -->
	<link rel="preconnect" href="https://fonts.googleapis.com">
	<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
	<link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@600&display=swap" rel="stylesheet">
	<link href="https://fonts.googleapis.com/css2?family=Gowun+Dodum&display=swap" rel="stylesheet">
<!-- ๋ถ€ํŠธ์ŠคํŠธ๋žฉ5 -->
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
	<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
<style>
	a {text-decoration: none;}
	a:hover {text-decoration: underline;}
	.center {text-align: center;}
	.enFont {
		font-family: 'Comfortaa', cursive;
	}
	.krFont {
		font-family: 'Gowun Dodum', sans-serif;
	}
</style>
</head>
<body>
<div class="p-5 bg-warning text-white text-center">
  <h1 class="enFont">Diary Project</h1>
  <p class="krFont">๊ฐœ๋ฐœํ™˜๊ฒฝ: Eclipse(2022-12), JDK(17.0.6), Mariadb(10.5.19), Apache Tomcat(10.1.7), HeidiSQL<br>์‚ฌ์šฉ์–ธ์–ด: java, sql, html, css, bootstrap5</p> 
</div>
<div class="container mt-3 center krFont">
	<div><!-- ๋ฉ”์ธ๋ฉ”๋‰ด -->
		<a class="btn btn-warning krFont" href="./home.jsp">ํ™ˆ์œผ๋กœ</a>
		<a class="btn btn-outline-warning krFont" href="./noticeList.jsp">๊ณต์ง€ ๋ฆฌ์ŠคํŠธ</a> <!-- ์ตœ๊ทผ 10๊ฐœ์”ฉ -->
		<a class="btn btn-outline-warning krFont" href="./scheduleList.jsp">์ผ์ • ๋ฆฌ์ŠคํŠธ</a> <!-- ์ด๋ฒˆ๋‹ฌ ์ „์ฒด -->
	</div>
	<br>
	<!-- ์Šค์ผ€์ค„ ์ž…๋ ฅ ๊ณต๊ฐ„ -->
	<h1> ์ผ์ • ์ถ”๊ฐ€ํ•˜๊ธฐ &#x1F4DD </h1>
	<div class="text-bg-danger" >
		<!-- ์—๋Ÿฌ๋ฌธ๊ตฌ ๋ฐœ์ƒ์‹œ -->
		<%
			if(request.getParameter("msg") != null) {
		%>
				<%=request.getParameter("msg") %>
		<%
			}
		%>
	</div>
	<form action="./insertScheduleAction.jsp" method="post">
		<table class="table container">
			<tr>
				<th class="table-warning">๋‚ ์งœ</th>
				<td>
					<input type="date" name="scheduleDate" value="<%=y%>-<%=strM%>-<%=strD%>" readonly="readonly">
					<!-- ์„ ํƒ๋œ ๋‚ ์งœ๋Š” ์ˆ˜์ • ์•ˆ๋˜๊ฒŒ readonly -->
				</td>
			</tr>
			<tr>
				<th class="table-warning">์‹œ๊ฐ„</th>
				<td>
					<input type="time" name="scheduleTime">
				</td>
			</tr>
			<tr>
				<th class="table-warning">์ƒ‰์ƒ</th>
				<td>
					<input type="color" name="scheduleColor" value="#000000">
				</td>
			</tr>
			<tr>
				<th class="table-warning">์ผ์ •๋ฉ”๋ชจ</th>
				<td>
					<textarea cols="80" rows="3" name="scheduleMemo"></textarea>
				</td>
			</tr>
			<tr>
				<th class="table-warning">๋น„๋ฐ€๋ฒˆํ˜ธ</th>
				<td>
					<input type="password" name="schedulePw" placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”">
				</td>
			</tr>
		</table>
		<div>
			<a class="btn btn-outline-secondary" href="./scheduleList.jsp">๋’ค๋กœ</a>
			<button type="submit" class="btn btn-outline-secondary">์ถ”๊ฐ€</button>
		</div>
	</form>
	<br><br>
	<!-- ์Šค์ผ€์ค„ ๋ชฉ๋ก ๊ณต๊ฐ„(์ผ๋ณ„ ์Šค์ผ€์ค„ ๋ฆฌ์ŠคํŠธ) -->
	<h1 class="krFont"> &#x1F49B <%=y%>.<%=m%>.<%=d%> ์ผ์ • ๋ชฉ๋ก &#x1F33B</h1>
	<table class="table">
		<thead class="table-warning h5 krFont">
			<tr>
				<th>์‹œ๊ฐ„</th>
				<th>์ผ์ • ๋ฉ”๋ชจ</th>
				<th>์ƒ์„ฑ์ผ์ž</th>
				<th>์ˆ˜์ •์ผ์ž</th>
				<th>์ˆ˜์ •</th>
				<th>์‚ญ์ œ</th>
			</tr>
		</thead>
		<tbody>
			<%
				for(Schedule s : scheduleList) {
			%>
					<tr>
						<td><%=s.scheduleTime.substring(0, 5)%></td>
						<td>
							<div style="color: <%=s.scheduleColor%>">
								<%=s.scheduleMemo%>
							</div>
						</td>
						<td><%=s.createdate.substring(0, 10)%></td>
						<td><%=s.updatedate.substring(0, 10)%></td>
						<td>
							<a class="btn btn-outline-secondary" href="./updateScheduleForm.jsp?scheduleNo=<%=s.scheduleNo%>">์ˆ˜์ •</a>
						</td>
						<td>
							<a class="btn btn-outline-secondary" href="./deleteScheduleForm.jsp?scheduleNo=<%=s.scheduleNo%>">์‚ญ์ œ</a>
						</td>
					</tr>
			<%
				}
			%>
		</tbody>
	</table>
</div>
<div class="mt-5 p-4 bg-secondary text-white text-center krFont">
  <p>๊ตฌ๋””์•„์นด๋ฐ๋ฏธ GDJ 66๊ธฐ ๊น€ํฌ์ง„</p>
</div>
</body>
</html>



โœ” insertScheduleAction.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.sql.*" %> <!-- *๋กœ ๋ชจ๋“  ๋ช…๋ น์–ด๋ฅผ import ๊ฐ€๋Šฅ -->
<%
	// ํ•œ๊ธ€ ๊นจ์ง€์ง€ ์•Š๊ฒŒ ์ธ์ฝ”๋”ฉ
	request.setCharacterEncoding("utf-8");

	// ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ(1) scheduleDate๊ฐ€ null์ด๊ฑฐ๋‚˜ ๊ณต๋ฐฑ์ผ ๊ฒฝ์šฐ
	if(request.getParameter("scheduleDate") == null
			|| request.getParameter("scheduleDate").equals("")) {
		response.sendRedirect("./scheduleList.jsp"); // ๋ฆฌ์ŠคํŠธํŽ˜์ด์ง€๋กœ
		return;
	}
	
	// scheduleDate๊ฐ€ null์ด๊ฑฐ๋‚˜ ๊ณต๋ฐฑ์ด ์•„๋‹ ๊ฒฝ์šฐ
	// ์„ ํƒํ•œ ๋‚ ์งœ ๊ฐ’ ๋ณ€์ˆ˜์— ๋„ฃ๊ธฐ
	String scheduleDate = request.getParameter("scheduleDate");
	System.out.println("insertScheduleAction scheduleDate: " + scheduleDate);
	// scheduleDate์˜ ๋ฐ์ดํ„ฐ๋ฅผ y,m,d ๋ณ€์ˆ˜์— ๋„ฃ๊ธฐ
	String y = scheduleDate.substring(0, 4);
	int m = Integer.parseInt(scheduleDate.substring(5,7)) - 1; // ๋„˜์–ด์˜จ m์˜ ๊ฐ’์€ +1ํ•œ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์—!
	String d = scheduleDate.substring(8);
	// ๋””๋ฒ„๊น…
	System.out.println("insertScheduleAction y: " + y);
	System.out.println("insertScheduleAction m: " + m);
	System.out.println("insertScheduleAction d: " + d);

	// ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ(2) null์ด๊ฑฐ๋‚˜ ๊ณต๋ฐฑ์ผ ๊ฒฝ์šฐ
	String msg = null;
	if(request.getParameter("scheduleTime") == null
			|| request.getParameter("scheduleTime").equals("")) {
		msg = "Time is required!";
	} else if(request.getParameter("scheduleColor") == null
			|| request.getParameter("scheduleColor").equals("")) {
		msg = "Color is required!";
	} else if(request.getParameter("scheduleMemo") == null
			|| request.getParameter("scheduleMemo").equals("")) {
		msg = "Memo is required!";
	} else if(request.getParameter("schedulePw") == null
			|| request.getParameter("schedulePw").equals("")) {
		msg = "Password is required!";
	}
	System.out.println("insertScheduleAction msg: " + msg); // ๋””๋ฒ„๊น…
	
	if(msg != null) {
		response.sendRedirect("./scheduleListByDate.jsp?y=" + y + "&m=" + m + "&d=" + d + "&msg=" + msg);
		// ์Šค์ผ€์ค„์ž…๋ ฅํŽ˜์ด์ง€๋กœ
		return;
	}
	
	// null์ด๊ฑฐ๋‚˜ ๊ณต๋ฐฑ์ด ์•„๋‹๊ฒฝ์šฐ
	// ๊ฐ’ ๋ณ€์ˆ˜์— ๋ฐ›๊ธฐ
	String scheduleTime = request.getParameter("scheduleTime");
	String scheduleColor = request.getParameter("scheduleColor");
	String scheduleMemo = request.getParameter("scheduleMemo");
	String schedulePw = request.getParameter("schedulePw");
	// ๋””๋ฒ„๊น…
	System.out.println("insertScheduleAction scheduleTime: " + scheduleTime);
	System.out.println("insertScheduleAction scheduleColor: " + scheduleColor);
	System.out.println("insertScheduleAction scheduleMemo: " + scheduleMemo);
	System.out.println("insertScheduleAction schedulePw: " + schedulePw);
	
	// 1) ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉ
	Class.forName("org.mariadb.jdbc.Driver"); 
				
	// 2) mariadb ์„œ๋ฒ„์— ์ ‘์†, ์ ‘์† ์œ ์ง€
	Connection conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3306/diary","****","****");
		
	// 3) ์ฟผ๋ฆฌ ์ƒ์„ฑ ํ›„ ์‹คํ–‰
	String sql = "INSERT into schedule(schedule_date, schedule_time, schedule_color, schedule_memo, schedule_pw, createdate, updatedate) values(?,?,?,?,?,now(),now())";
	PreparedStatement stmt = conn.prepareStatement(sql);
	// ? ์ด 4๊ฐœ (1~4)
	stmt.setString(1, scheduleDate);
	stmt.setString(2, scheduleTime);
	stmt.setString(3, scheduleColor);
	stmt.setString(4, scheduleMemo);
	stmt.setString(5, schedulePw);
	System.out.println("insertScheduleAction sql: " + stmt); // ๋””๋ฒ„๊น…
	
	// 4) ์ฟผ๋ฆฌ๊ฐ€ ์ž˜ ์‹คํ–‰๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
	int row = stmt.executeUpdate(); // ์„ฑ๊ณต์‹œ 1, ์‹คํŒจ์‹œ 0
	if(row == 1) {
		System.out.println("insertScheduleAction ์ฟผ๋ฆฌ ์‹คํ–‰ ์„ฑ๊ณต");
	} else {
		System.out.println("insertScheduleAction ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹คํŒจ");
	}
	
	// view๊ฐ€ ์—†์œผ๋ฏ€๋กœ insert ํ›„ ๋ฆฌ๋‹ค์ด๋ ‰์…˜
	response.sendRedirect("./scheduleListByDate.jsp?y=" + y + "&m=" + m + "&d=" + d);
%>



โœ” updateScheduleForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.sql.*" %> <!-- *๋กœ ๋ชจ๋“  ๋ช…๋ น์–ด๋ฅผ import ๊ฐ€๋Šฅ -->
<%@ page import = "vo.*" %>
<%
	// ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
	if(request.getParameter("scheduleNo") == null
			|| request.getParameter("scheduleNo").equals("")) {
		response.sendRedirect("./scheduleList.jsp"); // ๋ฆฌ์ŠคํŠธํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜
		return;
	}

	// null์ด๊ฑฐ๋‚˜ ๊ณต๋ฐฑ์ด ์•„๋‹ ๊ฒฝ์šฐ ๊ฐ’ ๋ณ€์ˆ˜์— ๋„ฃ๊ธฐ(ํ˜•๋ณ€ํ™˜)
	int scheduleNo = Integer.parseInt(request.getParameter("scheduleNo"));
	System.out.println("updateScheduleForm scheduleNo: " + scheduleNo);
	
	// 1) ๋“œ๋ผ์ด๋ฒ„๋กœ๋”ฉ
	Class.forName("org.mariadb.jdbc.Driver"); 
	// 2) db์„œ๋ฒ„์— ์ ‘์†
	Connection conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3306/diary","****","****");
	// 3) ์ฟผ๋ฆฌ ์ž‘์„ฑ (์ˆ˜์ •ํ•  ํŽ˜์ด์ง€๋ฅผ '์กฐํšŒ'ํ•ด์•ผํ•˜๋ฏ€๋กœ select๋ฌธ ์ž‘์„ฑ)
	// ๋ฐ›์•„์˜จ no์˜ ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š”(where) ๋‚ด์šฉ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
	String sql = "SELECT schedule_no scheduleNo, schedule_date scheduleDate, schedule_time scheduleTime, schedule_memo scheduleMemo, schedule_color scheduleColor, createdate, updatedate FROM schedule WHERE schedule_no=?";
	PreparedStatement stmt = conn.prepareStatement(sql);
	stmt.setInt(1, scheduleNo);
	System.out.println("updateScheduleForm sql: " + stmt); // ๋””๋ฒ„๊น…
	
	ResultSet rs = stmt.executeQuery();
	// ResultSet -> ๋ฐ์ดํ„ฐ ํƒ€์ž…(Schedule)์˜ ํด๋ž˜์Šค๋กœ ๋ฐ”๊พธ๊ธฐ
	Schedule schedule = null;
	if(rs.next()) {
		schedule = new Schedule();
		schedule.scheduleNo = rs.getInt("scheduleNo");
		schedule.scheduleDate = rs.getString("scheduleDate");
		schedule.scheduleTime = rs.getString("scheduleTime");
		schedule.scheduleMemo = rs.getString("scheduleMemo");
		schedule.scheduleColor = rs.getString("scheduleColor");
		schedule.createdate = rs.getString("createdate");
		schedule.updatedate = rs.getString("updatedate");
	}
	
	// scheduleDate์—์„œ y,m,d ๊ฐ’ ๋ฐ›๊ธฐ
	String y = schedule.scheduleDate.substring(0,4);
	int m = Integer.parseInt(schedule.scheduleDate.substring(5,7)) - 1; // ์ž๋ฐ” API๋Š” 0์›”๋ถ€ํ„ฐ ์‹œ์ž‘
	String d = schedule.scheduleDate.substring(8);
	System.out.println("home y: " + y);
	System.out.println("home m: " + m);
	System.out.println("home d: " + d);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>updateScheduleForm.jsp</title>
<!-- ํฐํŠธ๋ณ€๊ฒฝ -->
	<link rel="preconnect" href="https://fonts.googleapis.com">
	<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
	<link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@600&display=swap" rel="stylesheet">
	<link href="https://fonts.googleapis.com/css2?family=Gowun+Dodum&display=swap" rel="stylesheet">
<!-- ๋ถ€ํŠธ์ŠคํŠธ๋žฉ5 -->
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
	<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
<style>
	a {text-decoration: none;}
	a:hover {text-decoration: underline;}
	.center {text-align: center;}
	.enFont {
		font-family: 'Comfortaa', cursive;
	}
	.krFont {
		font-family: 'Gowun Dodum', sans-serif;
	}
</style>
</head>
<body>
<div class="p-5 bg-warning text-white text-center">
  <h1 class="enFont">Diary Project</h1>
  <p class="krFont">๊ฐœ๋ฐœํ™˜๊ฒฝ: Eclipse(2022-12), JDK(17.0.6), Mariadb(10.5.19), Apache Tomcat(10.1.7), HeidiSQL<br>์‚ฌ์šฉ์–ธ์–ด: java, sql, html, css, bootstrap5</p> 
</div>
<div class="container mt-3 center krFont">
	<div><!-- ๋ฉ”์ธ๋ฉ”๋‰ด -->
		<a class="btn btn-warning" href="./home.jsp">ํ™ˆ์œผ๋กœ</a>
		<a class="btn btn-outline-warning" href="./noticeList.jsp">๊ณต์ง€ ๋ฆฌ์ŠคํŠธ</a> <!-- ์ตœ๊ทผ 10๊ฐœ์”ฉ -->
		<a class="btn btn-outline-warning" href="./scheduleList.jsp">์ผ์ • ๋ฆฌ์ŠคํŠธ</a> <!-- ์ด๋ฒˆ๋‹ฌ ์ „์ฒด -->
	</div>
	<br>
	<h1> ์ผ์ • ์ˆ˜์ •ํ•˜๊ธฐ &#x1F4DD </h1>
	<div class="text-bg-danger" >
		<!-- ์—๋Ÿฌ๋ฌธ๊ตฌ ๋ฐœ์ƒ์‹œ -->
		<%
			if(request.getParameter("msg") != null) {
		%>
				<%=request.getParameter("msg") %>
		<%
			}
		%>
	</div>
	<form action="./updateScheduleAction.jsp" method="post">
	<!-- scheduleNo๋Š” action ํŽ˜์ด์ง€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ hidden์œผ๋กœ ์ˆจ๊ธฐ๊ธฐ -->
	<input type="hidden" name="scheduleNo" value="<%=schedule.scheduleNo%>">
		<table class="table container">
			<tr>
				<th class="table-warning">๋‚ ์งœ</th>
				<td>
					<!-- ์ˆ˜์ •๊ฐ€๋Šฅ๋ž€, inputํƒœ๊ทธ-->
					<input type="date" name="scheduleDate" value="<%=schedule.scheduleDate%>">
				</td>
			</tr>
			<tr>
				<!-- ์ˆ˜์ •๊ฐ€๋Šฅ๋ž€, inputํƒœ๊ทธ -->
				<th class="table-warning">์‹œ๊ฐ„</th>
				<td>
					<input type="time" name="scheduleTime" value="<%=schedule.scheduleTime%>">
				</td>
			</tr>
			<tr>
				<!-- ์ˆ˜์ •๊ฐ€๋Šฅ๋ž€, inputํƒœ๊ทธ -->
				<th class="table-warning">์ƒ‰์ƒ</th>
				<td>
					<input type="color" name="scheduleColor" value="<%=schedule.scheduleColor%>">
				</td>
			</tr>
			<tr>
				<!-- ์ˆ˜์ •๊ฐ€๋Šฅ๋ž€, inputํƒœ๊ทธ -->
				<th class="table-warning">์ผ์ •๋ฉ”๋ชจ</th>
				<td>
					<textarea cols="80" cols="3" name="scheduleMemo"><%=schedule.scheduleMemo%></textarea>
				</td>
			</tr>
			<tr>
				<!-- ์ˆ˜์ •๋ถˆ๊ฐ€๋ž€, ์ถœ๋ ฅ๋งŒ ํ•˜๊ธฐ -->
				<th class="table-warning">์ƒ์„ฑ์ผ์ž</th>
				<td>
					<%=schedule.createdate.substring(0, 10)%>
				</td>
			</tr>
			<tr>
				<!-- ์ˆ˜์ •๋ถˆ๊ฐ€๋ž€, ์ถœ๋ ฅ๋งŒ ํ•˜๊ธฐ -->
				<th class="table-warning">์ˆ˜์ •์ผ์ž</th>
				<td>
					<%=schedule.updatedate.substring(0, 10)%>
				</td>
			</tr>
			<tr>
				<!-- ํŒจ์Šค์›Œ๋“œ ์ž…๋ ฅ๋ž€, actionํŽ˜์ด์ง€์—์„œ where์ ˆ์— ๋“ค์–ด๊ฐ€์•ผํ•˜๋ฏ€๋กœ inputํƒœ๊ทธ -->
				<th class="table-warning">๋น„๋ฐ€๋ฒˆํ˜ธ</th>
				<td>
					<input type="password" name="schedulePw" placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”">
				</td>
			</tr>
		</table>
		<div>
			<a class="btn btn-outline-secondary" href="./scheduleListByDate.jsp?y=<%=y%>&m=<%=m%>&d=<%=d%>">๋’ค๋กœ</a>
			<button type="submit" class="btn btn-outline-secondary">์ˆ˜์ •</button>
		</div>
	</form>
</div>
<div class="mt-5 p-4 bg-secondary text-white text-center krFont">
  <p>๊ตฌ๋””์•„์นด๋ฐ๋ฏธ GDJ 66๊ธฐ ๊น€ํฌ์ง„</p>
</div>
</body>
</html>



โœ” updateScheduleAction.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.sql.*" %> <!-- *๋กœ ๋ชจ๋“  ๋ช…๋ น์–ด๋ฅผ import ๊ฐ€๋Šฅ -->
<%
	//ํ•œ๊ธ€ ๊นจ์ง€์ง€ ์•Š๊ฒŒ ์ธ์ฝ”๋”ฉ
	request.setCharacterEncoding("utf-8");

	// ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ (1) scheduleNo๊ฐ€ null์ผ ๊ฒฝ์šฐ
	if(request.getParameter("scheduleNo") == null) {
		response.sendRedirect("./scheduleList.jsp");
		return;
	}
	// scheduleNo๊ฐ€ null์ด ์•„๋‹๊ฒฝ์šฐ ๊ฐ’ ๋ณ€์ˆ˜์— ๋ฐ›๊ธฐ
	int scheduleNo = Integer.parseInt(request.getParameter("scheduleNo"));
	
	// ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ (2)
	// formํŽ˜์ด์ง€์—์„œ ์ž…๋ ฅํ•œ ๊ฐ’์ด null์ด๊ฑฐ๋‚˜ ๊ณต๋ฐฑ์ผ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ msg ๋ถ„๊ธฐ
	String msg = null;
	if(request.getParameter("scheduleDate") == null
			|| request.getParameter("scheduleDate").equals("")) {
		msg = "Date is required!";
	} else if(request.getParameter("scheduleTime") == null
			|| request.getParameter("scheduleTime").equals("")) {
		msg = "Time is required!";
	} else if(request.getParameter("scheduleColor") == null
			|| request.getParameter("scheduleColor").equals("")) {
		msg = "Color is required!";
	} else if(request.getParameter("scheduleMemo") == null
			|| request.getParameter("scheduleMemo").equals("")) {
		msg = "Memo is required!";
	} else if(request.getParameter("schedulePw") == null
			|| request.getParameter("schedulePw").equals("")) {
		msg = "Password is required!";
	}
	System.out.println("updateScheduleAction msg: " + msg); // ๋””๋ฒ„๊น…
	
	// msg ๋ฐœ์ƒ์‹œ ๋ฆฌ๋‹ค์ด๋ ‰์…˜
	if(msg != null) {
		response.sendRedirect("./updateScheduleForm.jsp?scheduleNo=" + scheduleNo + "&msg=" + msg);
		return;
	}
	
	// formํŽ˜์ด์ง€์—์„œ ์ž…๋ ฅํ•œ ๊ฐ’์ด null์ด๊ฑฐ๋‚˜ ๊ณต๋ฐฑ์ด ์•„๋‹ ๊ฒฝ์šฐ ๊ฐ’ ๋ณ€์ˆ˜์— ๋ฐ›๊ธฐ
	String scheduleDate = request.getParameter("scheduleDate");
	String scheduleTime = request.getParameter("scheduleTime");
	String scheduleColor = request.getParameter("scheduleColor");
	String scheduleMemo = request.getParameter("scheduleMemo");
	String schedulePw = request.getParameter("schedulePw");
	
	// ๋””๋ฒ„๊น…
	System.out.println("updateScheduleAction scheduleNo: " + scheduleNo);
	System.out.println("updateScheduleAction scheduleDate: " + scheduleDate);
	System.out.println("updateScheduleAction scheduleTime: " + scheduleTime);
	System.out.println("updateScheduleAction scheduleColor: " + scheduleColor);
	System.out.println("updateScheduleAction scheduleMemo: " + scheduleMemo);
	System.out.println("updateScheduleAction schedulePw: " + schedulePw);
	
	// scheduleDate์—์„œ y,m,d ๊ฐ’ ๋ฐ›๊ธฐ
	String y = scheduleDate.substring(0,4);
	int m = Integer.parseInt(scheduleDate.substring(5,7)) - 1; // ์ž๋ฐ” API๋Š” 0์›”๋ถ€ํ„ฐ ์‹œ์ž‘
	String d = scheduleDate.substring(8);
	System.out.println("updateScheduleAction y: " + y);
	System.out.println("updateScheduleAction m: " + m);
	System.out.println("updateScheduleAction d: " + d);
	
	// 1) ๋“œ๋ผ์ด๋ฒ„๋กœ๋”ฉ
	Class.forName("org.mariadb.jdbc.Driver"); 
	// 2) db์„œ๋ฒ„์— ์ ‘์†
	Connection conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3306/diary","****","****");
	// 3) ์ฟผ๋ฆฌ ์ž‘์„ฑ
	String sql = "UPDATE schedule SET schedule_date=?, schedule_time=?, schedule_color=?, schedule_memo=?, updatedate=now() WHERE schedule_no=? AND schedule_pw=?";
	PreparedStatement stmt = conn.prepareStatement(sql);
	// ? ์ด 5๊ฐœ
	stmt.setString(1, scheduleDate);
	stmt.setString(2, scheduleTime);
	stmt.setString(3, scheduleColor);
	stmt.setString(4, scheduleMemo);
	stmt.setInt(5, scheduleNo); // noticeNo๋Š” intํƒ€์ž…
	stmt.setString(6, schedulePw);
	System.out.println("updateScheduleAction sql: " + stmt); // ๋””๋ฒ„๊น…
	
	// ์ฟผ๋ฆฌ๊ฐ€ ์ž˜ ์‹คํ–‰๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ
	int row = stmt.executeUpdate(); // ์„ฑ๊ณต์‹œ 1, ์‹คํŒจ์‹œ 0
	System.out.println("updateScheduleAction row: " + row);
	
	// ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ(row๊ฐ’)์— ๋”ฐ๋ผ ๋ฆฌ๋‹ค์ด๋ ‰์…˜
	if(row == 0) { // 0์ผ ๊ฒฝ
    ์šฐ ํŒจ์Šค์›Œ๋“œ ์˜ค๋ฅ˜
		msg = "incorrect Password!";
		response.sendRedirect("./updateScheduleForm.jsp?scheduleNo=" + scheduleNo + "&msg=" + msg);
		// msg์™€ ํ•จ๊ป˜ formํŽ˜์ด์ง€๋กœ
	} else if(row == 1) { // 1์ผ ๊ฒฝ์šฐ ์ฟผ๋ฆฌ ์‹คํ–‰ ์„ฑ๊ณต
		response.sendRedirect("./scheduleListByDate.jsp?y=" + y + "&m=" + m + "&d=" + d);
		// ์ˆ˜์ •๋œ ํ™”๋ฉด ํ™•์ธ์„ ์œ„ํ•ด ListByDateํŽ˜์ด์ง€๋กœ
	}
%>



โœ” deleteScheduleForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.sql.*" %>
<%@ page import = "vo.*" %>
<%
	//์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
	if(request.getParameter("scheduleNo") == null
			|| request.getParameter("scheduleNo").equals("")) {
		response.sendRedirect("./scheduleList.jsp"); // ๋ฆฌ์ŠคํŠธํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜
		return;
	}

	//null์ด๊ฑฐ๋‚˜ ๊ณต๋ฐฑ์ด ์•„๋‹ ๊ฒฝ์šฐ ๊ฐ’ ๋ณ€์ˆ˜์— ๋„ฃ๊ธฐ(ํ˜•๋ณ€ํ™˜)
	int scheduleNo = Integer.parseInt(request.getParameter("scheduleNo")); // no๋Š” intํƒ€์ž…
	System.out.println("updateScheduleForm scheduleNo: " + scheduleNo);
	
	// 1) ๋“œ๋ผ์ด๋ฒ„๋กœ๋”ฉ
	Class.forName("org.mariadb.jdbc.Driver"); 
	// 2) db์„œ๋ฒ„์— ์ ‘์†
	Connection conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3306/diary","****","****");
	// 3) ์ฟผ๋ฆฌ ์ž‘์„ฑ (์ˆ˜์ •ํ•  ํŽ˜์ด์ง€๋ฅผ '์กฐํšŒ'ํ•ด์•ผํ•˜๋ฏ€๋กœ select๋ฌธ ์ž‘์„ฑ)
	// ๋ฐ›์•„์˜จ no์˜ ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š”(where) ๋‚ด์šฉ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
	String sql = "SELECT schedule_no scheduleNo, schedule_date scheduleDate, schedule_time scheduleTime, schedule_memo scheduleMemo, schedule_color scheduleColor, createdate, updatedate FROM schedule WHERE schedule_no=?";
	PreparedStatement stmt = conn.prepareStatement(sql);
	stmt.setInt(1, scheduleNo);
	System.out.println("updateScheduleForm sql: " + stmt); // ๋””๋ฒ„๊น…
	
	ResultSet rs = stmt.executeQuery();
	// ResultSet -> ๋ฐ์ดํ„ฐ ํƒ€์ž…(Schedule)์˜ ํด๋ž˜์Šค๋กœ ๋ฐ”๊พธ๊ธฐ
	Schedule schedule = null;
	if(rs.next()) {
		schedule = new Schedule();
		schedule.scheduleNo = rs.getInt("scheduleNo");
		schedule.scheduleDate = rs.getString("scheduleDate");
		schedule.scheduleTime = rs.getString("scheduleTime");
		schedule.scheduleMemo = rs.getString("scheduleMemo");
		schedule.scheduleColor = rs.getString("scheduleColor");
		schedule.createdate = rs.getString("createdate");
		schedule.updatedate = rs.getString("updatedate");
	}
	
	// scheduleDate์—์„œ y,m,d ๊ฐ’ ๋ฐ›๊ธฐ
	String y = schedule.scheduleDate.substring(0,4);
	int m = Integer.parseInt(schedule.scheduleDate.substring(5,7)) - 1; // ์ž๋ฐ” API๋Š” 0์›”๋ถ€ํ„ฐ ์‹œ์ž‘
	String d = schedule.scheduleDate.substring(8);
	System.out.println("home y: " + y);
	System.out.println("home m: " + m);
	System.out.println("home d: " + d);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>deleteScheduleForm.jsp</title>
<!-- ํฐํŠธ๋ณ€๊ฒฝ -->
	<link rel="preconnect" href="https://fonts.googleapis.com">
	<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
	<link href="https://fonts.googleapis.com/css2?family=Comfortaa:wght@600&display=swap" rel="stylesheet">
	<link href="https://fonts.googleapis.com/css2?family=Gowun+Dodum&display=swap" rel="stylesheet">
<!-- ๋ถ€ํŠธ์ŠคํŠธ๋žฉ5 -->
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
	<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
<style>
	a {text-decoration: none;}
	a:hover {text-decoration: underline;}
	.center {text-align: center;}
	.enFont {
		font-family: 'Comfortaa', cursive;
	}
	.krFont {
		font-family: 'Gowun Dodum', sans-serif;
	}
</style>
</head>
<body>
<div class="p-5 bg-warning text-white text-center">
  <h1 class="enFont">Diary Project</h1>
  <p class="krFont">๊ฐœ๋ฐœํ™˜๊ฒฝ: Eclipse(2022-12), JDK(17.0.6), Mariadb(10.5.19), Apache Tomcat(10.1.7), HeidiSQL<br>์‚ฌ์šฉ์–ธ์–ด: java, sql, html, css, bootstrap5</p> 
</div>
<div class="container mt-3 center krFont">
	<div><!-- ๋ฉ”์ธ๋ฉ”๋‰ด -->
		<a class="btn btn-warning" href="./home.jsp">ํ™ˆ์œผ๋กœ</a>
		<a class="btn btn-outline-warning" href="./noticeList.jsp">๊ณต์ง€ ๋ฆฌ์ŠคํŠธ</a> <!-- ์ตœ๊ทผ 10๊ฐœ์”ฉ -->
		<a class="btn btn-outline-warning" href="./scheduleList.jsp">์ผ์ • ๋ฆฌ์ŠคํŠธ</a> <!-- ์ด๋ฒˆ๋‹ฌ ์ „์ฒด -->
	</div>
	<br>
	<h1> ์ผ์ • ์‚ญ์ œํ•˜๊ธฐ &#x1F4DD </h1>
	<div class="text-bg-danger" >
		<!-- ์—๋Ÿฌ๋ฌธ๊ตฌ ๋ฐœ์ƒ์‹œ -->
		<%
			if(request.getParameter("msg") != null) {
		%>
				<%=request.getParameter("msg") %>
		<%
			}
		%>
	</div>
	<form action="./deleteScheduleAction.jsp" method="post">
	<!-- scheduleNo๋Š” action ํŽ˜์ด์ง€๋กœ ๊ฐ’์„ ๋„˜๊ธฐ๊ณ  hidden์œผ๋กœ ์ˆจ๊ธฐ๊ธฐ -->
	<input type="hidden" name="scheduleNo" value="<%=scheduleNo%>">
		<table class="table container">
			<tr>
				<th class="table-warning">๋‚ ์งœ</th>
				<td>
					<input type="date" name="scheduleDate" value="<%=schedule.scheduleDate%>" readonly="readonly">
				</td>
			</tr>
			<tr>
				<th class="table-warning">์‹œ๊ฐ„</th>
				<td>
					<input type="time" value="<%=schedule.scheduleTime%>" readonly="readonly">
				</td>
			</tr>
			<tr>
				<th class="table-warning">์ƒ‰์ƒ</th>
				<td>
					<input type="color" value="<%=schedule.scheduleColor%>" disabled="disabled">
				</td>
			</tr>
			<tr>
				<th class="table-warning">์ผ์ •๋ฉ”๋ชจ</th>
				<td><%=schedule.scheduleMemo%></td>
			</tr>
			<tr>
				<th class="table-warning">์ƒ์„ฑ์ผ์ž</th>
				<td><%=schedule.createdate.substring(0, 10)%></td>
			</tr>
			<tr>
				<th class="table-warning">์ˆ˜์ •์ผ์ž</th>
				<td><%=schedule.updatedate.substring(0, 10)%></td>
			</tr>
			<tr>
				<!-- ํŒจ์Šค์›Œ๋“œ ์ž…๋ ฅ๋ž€ -->
				<th class="table-warning">๋น„๋ฐ€๋ฒˆํ˜ธ</th>
				<td>
					<input type="password" name="schedulePw" placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”">
				</td>
			</tr>
		</table>
		<div>
			<a class="btn btn-outline-secondary" href="./scheduleListByDate.jsp?y=<%=y%>&m=<%=m%>&d=<%=d%>">๋’ค๋กœ</a>
			<button type="submit" class="btn btn-outline-secondary">์‚ญ์ œ</button>
		</div>
	</form>
</div>
<div class="mt-5 p-4 bg-secondary text-white text-center krFont">
  <p>๊ตฌ๋””์•„์นด๋ฐ๋ฏธ GDJ 66๊ธฐ ๊น€ํฌ์ง„</p>
</div>
</body>
</html>



โœ” deleteScheduleAction.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.sql.*" %>
<%
	// ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
	String msg = null;
	if(request.getParameter("scheduleNo") == null
			|| request.getParameter("scheduleNo").equals("")
			|| request.getParameter("scheduleDate") == null
			|| request.getParameter("scheduleDate").equals("")) {
		response.sendRedirect("./scheduleList.jsp");
		// null์ด๊ฑฐ๋‚˜ ๊ณต๋ฐฑ์ผ ๊ฒฝ์šฐ ๋ฆฌ์ŠคํŠธํŽ˜์ด์ง€๋กœ
		return;
	} else if(request.getParameter("schedulePw") == null
			|| request.getParameter("schedulePw").equals("")) {
		msg = "Password is required!";
		// ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ null์ด๊ฑฐ๋‚˜ ๊ณต๋ฐฑ์ผ ๊ฒฝ์šฐ msg ๋ฐœ์ƒ
	}
	System.out.println("deleteScheduleAction msg: " + msg); // ๋””๋ฒ„๊น…
	
	// ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ null์ด๊ฑฐ๋‚˜ ๊ณต๋ฐฑ์ผ ๊ฒฝ์šฐ (msg ๋ฐœ์ƒ) ๋ฆฌ๋‹ค์ด๋ ‰์…˜ // msg๋„ ์ถœ๋ ฅ๋˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ™์ด ๋„˜๊ฒจ์ค€๋‹ค
	if(msg != null) {
		response.sendRedirect("./deleteScheduleForm.jsp?scheduleNo=" + request.getParameter("scheduleNo") + "&scheduleDate=" + request.getParameter("scheduleDate") + "&msg=" + msg);
		return;
	}
	
	// ๊ฐ’ ๋ณ€์ˆ˜์— ๋ฐ›๊ธฐ
	int scheduleNo = Integer.parseInt(request.getParameter("scheduleNo")); // no๋Š” intํƒ€์ž…
	String scheduleDate = request.getParameter("scheduleDate");
	String schedulePw = request.getParameter("schedulePw");
	System.out.println("deleteScheduleAction scheduleNo: " + scheduleNo);
	System.out.println("deleteScheduleAction scheduleDate: " + scheduleDate);
	System.out.println("deleteScheduleAction schedulePw: " + schedulePw);
	
	// scheduleDate์—์„œ y,m,d ๊ฐ’ ๋ฐ›๊ธฐ
	String y = scheduleDate.substring(0,4);
	int m = Integer.parseInt(scheduleDate.substring(5,7)) - 1; // ์ž๋ฐ” API๋Š” 0์›”๋ถ€ํ„ฐ ์‹œ์ž‘
	String d = scheduleDate.substring(8);
	System.out.println("deleteScheduleAction y: " + y);
	System.out.println("deleteScheduleAction m: " + m);
	System.out.println("deleteScheduleAction d: " + d);
	
	// 1) ๋“œ๋ผ์ด๋ฒ„๋กœ๋”ฉ
	Class.forName("org.mariadb.jdbc.Driver"); 
	// 2) db์„œ๋ฒ„์— ์ ‘์†
	Connection conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3306/diary","****","****");
	// 3) ์ฟผ๋ฆฌ ์ž‘์„ฑ
	String sql = "DELETE FROM schedule WHERE schedule_no=? AND schedule_pw=?";
	PreparedStatement stmt = conn.prepareStatement(sql);
	// ? ์ด 2๊ฐœ
	stmt.setInt(1, scheduleNo);
	stmt.setString(2, schedulePw);
	System.out.println("deleteScheduleAction sql: " + stmt);
	
	// ์ฟผ๋ฆฌ๊ฐ€ ์ž˜ ์‹คํ–‰๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ
	int row = stmt.executeUpdate(); // ์„ฑ๊ณต์‹œ 1, ์‹คํŒจ์‹œ 0
	System.out.println("deleteScheduleAction row: " + row);
		
	// ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ(row๊ฐ’)์— ๋”ฐ๋ผ ๋ฆฌ๋‹ค์ด๋ ‰์…˜
	if(row == 0) { // 0์ผ ๊ฒฝ์šฐ ํŒจ์Šค์›Œ๋“œ ์˜ค๋ฅ˜
		msg = "incorrect schedulePw!";
		response.sendRedirect("./deleteScheduleForm.jsp?scheduleNo=" + scheduleNo + "&scheduleDate=" + scheduleDate + "&msg=" + msg);
		// msg์™€ ํ•จ๊ป˜ formํŽ˜์ด์ง€๋กœ
	} else if(row == 1) { // 1์ผ ๊ฒฝ์šฐ ์ฟผ๋ฆฌ ์‹คํ–‰ ์„ฑ๊ณต
		response.sendRedirect("./scheduleListByDate.jsp?y=" + y + "&m=" + m + "&d=" + d);
		// ์‚ญ์ œ ์„ฑ๊ณต์‹œ ํ™•์ธ์„ ์œ„ํ•ด ํ•ด๋‹น ListByDateํŽ˜์ด์ง€๋กœ
	}
%>



๐Ÿ˜Ž ํ”„๋กœ์ ํŠธ๋ฅผ ๋งˆ์น˜๋ฉฐ

์ฒ˜์Œ์œผ๋กœ ์–ด๋– ํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“ค์–ด๋‚ธ ๊ฒƒ ๊ฐ™์•„์„œ ์ •๋ง ๋ฟŒ๋“ฏํ–ˆ๋‹ค. ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์„ ๋“ค์—ฌ์„œ ๋‚ด๊ฐ€ ์›ํ•˜๋Š”๋Œ€๋กœ ๊ตฌํ˜„ํ•ด๊ฐ€๋Š” ๊ณผ์ •์„ ์ œ๋Œ€๋กœ ๊ฒฝํ—˜ํ•ด๋ณด๋ฉด์„œ, ๊ฐœ๋ฐœ์ž๋ผ๋Š” ์ง์ข…์ด ์–ด๋–ค ์ง์ข…์ธ์ง€์— ๋Œ€ํ•ด์„œ๋„ ๋งŽ์ด ๋А๋ผ๊ฒŒ๋œ ๊ธฐ๊ฐ„์ด์—ˆ๋‹ค. ๋น„์Šทํ•˜๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด์–ด๋„ ์ฃผ๋ณ€ ์‚ฌ๋žŒ๋“ค์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋ชจ๋‘ ๊ฐ์–‘๊ฐ์ƒ‰์ด์—ˆ๋‹ค. ์ฝ”๋“œ์— ์ •๋‹ต์€ ์—†๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ๋‚˜๋Š” ์™œ ์ด๋Ÿด๊นŒํ•˜๋ฉฐ ์กฐ๊ธ‰ํ•ดํ•˜๊ฑฐ๋‚˜ ๋ถˆ์•ˆํ•ดํ•˜์ง€ ๋ง๊ณ  ์ฒœ์ฒœํžˆ ๋‚˜๋งŒ์˜ ์Šคํƒ€์ผ์„ ๋งŒ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ๋‹ค์‹œ ํ•œ๋ฒˆ ๋‹ค์งํ–ˆ๋‹ค. ๋ฌผ๋ก  ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊พธ์ค€ํ•œ ๊ณต๋ถ€์™€ ์—ฐ์Šต์ด ํ•„์ˆ˜์ผ ๊ฒƒ์ด๋‹ค! ๐Ÿ‘

profile
ํ•˜๋ฃจ ํ•œ๊ฑธ์Œ์”ฉ๐Ÿ’ช ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž ๋„์ „๊ธฐ ๐ŸŒฑ๐Ÿ’ป

0๊ฐœ์˜ ๋Œ“๊ธ€