๐ŸŒฑ[๊ตฌ๋””์•„์นด๋ฐ๋ฏธ IT๊ตญ๋น„์ง€์›]

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

[๊ตฌ๋””์•„์นด๋ฐ๋ฏธ IT๊ตญ๋น„์ง€์›] SELECT๋ฌธ์˜ ORDER BY์ ˆ๊ณผ WHERE์ ˆ์„ ์ด์šฉํ•˜์—ฌ ์ •๋ ฌ ๊ธฐ๋Šฅ๊ณผ ์„ฑ๋ณ„ ๊ฒ€์ƒ‰๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์› ๋‹ค.


๐Ÿ’ก mariadb ๋ช…๋ นํ”„๋กฌํ”„ํŠธ(CMD)๋กœ ์ด์šฉํ•ด๋ณด๊ธฐ

์œˆ๋„์šฐ์ฐฝ์—์„œ mariadb cmd ์ฐฝ์„ ์‹คํ–‰์‹œํ‚จ๋‹ค.

๋กœ๊ทธ์ธ ํ›„ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ

show databases; ๋กœ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ๋ชฉ๋ก์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

use ๋ช…๋ น์–ด๋กœ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ์„ ํƒํ•˜๊ณ , show tables;๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ” ๋ชฉ๋ก์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

desc ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ํ•ด๋‹น ํ…Œ์ด๋ธ”์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

mariadb์— ์ž…๋ ฅํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ ์ž…๋ ฅํ•ด์„œ ๋˜‘๊ฐ™์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค!

๐Ÿ“Œ ์ƒ˜ํ”ŒDB๋ฅผ ์„ค์น˜ํ•ด๋ณด๋ ค๋ฉด?

  • cd ๋ช…๋ น์–ด๋กœ ์„ค์น˜ํ•  ์ƒ˜ํ”ŒDB ํŒŒ์ผ์˜ ์œ„์น˜๋กœ ์ด๋™ํ•œ๋‹ค
    (ex. cd c:\employees)

  • ์ด๋™ ํ›„ mysql -u ๊ณ„์ •์ด๋ฆ„ -p ์ž…๋ ฅ ํ›„ ๋น„๋ฐ€๋ฒˆํ˜ธ๋„ ์ž…๋ ฅํ•˜์—ฌ ๋กœ๊ทธ์ธ

  • source ํŒŒ์ผ๋ช…์œผ๋กœ ์„ค์น˜ํ•œ๋‹ค. (ex. source employees.sql)

  • HeidiSQL๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด ์ •์ƒ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๊ฐ€ ์„ค์น˜๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค!



๐Ÿ’ก SELECT๋ฌธ ORDER BY์ ˆ

select๋ฌธ์˜ order by์ ˆ์„ ์ด์šฉํ•˜์—ฌ ๊ฐ ์ปฌ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ, ๋‚ด๋ฆผ์ฐจ์ˆœ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์› ๋‹ค.
์ฐธ๊ณ ๋กœ order by์ ˆ์„ ์ƒ๋žตํ•  ๊ฒฝ์šฐ ๊ธฐ๋ณธํ‚ค ์ˆœ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ(์ž‘์€๊ฑฐ->ํฐ๊ฑฐ)์œผ๋กœ ์ •๋ ฌ๋œ๋‹ค!

๐Ÿ“ ์ž‘์„ฑ

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.sql.*" %>
<%@ page import = "java.util.*" %>
<%@ page import = "vo.*" %>
<%
	// ์ •๋ ฌ ๊ธฐ๋Šฅ
	
	// ํ˜„์žฌํŽ˜์ด์ง€ ์š”์ฒญ๊ฐ’ ๊ฒ€์‚ฌ
	int curPage = 1; // ํ˜„์žฌํŽ˜์ด์ง€๋Š” 1๋ถ€ํ„ฐ ์‹œ์ž‘
	if(request.getParameter("curPage") != null) { // ๋„˜์–ด์˜จ curPage๊ฐ€ null์ด๊ฑฐ๋‚˜ ๊ณต๋ฐฑ์ด ์•„๋‹ ๊ฒฝ์šฐ // ์ฆ‰, ์ด์ „ ๋˜๋Š” ๋‹ค์Œ์„ ๋ˆŒ๋ €์„ ๊ฒฝ์šฐ
		curPage = Integer.parseInt(request.getParameter("curPage")); // intํƒ€์ž…์œผ๋กœ ๊ฐ’ ๋ฐ›๊ธฐ
	}
	System.out.println("ํ˜„์žฌํŽ˜์ด์ง€: " + curPage + "ํŽ˜์ด์ง€");
	
	// ํŽ˜์ด์ง€๋‹น ์ถœ๋ ฅํ•  ํ–‰์ด ๋ช‡๊ฐœ์ธ์ง€
	int rowPerPage = 10;
	
	// ํŽ˜์ด์ง€๋‹น ์‹œ์ž‘ ํ–‰ ๋ฒˆํ˜ธ๊ฐ€ ๋ช‡๋ฒˆ์ธ์ง€
	int startRow = (curPage - 1) * rowPerPage;
	System.out.println("ํ˜„์žฌ ์‹œ์ž‘ ํ–‰๋ฒˆํ˜ธ: " + startRow + "๋ฒˆ");
	/*
	  curPage  startRow  rowPerPage
		1		0			30
		2		30			30
		3		60			30
		4		90			30
	*/

	// 1) ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉ
	Class.forName("org.mariadb.jdbc.Driver");
	// 2) mariadb ์„œ๋ฒ„ ์ ‘์†
	Connection conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3306/employees","****","****");
	// 3) ์ฟผ๋ฆฌ ์ƒ์„ฑ ํ›„ ์‹คํ–‰ // ํด๋ฆญํ•˜๋ฉด ์ •๋ ฌ์ด ๋ฐ”๋€” ์ˆ˜ ์žˆ๋„๋ก ORDER BY ์‚ฌ์šฉ
	/*
		SELECT
			emp_no empNo,
			birth_date birthDate,
			first_name firstName,
			last_name lastName,
			gender gender,
			hire_date hireDate
		FROM employees
		ORDER BY emp_no ASC // ํ•ด๋‹นํ•˜๋Š” ์ปฌ๋Ÿผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ์ด ๊ณ„์† ๋ฐ”๋€Œ๊ฒŒ ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด, emp_no ASC๊ฐ€ ๊ณ„์† ๋ฐ”๋€Œ์–ด์•ผํ•˜๋Š”๋ฐ ๊ฐ’์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ?๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†๋‹ค
		LIMIT ?, ?
	*/
	String col = "emp_no"; // ๊ทธ๋ž˜์„œ ๊ฐ๊ฐ ๋ณ€์ˆ˜๋กœ ๋‘”๋‹ค
	String ascDesc = "ASC"; // ๊ธฐ๋ณธ๊ฐ’์€ emp_no ASC
	if(request.getParameter("col") != null // ๊ฐ’์ด ๋„˜์–ด์™”์„ ๊ฒฝ์šฐ ๊ทธ ๊ฐ’์„ ๋ฐ›์•„์ค€๋‹ค
			&& request.getParameter("ascDesc") != null) {
		col = request.getParameter("col");
		ascDesc = request.getParameter("ascDesc");
	} // ORDER BY " + col + " " + ascDesc + " LIMIT // spl ์ž‘์„ฑํ•  ๋•Œ ์ค‘๊ฐ„์— ๊ณต๋ฐฑ๋„ ์ž˜ ๋„ฃ์–ด์ฃผ์–ด์•ผํ•จ
	String sql = "SELECT emp_no empNo, birth_date birthDate, first_name firstName, last_name lastName, gender gender, hire_date hireDate FROM employees ORDER BY " + col + " " + ascDesc + " LIMIT ?, ?";
	PreparedStatement stmt = conn.prepareStatement(sql);
	// ํ•œ ํŽ˜์ด์ง€๋‹น ๋ช‡๊ฐœ์”ฉ ์ถœ๋ ฅํ• ์ง€ limit ?,? ์‚ฌ์šฉ
	// startRow๋ฒˆ๋ถ€ํ„ฐ rowPerPage๊ฐœ์”ฉ ์ถœ๋ ฅ
	stmt.setInt(1, startRow);
	stmt.setInt(2, rowPerPage); 
	System.out.println("empList sql: " + stmt);
	
	ResultSet rs = stmt.executeQuery();
	// ResultSet -> ArrayList<Emp>
	ArrayList<Emp> empList = new ArrayList<Emp>();
	while(rs.next()) {
		Emp e = new Emp();
		e.empNo = rs.getInt("empNo");
		e.birthDate = rs.getString("birthDate");
		e.firstName = rs.getString("firstName");
		e.lastName = rs.getString("lastName");
		e.gender = rs.getString("gender");
		e.hireDate = rs.getString("hireDate");
		empList.add(e);
	}
	
	// ๋ฐ์ดํ„ฐ๊ฐ€ ์ด ๋ช‡ํ–‰์ธ์ง€ ๊ตฌํ•˜๊ธฐ count(*) ์‚ฌ์šฉ
	String sql2 = "SELECT count(*) FROM employees";
	PreparedStatement stmt2 = conn.prepareStatement(sql2);
	ResultSet rs2 = stmt2.executeQuery();
	System.out.println("empList sql2: " + stmt2);
	// ResultSet -> int totalRow์— ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค
	int totalRow = 0;
	if(rs2.next()) {
		totalRow = rs2.getInt("count(*)");
	}
	System.out.println("์ „์ฒด ๋ฐ์ดํ„ฐ ํ–‰์˜ ์ˆ˜: ์ด " + totalRow + "๊ฐœ");
	
	// ์ด ์ถœ๋ ฅ๋˜๋Š” ํŽ˜์ด์ง€์˜ ์ˆ˜(๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€ ๋„˜๋ฒ„) ๊ตฌํ•˜๊ธฐ
	int lastPage = totalRow / rowPerPage;
	if(totalRow % rowPerPage != 0) {
		lastPage = lastPage + 1; // ํŽ˜์ด์ง€๊ฐ€ ๋”ฑ ๋‚˜๋ˆ„์–ด๋–จ์–ด์ง€์ง€ ์•Š์œผ๋ฉด ํ•œํŽ˜์ด์ง€๊ฐ€ ๋” ํ•„์š”ํ•˜๋‹ค
	}
	System.out.println("๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€ ๋„˜๋ฒ„: " + lastPage + "ํŽ˜์ด์ง€");
	
	// ๋‚˜์ด ๊ณ„์‚ฐํ•˜๊ธฐ
	Calendar today = Calendar.getInstance(); // ์˜ค๋Š˜ ๋‚ ์งœ ๊ตฌํ•˜๊ธฐ
	// ์˜ค๋Š˜ ๋‚ ์งœ์˜ ๋…„๋„,์›”,์ผ ๋ณ€์ˆ˜์— ๋ฐ›๊ธฐ
	int todayYear = today.get(Calendar.YEAR);
	int todayMonth = today.get(Calendar.MONTH) + 1; // ์ž๋ฐ”api์™€ ๋งˆ๋ฆฌ์•„db์˜ ์›” ์‹œ์ž‘์ผ์ด ๋‹ค๋ฅด๋ฏ€๋กœ +1 ํ•ด์ค€๋‹ค (์ž๋ฐ”๋Š” 0์›”๋ถ€ํ„ฐ ์‹œ์ž‘)
	int todayDate = today.get(Calendar.DATE);
	System.out.println("todayYear: " + todayYear + "๋…„");
	System.out.println("todayMonth: " + todayMonth + "์›”");
	System.out.println("todayDate: " + todayDate + "์ผ");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>empList2.jsp</title>
	<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>
	.small {width: 30px; height: 30px;}
</style>
</head>
<body>
<div class="p-5 bg-primary text-white text-center">
	<h1>Employees List</h1>
</div>
<div class="container mt-3">
	<table class="table text-center">
		<thead class="table-primary">
			<tr><!-- ์ปฌ๋Ÿผ๋ช… -->
				<th>
					no
					<div>
						<a href="./empList2.jsp?col=emp_no&ascDesc=ASC">&#128316;</a>
						<a href="./empList2.jsp?col=emp_no&ascDesc=DESC">&#128317;</a>
					</div>
				</th>
				<th>
					age
					<div>
						<a href="./empList2.jsp?col=birth_date&ascDesc=ASC">&#128316;</a>
						<a href="./empList2.jsp?col=birth_date&ascDesc=DESC">&#128317;</a>
					</div>
				</th>
				<th>
					first name
					<div>
						<a href="./empList2.jsp?col=first_name&ascDesc=ASC">&#128316;</a>
						<a href="./empList2.jsp?col=first_name&ascDesc=DESC">&#128317;</a>
					</div>
				</th>
				<th>
					last name
					<div>
						<a href="./empList2.jsp?col=last_name&ascDesc=ASC">&#128316;</a>
						<a href="./empList2.jsp?col=last_name&ascDesc=DESC">&#128317;</a>
					</div>
				</th>
				<th>
					gender
					<div>
						<a href="./empList2.jsp?col=gender&ascDesc=ASC">&#128316;</a>
						<a href="./empList2.jsp?col=gender&ascDesc=DESC">&#128317;</a>
					</div>
				</th>
				<th>
					hire date
					<div>
						<a href="./empList2.jsp?col=hire_date&ascDesc=ASC">&#128316;</a>
						<a href="./empList2.jsp?col=hire_date&ascDesc=DESC">&#128317;</a>
					</div>
				</th>
			</tr>
		</thead>
		<tbody>
			<%
				for(Emp e : empList) {
			%>
				<tr>
					<td><%=e.empNo%>๋ฒˆ</td>
					<%
						// e.birthDate์—์„œ ๋…„๋„,์›”,์ผ intํƒ€์ž…์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ
						int birthYear = Integer.parseInt(e.birthDate.substring(0,4));
						int birthMonth = Integer.parseInt(e.birthDate.substring(5,7));
						int birthDate = Integer.parseInt(e.birthDate.substring(8));
						int age = todayYear - birthYear; // ๋‚˜์ด = ์˜ค๋Š˜๋…„๋„ - ํƒœ์–ด๋‚œ๋…„๋„
							
						if(birthMonth <= todayMonth && birthDate <= todayDate) {
								// ํ˜„์žฌ ์›”์ด ํƒœ์–ด๋‚œ ์›”๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ (์ด๋ฏธ ์ง€๋‚ฌ๊ฑฐ๋‚˜ ์ด๋ฒˆ๋‹ฌ์ด๊ณ )
								// ํ˜„์žฌ ์ผ์ด ํƒœ์–ด๋‚œ ์ผ๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด(์ด๋ฏธ ์ง€๋‚ฌ๊ฑฐ๋‚˜ ์˜ค๋Š˜์ด๋ฉด)
								// ์ƒ์ผ์ด ์ง€๋‚ฌ๊ฑฐ๋‚˜ ์˜ค๋Š˜์ด ์ƒ์ผ์ด๋ฏ€๋กœ +1์‚ด ํ•ด์ค€๋‹ค
								age = age + 1;
						}
					%>
					<td><%=age%>์„ธ</td>
					<td><%=e.firstName%></td>
					<td><%=e.lastName%></td>
					<td>
						<%
							if(e.gender.equals("M")) { // Stringํƒ€์ž…์ด๋ฏ€๋กœ equals ์‚ฌ์šฉ
						%>
								<img src="./img/m.JPG" class="small">
						<%
							} else {
						%>
								<img src="./img/f.JPG" class="small">
						<%
							}				
						%>
					</td>
					<td><%=e.hireDate%></td>
				</tr>
			<%
				}
			%>
		</tbody>
	</table>
</div>
	<div class="mt-5 p-4 bg-secondary text-white text-center">
		<%
			if(curPage > 1) { // ์ฒซ๋ฒˆ์งธ ํŽ˜์ด์ง€(1)๋ณด๋‹ค ํฐ ํŽ˜์ด์ง€๋ถ€ํ„ฐ "์ด์ „"์„ ์ถœ๋ ฅ
		%>
				<a href="./empList2.jsp?curPage=<%=curPage - 1%>&col=<%=col%>&ascDesc=<%=ascDesc%>" class="btn btn-primary btn-sm"> ์ด์ „ </a>
		<%
			}
		%>
			<%=curPage%>ํŽ˜์ด์ง€ <!-- ํ˜„์žฌํŽ˜์ด์ง€ ์ถœ๋ ฅ -->
		<%
			if(curPage < lastPage) { // ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€ ๋„˜๋ฒ„๋ณด๋‹ค ์ž‘์€ ํŽ˜์ด์ง€๊นŒ์ง€๋งŒ "๋‹ค์Œ"์„ ์ถœ๋ ฅ
		%>
				<a href="./empList2.jsp?curPage=<%=curPage + 1%>&col=<%=col%>&ascDesc=<%=ascDesc%>" class="btn btn-primary btn-sm"> ๋‹ค์Œ </a>
		<%
			}
		%>
	</div>
</body>
</html>
  • ๊ธฐ์ค€ ์นผ๋Ÿผ์ด ๋˜๋Š” ๋ณ€์ˆ˜ col๊ณผ ์˜ค๋ฆ„์ฐจ์ˆœ๊ณผ ๋‚ด๋ฆผ์ฐจ์ˆœ์„ ๊ฒฐ์ •ํ•  ๋ณ€์ˆ˜ ascDesc๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
  • ์ฟผ๋ฆฌ ์ž‘์„ฑ์‹œ ๋ณ€์ˆ˜๊ฐ€ ์ค‘๊ฐ„์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ ๊ณต๋ฐฑ์„ ์œ ์˜ํ•ด์•ผํ•œ๋‹ค!

๐Ÿ“ ๊ฒฐ๊ณผ

ํ•ด๋‹น ์ปฌ๋Ÿผ์˜ ํ™”์‚ดํ‘œ๋ฅผ ๋ˆ„๋ฅด๋ฉด, ํ•ด๋‹น ์ปฌ๋Ÿผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ๊ณผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ๋ฐ”๋€Œ๊ฒŒ๋œ๋‹ค.


๐Ÿ’ก SELECT๋ฌธ WHERE์ ˆ

์ด๋ฒˆ์—๋Š” select๋ฌธ์˜ where์ ˆ์„ ์ด์šฉํ•˜์—ฌ ์„ฑ๋ณ„ ๊ฒ€์ƒ‰๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ๋‹ค. if๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐ”๋€Œ๊ฒŒ ๋˜๋Š” ๊ฒƒ์„ ๋™์ ์ฟผ๋ฆฌ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋™์ ์ฟผ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋‹ค์–‘ํ•œ ๊ฒ€์ƒ‰์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ view๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค!

๐Ÿ“ ์ž‘์„ฑ

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.sql.*" %>
<%@ page import = "java.util.*" %>
<%@ page import = "vo.*" %>
<%
	// ์„ฑ๋ณ„ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
	
	// ํ˜„์žฌํŽ˜์ด์ง€ ์š”์ฒญ๊ฐ’ ๊ฒ€์‚ฌ
	int curPage = 1; // ํ˜„์žฌํŽ˜์ด์ง€๋Š” 1๋ถ€ํ„ฐ ์‹œ์ž‘
	if(request.getParameter("curPage") != null) { // ๋„˜์–ด์˜จ curPage๊ฐ€ null์ด๊ฑฐ๋‚˜ ๊ณต๋ฐฑ์ด ์•„๋‹ ๊ฒฝ์šฐ // ์ฆ‰, ์ด์ „ ๋˜๋Š” ๋‹ค์Œ์„ ๋ˆŒ๋ €์„ ๊ฒฝ์šฐ
		curPage = Integer.parseInt(request.getParameter("curPage")); // intํƒ€์ž…์œผ๋กœ ๊ฐ’ ๋ฐ›๊ธฐ
	}
	System.out.println("ํ˜„์žฌํŽ˜์ด์ง€: " + curPage + "ํŽ˜์ด์ง€");
	
	// ํŽ˜์ด์ง€๋‹น ์ถœ๋ ฅํ•  ํ–‰์ด ๋ช‡๊ฐœ์ธ์ง€
	int rowPerPage = 10;
	
	// ํŽ˜์ด์ง€๋‹น ์‹œ์ž‘ ํ–‰ ๋ฒˆํ˜ธ๊ฐ€ ๋ช‡๋ฒˆ์ธ์ง€
	int startRow = (curPage - 1) * rowPerPage;
	System.out.println("ํ˜„์žฌ ์‹œ์ž‘ ํ–‰๋ฒˆํ˜ธ: " + startRow + "๋ฒˆ");
	/*
	  curPage  startRow  rowPerPage
		1		0			30
		2		30			30
		3		60			30
		4		90			30
	*/
	
	// ์š”์ฒญ๊ฐ’ ๊ฒ€์‚ฌ
	String gender = "";
	if(request.getParameter("gender") != null) {
		gender = request.getParameter("gender");
	}
	// ๋“œ๋ผ์ด๋ฒ„ ๋กœ๋”ฉ // mariadb ์„œ๋ฒ„ ์ ‘์†
	Class.forName("org.mariadb.jdbc.Driver");
	Connection conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3306/employees","****","****");
	
	// ์ฟผ๋ฆฌ ๋จผ์ € ์ƒ์„ฑ // ์—ฌ๊ธฐ ์•ˆ์— ๋‹ค ๋“ค์–ด๊ฐ ๋‹ค์‹œ ์ž˜ ๋ณด๊ธฐ (๋™์ ์ฟผ๋ฆฌ)
	String sql = null;
	PreparedStatement stmt  = null;
	if(gender.equals("")) {
		sql = "SELECT emp_no empNo, birth_date birthDate, first_name firstName, last_name lastName, gender gender, hire_date hireDate FROM employees LIMIT ?, ?";
		stmt = conn.prepareStatement(sql); // ? 2๊ฐœ
		stmt.setInt(1, startRow);
		stmt.setInt(2, rowPerPage);
	} else { // where์ ˆ ์ถ”๊ฐ€
		sql = "SELECT emp_no empNo, birth_date birthDate, first_name firstName, last_name lastName, gender gender, hire_date hireDate FROM employees WHERE gender=? LIMIT ?, ?";
		stmt = conn.prepareStatement(sql); // ? 3๊ฐœ
		stmt.setString(1, gender);
		stmt.setInt(2, startRow);
		stmt.setInt(3, rowPerPage);
	}
	System.out.println("empList sql: " + stmt);
	
	ResultSet rs = stmt.executeQuery();
	// ResultSet -> ArrayList<Emp>
	ArrayList<Emp> empList = new ArrayList<Emp>();
	while(rs.next()) {
		Emp e = new Emp();
		e.empNo = rs.getInt("empNo");
		e.birthDate = rs.getString("birthDate");
		e.firstName = rs.getString("firstName");
		e.lastName = rs.getString("lastName");
		e.gender = rs.getString("gender");
		e.hireDate = rs.getString("hireDate");
		empList.add(e);
	}
	
	// ๋ฐ์ดํ„ฐ๊ฐ€ ์ด ๋ช‡ํ–‰์ธ์ง€ ๊ตฌํ•˜๊ธฐ count(*) ์‚ฌ์šฉ
	String sql2 = "SELECT count(*) FROM employees";
	PreparedStatement stmt2 = conn.prepareStatement(sql2);
	ResultSet rs2 = stmt2.executeQuery();
	System.out.println("empList sql2: " + stmt2);
	// ResultSet -> int totalRow์— ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค
	int totalRow = 0;
	if(rs2.next()) {
		totalRow = rs2.getInt("count(*)");
	}
	System.out.println("์ „์ฒด ๋ฐ์ดํ„ฐ ํ–‰์˜ ์ˆ˜: ์ด " + totalRow + "๊ฐœ");
	
	// ์ด ์ถœ๋ ฅ๋˜๋Š” ํŽ˜์ด์ง€์˜ ์ˆ˜(๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€ ๋„˜๋ฒ„) ๊ตฌํ•˜๊ธฐ
	int lastPage = totalRow / rowPerPage;
	if(totalRow % rowPerPage != 0) {
		lastPage = lastPage + 1; // ํŽ˜์ด์ง€๊ฐ€ ๋”ฑ ๋‚˜๋ˆ„์–ด๋–จ์–ด์ง€์ง€ ์•Š์œผ๋ฉด ํ•œํŽ˜์ด์ง€๊ฐ€ ๋” ํ•„์š”ํ•˜๋‹ค
	}
	System.out.println("๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€ ๋„˜๋ฒ„: " + lastPage + "ํŽ˜์ด์ง€");
	
	// ๋‚˜์ด ๊ณ„์‚ฐํ•˜๊ธฐ
	Calendar today = Calendar.getInstance(); // ์˜ค๋Š˜ ๋‚ ์งœ ๊ตฌํ•˜๊ธฐ
	// ์˜ค๋Š˜ ๋‚ ์งœ์˜ ๋…„๋„,์›”,์ผ ๋ณ€์ˆ˜์— ๋ฐ›๊ธฐ
	int todayYear = today.get(Calendar.YEAR);
	int todayMonth = today.get(Calendar.MONTH) + 1; // ์ž๋ฐ”api์™€ ๋งˆ๋ฆฌ์•„db์˜ ์›” ์‹œ์ž‘์ผ์ด ๋‹ค๋ฅด๋ฏ€๋กœ +1 ํ•ด์ค€๋‹ค (์ž๋ฐ”๋Š” 0์›”๋ถ€ํ„ฐ ์‹œ์ž‘)
	int todayDate = today.get(Calendar.DATE);
	System.out.println("todayYear: " + todayYear + "๋…„");
	System.out.println("todayMonth: " + todayMonth + "์›”");
	System.out.println("todayDate: " + todayDate + "์ผ");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>empList.jsp</title>
	<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>
	.small {width: 30px; height: 30px;}
</style>
</head>
<body>
<div class="p-5 bg-primary text-white text-center">
	<h1>Employees List</h1>
</div>
<div class="container mt-3">
	<table class="table text-center">
		<thead class="table-primary">
			<tr><!-- ์ปฌ๋Ÿผ๋ช… -->
				<th>no</th>
				<th>age</th>
				<th>first name</th>
				<th>last name</th>
				<th>gender</th>
				<th>hire date</th>
			</tr>
		</thead>
		<tbody>
			<%
				for(Emp e : empList) {
			%>
				<tr>
					<td><%=e.empNo%>๋ฒˆ</td>
					<%
						// e.birthDate์—์„œ ๋…„๋„,์›”,์ผ intํƒ€์ž…์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ
						int birthYear = Integer.parseInt(e.birthDate.substring(0,4));
						int birthMonth = Integer.parseInt(e.birthDate.substring(5,7));
						int birthDate = Integer.parseInt(e.birthDate.substring(8));
						int age = todayYear - birthYear; // ๋‚˜์ด = ์˜ค๋Š˜๋…„๋„ - ํƒœ์–ด๋‚œ๋…„๋„
							
						if(birthMonth <= todayMonth && birthDate <= todayDate) {
								// ํ˜„์žฌ ์›”์ด ํƒœ์–ด๋‚œ ์›”๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ (์ด๋ฏธ ์ง€๋‚ฌ๊ฑฐ๋‚˜ ์ด๋ฒˆ๋‹ฌ์ด๊ณ )
								// ํ˜„์žฌ ์ผ์ด ํƒœ์–ด๋‚œ ์ผ๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด(์ด๋ฏธ ์ง€๋‚ฌ๊ฑฐ๋‚˜ ์˜ค๋Š˜์ด๋ฉด)
								// ์ƒ์ผ์ด ์ง€๋‚ฌ๊ฑฐ๋‚˜ ์˜ค๋Š˜์ด ์ƒ์ผ์ด๋ฏ€๋กœ +1์‚ด ํ•ด์ค€๋‹ค
								age = age + 1;
						}
					%>
					<td><%=age%>์„ธ</td>
					<td><%=e.firstName%></td>
					<td><%=e.lastName%></td>
					<td>
						<%
							if(e.gender.equals("M")) { // Stringํƒ€์ž…์ด๋ฏ€๋กœ equals ์‚ฌ์šฉ
						%>
								<img src="./img/m.JPG" class="small">
						<%
							} else {
						%>
								<img src="./img/f.JPG" class="small">
						<%
							}				
						%>
					</td>
					<td><%=e.hireDate%></td>
				</tr>
			<%
				}
			%>
		</tbody>
	</table>
	<div class="text-center">
		<!-- ์„ฑ๋ณ„ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ -->
		<form action="./empList.jsp" method="get">
			<select name="gender">
				<option value="">==์„ฑ๋ณ„์„ ํƒ==</option>
				<option value="M">==๋‚จ==</option>
				<option value="F">==์—ฌ==</option>
			</select>
			<button type="submit">์„ฑ๋ณ„๊ฒ€์ƒ‰</button>
		</form>
	</div>
</div>
	<!-- ํŽ˜์ด์ง• -->
	<div class="mt-5 p-4 bg-secondary text-white text-center">
		<%
			if(curPage > 1) { // ์ฒซ๋ฒˆ์งธ ํŽ˜์ด์ง€(1)๋ณด๋‹ค ํฐ ํŽ˜์ด์ง€๋ถ€ํ„ฐ "์ด์ „"์„ ์ถœ๋ ฅ
		%>
				<a href="./empList.jsp?curPage=<%=curPage - 1%>&gender=<%=gender%>" class="btn btn-primary btn-sm"> ์ด์ „ </a>
		<%
			}
		%>
			<%=curPage%>ํŽ˜์ด์ง€ <!-- ํ˜„์žฌํŽ˜์ด์ง€ ์ถœ๋ ฅ -->
		<%
			if(curPage < lastPage) { // ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€ ๋„˜๋ฒ„๋ณด๋‹ค ์ž‘์€ ํŽ˜์ด์ง€๊นŒ์ง€๋งŒ "๋‹ค์Œ"์„ ์ถœ๋ ฅ
		%>
				<a href="./empList.jsp?curPage=<%=curPage + 1%>&gender=<%=gender%>" class="btn btn-primary btn-sm"> ๋‹ค์Œ </a>
		<%
			}
		%>
	</div>
</body>
</html>

๐Ÿ“ ์ถœ๋ ฅ



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

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