Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

정보처리기사 실기

🪑11. list_jg.jsp 작성하기 본문

🪑 독서실 자리관리 프로그램

🪑11. list_jg.jsp 작성하기

윤서입니다롱 2026. 6. 2. 11:46

학습자별 이용료 조회 화면 만들기

앞에서 search.jsp와 list_j.jsp를 작성하면서 날짜와 시간 기준으로 독서실 자리현황을 조회하는 기능을 완성했습니다.

이번 단계에서는 마지막 메뉴인:

학습자별이용료

화면을 만들어보겠습니다.

이 화면은 학습자별로:

총 이용시간
총 이용요금

을 계산해서 보여주는 페이지입니다.


1. list_jg.jsp가 필요한 이유

현재 독서실 이용기록은 모두:

tbl_studycafe

테이블에 저장됩니다.

예를 들어:

김철수
10시 ~ 12시

김철수
13시 ~ 16시

처럼 여러 건이 저장될 수 있습니다.

하지만 학습자별 이용료 화면에서는:

김철수
총 이용시간 5시간
총 비용 50,000원

처럼 합계를 보여줘야 합니다.

그래서:

SUM()
GROUP BY

를 사용하는 집계 화면이 필요합니다.


2. list_jg.jsp가 해야 하는 일

이번 문제에서 list_jg.jsp는 다음 역할을 합니다.

1. 학습자 정보 조회
2. 이용시간 계산
3. 이용요금 계산
4. 학습자별 합계 계산
5. 표 형태로 출력

즉 현재 페이지는:

집계(통계) 화면

입니다.


3. list_jg.jsp 전체 코드

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import = "java.sql.*" %>
<%@ page import = "DBPKG.Util" %>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>제과점 매출관리 프로그램</title>
	<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
Connection conn = Util.getConnection();
Statement stmt	= conn.createStatement();

String sql =
" SELECT	 	tbl_l.pk_learner 																		AS 	 학습자코드"+
",				tbl_l.name																				AS	 이름		"+
",				tbl_l.grade																				AS	 등급		"+
",			 	NVL(ROUND(SUM(tbl_s.usage_date_end-tbl_s.usage_date_start)*24,0),0) || '시간'			AS	 이용시간	"+
",			 	TO_CHAR(NVL(SUM(tbl_s.usage_date_end-tbl_s.usage_date_start)*24*10000,0),'L999,999') || '원' AS 비용"+
" FROM	 	 	tbl_learner		tbl_l																	"+
" LEFT JOIN 	tbl_studycafe 	tbl_s	ON tbl_l.pk_learner=tbl_s.fk_learner 				"+
" GROUP BY		tbl_l.pk_learner, tbl_l.name, tbl_l.grade							";

ResultSet rs = stmt.executeQuery(sql);
%>

<H4>학습자별 이용료</H4>

<TABLE border='1'>
	<TR>
		<TH width='110px'>학습자코드</TH>
		<TH width='100px'>이름</TH>
		<TH width='50px'>등급</TH>
		<TH width='80px'>이용시간</TH>
		<TH width='100px'>비용</TH>
	</TR>

<% while(rs.next()){ %>
	<TR>
		<TD align='center'><%=rs.getString("학습자코드") %></TD>
		<TD align='left'><%=rs.getString("이름") %></TD>
		<TD align='left'><%=rs.getString("등급") %></TD>
		<TD align='right'><%=rs.getString("이용시간") %></TD>
		<TD align='right'><%=rs.getString("비용") %></TD>
	</TR>
<% } %>

<%
rs.close();
conn.close();
stmt.close();
%>

</TABLE>
</body>
</html>

4. 이번 문제에서 필요한 테이블 판단하기

현재 화면에는:

학습자코드
이름
등급

이 필요합니다.

이 정보는:

tbl_learner

에 있습니다.

그리고:

이용시간
비용

은:

tbl_studycafe

에서 계산해야 합니다.

따라서:

tbl_learner
+
tbl_studycafe

JOIN이 필요합니다.


5. LEFT JOIN 사용하는 이유

LEFT JOIN tbl_studycafe tbl_s
ON tbl_l.pk_learner = tbl_s.fk_learner

현재 독서실을 이용하지 않은 학습자도 화면에 보여야 합니다.

만약 INNER JOIN을 사용하면:

이용기록 없는 학습자

가 조회되지 않습니다.

그래서:

LEFT JOIN

을 사용합니다.


6. 이용시간 계산하기

SUM(tbl_s.usage_date_end - tbl_s.usage_date_start)

Oracle에서 날짜끼리 빼면:

일(day)

단위로 계산됩니다.

예:

10시 ~ 12시

2시간

2 / 24

일로 계산됩니다.


7. 시간 단위로 바꾸기

SUM(tbl_s.usage_date_end - tbl_s.usage_date_start) * 24

1일 = 24시간

이므로 24를 곱하면 시간으로 변환됩니다.

예:

2 / 24 × 24

2시간

8. ROUND 사용하는 이유

ROUND(...,0)

시간 계산 과정에서:

1.999999

같은 값이 나올 수 있습니다.

그래서:

ROUND(...,0)

으로 반올림하여 깔끔하게 출력합니다.


9. NVL 사용하는 이유

NVL(...,0)

이용기록이 없는 학습자는:

SUM()

결과가 NULL이 됩니다.

예:

NULL시간

이 되면 보기 좋지 않습니다.

그래서:

NVL(...,0)

을 사용하여:

0시간

으로 출력합니다.


10. 비용 계산하기

현재 문제에서는:

1시간 = 10,000원

으로 계산합니다.

그래서:

이용시간 × 10000

을 수행합니다.

SUM(...)*24*10000

11. 금액 표시하기

TO_CHAR(...,'L999,999')

L은 현재 운영체제 통화기호입니다.

예:

₩50,000

처럼 출력됩니다.


12. GROUP BY 사용하는 이유

현재 화면은:

학습자별 합계

를 보여줘야 합니다.

그래서:

GROUP BY

를 사용합니다.


GROUP BY 대상

GROUP BY
tbl_l.pk_learner,
tbl_l.name,
tbl_l.grade

즉:

학습자별로 묶어서
SUM 계산

을 수행합니다.


13. ResultSet 출력하기

while(rs.next())

조회 결과가 여러 건이므로 반복문으로 출력합니다.


14. 표 출력하기

학습자코드
이름
등급
이용시간
비용

순서로 출력합니다.


15. 현재까지 완성된 구조

db.sql
→ DB 생성

index.jsp
→ 전체 구조

style.css
→ 디자인

main.jsp
→ 설명화면

reg.jsp
→ 자리등록

action.jsp
→ DB 저장

list.jsp
→ 자리현황

search.jsp
→ 검색조건 입력

list_j.jsp
→ 일별검색 결과

list_jg.jsp
→ 학습자별 이용료

16. 핵심 정리

현재 list_jg.jsp에서 가장 중요한 것은:

LEFT JOIN
GROUP BY
SUM
NVL

을 이용하여

학습자별 총 이용시간
학습자별 총 이용비용

을 계산하는 것입니다.

즉 이 화면은 단순 조회가 아니라:

집계 화면

이라는 점을 이해하면 됩니다. 🚀

'🪑 독서실 자리관리 프로그램' 카테고리의 다른 글

🪑10. list_j.jsp 작성하기  (0) 2026.06.02
🪑9. search.jsp 작성하기  (0) 2026.06.02
🪑8. list.jsp 작성하기  (0) 2026.06.02
🪑7. action.jsp 작성하기  (0) 2026.06.02
🪑6. reg.jsp 작성하기  (0) 2026.06.02