정보처리기사 실기
🗓️9. list_j.jsp 작성하기 본문
일정현황 JOIN 조회 화면 만들기
앞에서 list.jsp를 작성하면서 회원현황 화면을 만들었습니다.
list.jsp는 회원 테이블인 tbl_member 하나만 조회하면 되는 비교적 단순한 페이지였습니다.
이번에는:
일정현황
화면을 만들어보겠습니다.
일정현황 화면은 단순 조회가 아니라,
두 개의 테이블을 연결해서 보여줘야 합니다.
그래서 이번 파일 이름은:
list_j.jsp
입니다.
여기서 j는 JOIN을 의미한다고 생각하면 됩니다.
1. 이번 문제에서 list_j.jsp가 필요한 이유
문제에서 일정현황 화면에는 다음 정보가 출력되어야 합니다.
일정코드
일정일자
일정메모
회원코드
회원명
여기서 중요한 점이 있습니다.
tbl_schedule 테이블에는:
일정코드
일정일자
일정메모
회원코드
는 있지만,
회원명
은 없습니다.
회원명은 tbl_member 테이블에 있습니다.
따라서 일정현황 화면을 만들려면:
tbl_schedule + tbl_member
두 테이블을 연결해야 합니다.
이때 사용하는 SQL 문법이:
JOIN
입니다.
2. 현재 list_j.jsp가 해야 하는 일
이번 문제에서 list_j.jsp는 다음 역할을 합니다.
1. tbl_schedule 테이블에서 일정 정보 조회
2. tbl_member 테이블에서 회원명 조회
3. 회원코드를 기준으로 두 테이블 연결
4. 일정코드, 일정일자, 일정메모, 회원코드, 회원명 출력
5. 표 형태로 화면에 보여주기
즉:
여러 테이블의 데이터를 합쳐서 보여주는 조회 페이지
입니다.
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">
<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_s.pk_schedule AS 일정코드 "+
" , to_char(tbl_s.do_date,'yyyy-MM-dd') AS 일정일자 "+
" , tbl_s.do_memo AS 일정메모 "+
" , tbl_m.pk_member AS 회원코드 "+
" , tbl_m.name AS 회원명 "+
" FROM tbl_member tbl_m "+
" LEFT JOIN tbl_schedule tbl_s ON tbl_s.fk_member=tbl_m.pk_member "+
" WHERE tbl_s.pk_schedule IS NOT NULL ";
ResultSet rs = stmt.executeQuery(sql);
%>
<H4>일정현황</H4>
<TABLE border='1'>
<TR>
<TH width='100px'>일정코드</TH>
<TH width='100px'>일정일자</TH>
<TH width='200px'>일정메모</TH>
<TH width='100px'>회원코드</TH>
<TH width='100px'>회원명</TH>
</TR>
<% while(rs.next()){ %>
<TR>
<TD align='center'><%=rs.getString("일정코드") %></TD>
<TD align='center'><%=rs.getString("일정일자") %></TD>
<TD align='left'><%=rs.getString("일정메모") %></TD>
<TD align='center'><%=rs.getString("회원코드") %></TD>
<TD align='center'><%=rs.getString("회원명") %></TD>
</TR>
<% } %>
<%
rs.close();
conn.close();
stmt.close();
%>
</TABLE>
</body>
</html>
4. 현재 페이지는 JOIN 조회 페이지입니다
앞에서 만든 list.jsp는 회원 테이블 하나만 조회했습니다.
tbl_member
하지만 이번 list_j.jsp는 일정현황을 보여줘야 합니다.
일정현황에는 회원명이 필요합니다.
그런데 회원명은 일정 테이블에 없고 회원 테이블에 있습니다.
그래서:
tbl_schedule
tbl_member
두 테이블을 연결해야 합니다.
5. DB 연결 준비하기
DB에서 일정현황 데이터를 가져오기 위해 Oracle 연결이 필요합니다.
<%@ page import = "java.sql.*" %>
<%@ page import = "DBPKG.Util" %>
그리고 실제 연결은 다음 코드로 진행합니다.
Connection conn = Util.getConnection();
Statement stmt = conn.createStatement();
6. 이번 문제에서 필요한 SQL 판단하기
일정현황 화면에서 필요한 컬럼은 다음과 같습니다.
일정코드
일정일자
일정메모
회원코드
회원명
각 데이터가 있는 위치를 보면 다음과 같습니다.
필요한 데이터들어있는 테이블
| 일정코드 | tbl_schedule |
| 일정일자 | tbl_schedule |
| 일정메모 | tbl_schedule |
| 회원코드 | tbl_member 또는 tbl_schedule |
| 회원명 | tbl_member |
즉 한 테이블만으로는 부족합니다.
그래서 JOIN을 사용해야 합니다.
7. SELECT 문 작성하기
SELECT
tbl_s.pk_schedule AS 일정코드,
to_char(tbl_s.do_date,'yyyy-MM-dd') AS 일정일자,
tbl_s.do_memo AS 일정메모,
tbl_m.pk_member AS 회원코드,
tbl_m.name AS 회원명
FROM tbl_member tbl_m
LEFT JOIN tbl_schedule tbl_s
ON tbl_s.fk_member = tbl_m.pk_member
WHERE tbl_s.pk_schedule IS NOT NULL
이 SQL문은:
회원 테이블과 일정 테이블을 연결해서
일정현황에 필요한 데이터를 조회
하는 코드입니다.
8. 테이블 별칭을 사용하는 이유
SQL을 보면 테이블 이름 뒤에 다음과 같은 이름이 붙어 있습니다.
tbl_member tbl_m
tbl_schedule tbl_s
여기서:
tbl_m
tbl_s
는 테이블 별칭입니다.
테이블 이름을 매번 길게 쓰면 코드가 길어집니다.
그래서 짧은 별칭을 붙여 사용합니다.
예를 들어:
tbl_schedule.pk_schedule
대신:
tbl_s.pk_schedule
처럼 짧게 작성할 수 있습니다.
9. LEFT JOIN을 사용하는 이유
LEFT JOIN tbl_schedule tbl_s
ON tbl_s.fk_member = tbl_m.pk_member
이 코드는 두 테이블을 연결하는 부분입니다.
연결 기준은:
회원코드
입니다.
즉:
tbl_schedule의 fk_member
=
tbl_member의 pk_member
인 데이터끼리 연결합니다.
10. 현재 문제에서 JOIN이 필요한 이유
예를 들어 일정 테이블에 다음 데이터가 있다고 해보겠습니다.
일정코드일정메모회원코드
| 1 | 탐관오리 찾기 | M0001 |
하지만 이 상태만 보면 M0001이 누구인지 알 수 없습니다.
그래서 회원 테이블을 확인해야 합니다.
회원코드회원명
| M0001 | 홍길동 |
JOIN을 하면 다음처럼 보여줄 수 있습니다.
일정코드일정메모회원코드회원명
| 1 | 탐관오리 찾기 | M0001 | 홍길동 |
즉 JOIN을 사용하는 이유는:
코드만 있는 데이터를 사람이 이해할 수 있는 이름까지 연결해서 보여주기 위해
입니다.
11. WHERE 조건을 사용하는 이유
WHERE tbl_s.pk_schedule IS NOT NULL
현재 SQL은 tbl_member를 기준으로 LEFT JOIN하고 있습니다.
그러면 일정이 없는 회원도 결과에 나올 수 있습니다.
하지만 일정현황 화면에서는 실제 일정이 있는 데이터만 보여주면 됩니다.
그래서:
일정코드가 NULL이 아닌 데이터만 출력
하도록 조건을 붙입니다.
12. 날짜 형식 바꾸기
to_char(tbl_s.do_date,'yyyy-MM-dd') AS 일정일자
DB에 저장된 날짜는 그대로 출력하면 보기 불편할 수 있습니다.
그래서 to_char()를 사용해서 날짜를 보기 좋은 형태로 바꿉니다.
20250101
형태의 날짜를:
2025-01-01
처럼 출력하기 위해 사용합니다.
13. AS 별칭 사용하는 이유
AS 일정코드
AS 일정일자
AS 일정메모
AS 회원코드
AS 회원명
AS는 출력 컬럼 이름을 보기 좋게 바꾸는 역할을 합니다.
이렇게 별칭을 주면 JSP에서 다음처럼 사용할 수 있습니다.
rs.getString("일정코드")
rs.getString("회원명")
즉 화면에 출력할 때 코드가 더 읽기 쉬워집니다.
14. SQL 실행하기
ResultSet rs = stmt.executeQuery(sql);
현재 SQL은 SELECT 조회문입니다.
따라서 executeQuery()를 사용합니다.
조회 결과는 ResultSet에 저장됩니다.
15. TABLE 제목 만들기
<H4>일정현황</H4>
현재 페이지가 일정현황 화면임을 보여줍니다.
16. 표 제목 작성하기
<TH>일정코드</TH>
<TH>일정일자</TH>
<TH>일정메모</TH>
<TH>회원코드</TH>
<TH>회원명</TH>
문제에서 요구한 출력 항목과 동일하게 표 제목을 작성합니다.
17. while(rs.next())로 여러 줄 출력하기
일정 데이터는 여러 건입니다.
그래서 조회 결과를 한 줄만 출력하면 안 됩니다.
<% while(rs.next()){ %>
이 코드는:
조회 결과가 있는 동안 반복
한다는 의미입니다.
즉 일정이 4건이면 4번 반복해서 출력합니다.
18. ResultSet에서 값 꺼내기
<%=rs.getString("일정코드") %>
<%=rs.getString("일정일자") %>
<%=rs.getString("일정메모") %>
<%=rs.getString("회원코드") %>
<%=rs.getString("회원명") %>
이 코드는 현재 행의 값을 화면에 출력합니다.
여기서 사용한 이름은 SQL에서 지정한 별칭과 같아야 합니다.
예를 들어 SQL에서:
AS 일정코드
라고 했기 때문에 JSP에서도:
rs.getString("일정코드")
라고 작성합니다.
19. DB 연결 닫기
rs.close();
conn.close();
stmt.close();
조회가 끝났으므로 DB 연결을 닫아줍니다.
DB를 사용하는 페이지에서는 마지막에 연결을 닫는 습관이 중요합니다.
20. 현재 페이지 실행 흐름
list_j.jsp는 다음 순서로 동작합니다.
list_j.jsp 실행
↓
Oracle DB 연결
↓
tbl_member와 tbl_schedule JOIN 조회
↓
조회 결과를 ResultSet에 저장
↓
while 반복문으로 한 줄씩 출력
↓
일정현황 화면 완성
21. 현재까지 완성된 기능
main.jsp
→ 프로그램 설명 화면
reg.jsp
→ 일정 입력 화면
action.jsp
→ DB 저장 처리
list.jsp
→ 회원현황 조회
list_j.jsp
→ 일정현황 JOIN 조회
즉 현재 프로젝트의 핵심 기능은 거의 완성되었습니다.
22. 핵심 정리
현재 list_j.jsp에서 가장 중요한 것은:
일정 테이블에는 회원명이 없기 때문에
회원 테이블과 JOIN해서 조회해야 한다
는 점입니다.
정리하면:
문제에서 회원명 출력 요구
→ tbl_schedule에는 회원명 없음
→ tbl_member와 연결 필요
→ JOIN 사용
→ ResultSet으로 출력
이 흐름을 이해하면 됩니다.
'🗓️ 일정관리 프로그램' 카테고리의 다른 글
| 🗓️8. list.jsp 작성하기 (0) | 2026.05.26 |
|---|---|
| 🗓️7. action.jsp 작성하기 (0) | 2026.05.26 |
| 🗓️6. reg.jsp 작성하기 (0) | 2026.05.26 |
| 🗓️5. main.jsp 작성하기 (0) | 2026.05.26 |
| 🗓️4. style.css 작성하기 (0) | 2026.05.26 |
