정보처리기사 실기
🪑11. list_jg.jsp 작성하기 본문
학습자별 이용료 조회 화면 만들기
앞에서 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 |
