정보처리기사 실기
🪑🔟 list_j.jsp 작성하기 본문
일별검색 결과 화면 만들기
앞에서 search.jsp를 작성하면서 사용자가 날짜와 시간을 선택할 수 있는 검색 화면을 만들었습니다.
이번 단계에서는 search.jsp에서 전달받은 날짜와 시간을 기준으로
해당 시간에 사용 중인 독서실 자리를 9×9 자리표에 출력해보겠습니다.
이번에 작성할 파일은:
list_j.jsp
입니다.
여기서 j는 JOIN을 의미합니다.
1. list_j.jsp가 필요한 이유
search.jsp에서는 날짜와 시간만 입력받았습니다.
예를 들어 사용자가 다음과 같이 검색했다고 가정합니다.
날짜: 2025-04-20
시간: 13시
그러면 list_j.jsp에서는 이 값을 받아서:
2025-04-20 13시에
어떤 학습자가
어느 자리를 사용 중인지
조회해야 합니다.
그리고 결과를 단순 표가 아니라 9×9 자리 배치표 형태로 출력해야 합니다.
2. list_j.jsp가 해야 하는 일
이번 문제에서 list_j.jsp는 다음 역할을 합니다.
1. search.jsp에서 검색 날짜 받기
2. search.jsp에서 검색 시간 받기
3. 날짜와 시간을 합쳐 검색 기준 만들기
4. tbl_studycafe와 tbl_learner JOIN 조회
5. 해당 시간에 사용 중인 자리 찾기
6. 9×9 배열에 학습자 이름 저장
7. 9×9 자리표로 화면에 출력
즉 이 화면은:
검색 조건 처리 + JOIN 조회 + 자리표 출력
이 함께 들어가는 페이지입니다.
3. list_j.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">
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
String search_date = request.getParameter("search_date") +" "+ request.getParameter("search_time");
Connection conn = Util.getConnection();
Statement stmt = conn.createStatement();
String sql =
" SELECT tbl_s.pk_studycafe AS 독서실코드 "+
", tbl_s.seat_x AS 가로위치 "+
", tbl_s.seat_y AS 세로위치 "+
", tbl_l.name AS 학습자 "+
" FROM tbl_studycafe tbl_s "+
" LEFT JOIN tbl_learner tbl_l ON tbl_s.fk_learner=tbl_l.pk_learner "+
" WHERE TO_DATE('"+search_date+"','YYYY-MM-DD HH24') "+
" BETWEEN tbl_s.usage_date_start AND tbl_s.usage_date_end ";
ResultSet rs = stmt.executeQuery(sql);
String[][] 좌석 = new String[10][10];
while(rs.next()){
int 세로위치 = rs.getInt("세로위치");
int 가로위치 = rs.getInt("가로위치");
좌석[세로위치][가로위치] = rs.getString("학습자");
}
%>
<H4>자리현황: <%=search_date %>시</H4>
<TABLE border='1'>
<TR bgcolor='gray'>
<TH rowspan='2' colspan='2'>자리</TH>
<TH colspan='9'>가로위치</TH>
</TR>
<TR>
<%for(int x=1; x<=9; x++){%>
<TH width='40px' bgcolor='gray'><%=x %></TH>
<%} %>
</TR>
<%for(int y=1; y<=9; y++){%>
<TR>
<% if(y==1){ %>
<TH rowspan='9' bgcolor='gray'>세<BR>로<BR>위<BR>치</TH>
<%} %>
<TH bgcolor='gray'><%=y %></TH>
<%for(int x=1; x<=9; x++){%>
<TD><%if(좌석[y][x] != null){ out.print(좌석[y][x]); }%></TD>
<%} %>
</TR>
<%} %>
<%
rs.close();
conn.close();
stmt.close();
%>
</TABLE>
</body>
</html>
4. search.jsp에서 전달된 값 받기
String search_date = request.getParameter("search_date") +" "+ request.getParameter("search_time");
search.jsp에서는 날짜와 시간을 따로 보냈습니다.
search_date
search_time
예를 들어:
search_date = 2025-04-20
search_time = 13
이라면 이 코드를 통해:
2025-04-20 13
이라는 문자열이 만들어집니다.
이 값은 나중에 Oracle의 TO_DATE()로 날짜/시간으로 변환됩니다.
5. DB 연결하기
Connection conn = Util.getConnection();
Statement stmt = conn.createStatement();
검색 결과를 조회하기 위해 Oracle DB에 연결합니다.
코드역할
| Connection conn | DB 연결 |
| Statement stmt | SQL 실행 준비 |
6. 이번 문제에서 필요한 SQL 판단하기
일별검색 결과 화면에서는 다음 정보가 필요합니다.
가로위치
세로위치
학습자 이름
여기서 자리 위치는 tbl_studycafe에 있습니다.
하지만 학습자 이름은 tbl_learner에 있습니다.
따라서 두 테이블을 연결해야 합니다.
tbl_studycafe + tbl_learner
그래서 JOIN을 사용합니다.
7. SQL문 작성하기
SELECT
tbl_s.pk_studycafe AS 독서실코드,
tbl_s.seat_x AS 가로위치,
tbl_s.seat_y AS 세로위치,
tbl_l.name AS 학습자
FROM tbl_studycafe tbl_s
LEFT JOIN tbl_learner tbl_l
ON tbl_s.fk_learner = tbl_l.pk_learner
WHERE TO_DATE('검색날짜 검색시간','YYYY-MM-DD HH24')
BETWEEN tbl_s.usage_date_start AND tbl_s.usage_date_end
이 SQL은:
검색한 날짜와 시간이
독서실 사용 시작시간과 종료시간 사이에 있는 데이터
를 찾는 코드입니다.
8. JOIN이 필요한 이유
tbl_studycafe에는 학습자 코드만 있습니다.
예를 들어:
L0001
하지만 화면에는 학습자 이름을 보여줘야 합니다.
학습자 이름은 tbl_learner에 있습니다.
그래서 다음 조건으로 연결합니다.
tbl_s.fk_learner = tbl_l.pk_learner
즉:
독서실 이용 정보의 학습자코드
=
학습자 테이블의 학습자코드
인 데이터를 연결합니다.
9. BETWEEN을 사용하는 이유
TO_DATE('2025-04-20 13','YYYY-MM-DD HH24')
BETWEEN tbl_s.usage_date_start AND tbl_s.usage_date_end
이 조건은 검색한 시간이 사용시간 범위 안에 있는지 확인합니다.
예를 들어 어떤 데이터가 다음과 같다고 해보겠습니다.
사용 시작: 2025-04-20 10시
사용 종료: 2025-04-20 16시
검색 시간이:
2025-04-20 13시
라면 10시와 16시 사이에 있으므로 조회됩니다.
즉 이 조건은:
해당 시간에 자리를 사용 중인 데이터만 조회
하기 위한 조건입니다.
10. ResultSet으로 조회 결과 받기
ResultSet rs = stmt.executeQuery(sql);
현재 SQL은 SELECT 조회문입니다.
따라서 executeQuery()를 사용합니다.
조회 결과는 ResultSet에 저장됩니다.
11. 9×9 좌석 배열 만들기
String[][] 좌석 = new String[10][10];
독서실 자리는 1부터 9까지의 가로위치와 세로위치를 사용합니다.
배열 인덱스는 0부터 시작하지만,
우리는 1~9를 그대로 쓰기 위해 크기를 10으로 만듭니다.
즉:
좌석[세로위치][가로위치]
형태로 학습자 이름을 저장합니다.
12. 조회 결과를 배열에 저장하기
while(rs.next()){
int 세로위치 = rs.getInt("세로위치");
int 가로위치 = rs.getInt("가로위치");
좌석[세로위치][가로위치] = rs.getString("학습자");
}
조회된 결과를 한 줄씩 읽으면서
해당 자리 위치에 학습자 이름을 저장합니다.
예를 들어 조회 결과가:
세로위치: 4
가로위치: 9
학습자: 영희
라면:
좌석[4][9] = "영희";
가 됩니다.
13. 검색 결과 제목 출력하기
<H4>자리현황: <%=search_date %>시</H4>
사용자가 검색한 날짜와 시간을 제목으로 보여줍니다.
예를 들어:
자리현황: 2025-04-20 13시
처럼 출력됩니다.
14. 9×9 자리표 만들기
<TABLE border='1'>
검색 결과는 자리 배치표 형태로 보여줘야 합니다.
따라서 TABLE 태그를 사용합니다.
15. 가로위치 제목 출력하기
<%for(int x=1; x<=9; x++){%>
<TH width='40px' bgcolor='gray'><%=x %></TH>
<%} %>
가로위치 1부터 9까지를 반복문으로 출력합니다.
16. 세로위치와 좌석칸 출력하기
<%for(int y=1; y<=9; y++){%>
<TR>
<% if(y==1){ %>
<TH rowspan='9' bgcolor='gray'>세<BR>로<BR>위<BR>치</TH>
<%} %>
<TH bgcolor='gray'><%=y %></TH>
<%for(int x=1; x<=9; x++){%>
<TD><%if(좌석[y][x] != null){ out.print(좌석[y][x]); }%></TD>
<%} %>
</TR>
<%} %>
이 코드는 세로 1~9, 가로 1~9 자리표를 만듭니다.
구조는 다음과 같습니다.
바깥 for문 → 세로위치 y
안쪽 for문 → 가로위치 x
17. 좌석에 이름 출력하기
<TD><%if(좌석[y][x] != null){ out.print(좌석[y][x]); }%></TD>
배열에 학습자 이름이 들어있으면 이름을 출력합니다.
배열이 비어 있으면 아무것도 출력하지 않습니다.
즉:
사용 중인 자리 → 학습자 이름 출력
비어 있는 자리 → 빈칸 출력
이 됩니다.
18. DB 연결 닫기
rs.close();
conn.close();
stmt.close();
조회가 끝났으므로 DB 연결을 닫아줍니다.
19. 현재 페이지 실행 흐름
list_j.jsp는 다음 순서로 동작합니다.
list_j.jsp 실행
↓
search.jsp에서 날짜와 시간 받기
↓
검색 날짜/시간 문자열 생성
↓
Oracle DB 연결
↓
tbl_studycafe + tbl_learner JOIN 조회
↓
검색 시간이 사용시간 사이에 있는 데이터 조회
↓
좌석 배열에 학습자 이름 저장
↓
9×9 자리표 출력
20. 현재까지 완성된 기능
search.jsp
→ 날짜와 시간 검색 조건 입력
list_j.jsp
→ 검색 조건에 맞는 자리 배치 결과 출력
즉 이제 일별검색 기능이 완성되었습니다.
21. 핵심 정리
현재 list_j.jsp에서 가장 중요한 것은:
검색한 날짜와 시간이 사용시간 범위 안에 있는 데이터를 찾는 것
입니다.
정리하면:
search.jsp에서 날짜와 시간 전달
→ list_j.jsp에서 값 받기
→ TO_DATE로 날짜/시간 변환
→ BETWEEN으로 사용시간 범위 확인
→ JOIN으로 학습자 이름 조회
→ 9×9 자리표에 출력
이 흐름을 이해하면 됩니다.
'🪑 독서실 자리관리 프로그램' 카테고리의 다른 글
| 🪑⑪ list_jg.jsp 작성하기 (0) | 2026.06.02 |
|---|---|
| 🪑9️⃣search.jsp 작성하기 (0) | 2026.06.02 |
| 🪑7️⃣action.jsp 작성하기 (0) | 2026.06.02 |
| 🪑6️⃣reg.jsp 작성하기 (0) | 2026.06.02 |
| 🪑5️⃣main.jsp 작성하기 (0) | 2026.06.02 |
