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
관리 메뉴

정보처리기사 실기

🪑🔟 list_j.jsp 작성하기 본문

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

🪑🔟 list_j.jsp 작성하기

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

일별검색 결과 화면 만들기

앞에서 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 자리표에 출력

이 흐름을 이해하면 됩니다.