🥐6. reg.jsp 작성하기

2026. 6. 1. 14:462🥐 제과점 프로그램

05. reg.jsp 작성하기

판매등록 입력폼 만들기

앞에서 main.jsp까지 작성하면서 프로그램의 기본 화면을 만들었습니다.

이제부터는 실제 기능 화면을 만들어야 합니다.

이번 단계에서 작성할 파일은:

reg.jsp

입니다.

reg.jsp는 판매등록 화면입니다.

즉 사용자가 새로운 판매정보를 입력할 수 있도록:

판매번호
판매일자
제과점
제과
판매수량

입력 화면을 만들어주는 페이지입니다.


1. 이번 문제에서 reg.jsp가 필요한 이유

문제에는 다음 메뉴가 있습니다.

판매등록

사용자가 이 메뉴를 클릭하면
새로운 판매정보를 입력할 수 있는 화면이 나와야 합니다.

따라서 우리는:

입력 화면

이 필요합니다.

그 역할을 하는 파일이 바로:

reg.jsp

입니다.


2. reg.jsp가 해야 하는 일

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

1. 판매번호 자동 생성
2. 판매일자 자동 생성
3. 제과점 선택 목록 만들기
4. 제과 선택 목록 만들기
5. 판매수량 입력칸 만들기
6. 입력값이 비어 있는지 검사
7. 등록 버튼을 누르면 action.jsp로 이동
8. 조회 버튼을 누르면 판매현황 화면으로 이동

중요한 점은 reg.jsp가 직접 DB에 저장하는 파일은 아니라는 것입니다.

reg.jsp → 입력 화면
action.jsp → DB 저장 처리

이렇게 역할이 나누어져 있습니다.


3. reg.jsp 전체 코드

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

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>판매등록</title>
	<link rel="stylesheet" type="text/css" href="style.css">
	<script>
		function check_val(){
			var fk_bakery = document.fm.fk_bakery.value;
			if(fk_bakery==""){
				alert("제과점을 선택하지 않았습니다.");
				fm.fk_bakery.focus();
				return false;
			}

			var fk_bread = document.fm.fk_bread.value;
			if(fk_bread==""){
				alert("제과를 선택하지 않았습니다.");
				fm.fk_bread.focus();
				return false;
			}

			var deal_count = document.fm.deal_count.value;
			if(deal_count==""){
				alert("판매수량을 입력하지 않았습니다.");
				fm.deal_count.focus();
				return false;
			}

			return true;
		}
	</script>
</head>
<%
request.setCharacterEncoding("UTF-8");

Connection conn = Util.getConnection();
Statement stmt = conn.createStatement();

String sql = " SELECT TRIM(TO_CHAR(MAX(pk_sale)+1, '00000')) AS pk_sale " +
             " FROM tbl_sale ";

ResultSet rs = stmt.executeQuery(sql);
rs.next();

String pk_sale = rs.getString("pk_sale");

Date date = new Date();
SimpleDateFormat deal_date = new SimpleDateFormat("yyyyMMdd");
%>
<body>
	<H4>판매등록</H4>

	<FORM name="fm" action="action.jsp" onsubmit="return check_val()">
		<TABLE border="1">
			<TR>
				<TH align="center" width="300px">판매번호(자동발생)</TH>
				<TD align="left" width="400px">
					<INPUT type="text" name="pk_sale" value="<%=pk_sale %>" readonly>
				</TD>
			</TR>

			<TR>
				<TH align="center" width="300px">판매일자(자동발생)</TH>
				<TD align="left" width="400px">
					<INPUT type="text" name="deal_date" value="<%=deal_date.format(date) %>" readonly>
				</TD>
			</TR>

			<TR>
				<TH align="center">제과점</TH>
				<TD align="left" width="400px">
					<SELECT name="fk_bakery">
						<OPTION value="">선택</OPTION>
					<%
						sql = " SELECT pk_bakery, name FROM tbl_bakery ORDER BY pk_bakery ";
						rs = stmt.executeQuery(sql);

						while(rs.next()){
					%>
						<OPTION value="<%=rs.getString("pk_bakery") %>">
							<%=rs.getString("name") %>
						</OPTION>
					<%
						}
					%>
					</SELECT>
				</TD>
			</TR>

			<TR>
				<TH align="center">제과</TH>
				<TD align="left" width="400px">
					<SELECT name="fk_bread">
						<OPTION value="">선택</OPTION>
					<%
						sql = " SELECT pk_bread, name FROM tbl_bread ORDER BY pk_bread ";
						rs = stmt.executeQuery(sql);

						while(rs.next()){
					%>
						<OPTION value="<%=rs.getString("pk_bread") %>">
							<%=rs.getString("name") %>
						</OPTION>
					<%
						}
					%>
					</SELECT>
				</TD>
			</TR>

			<TR>
				<TH align="center">판매수량</TH>
				<TD align="left" width="400px">
					<INPUT type="text" name="deal_count">
				</TD>
			</TR>

			<TR>
				<TD align="center" colspan="2">
					<INPUT type="submit" value="등록">
					<INPUT type="button" value="조회" onclick="location.href='list_j.jsp'">
				</TD>
			</TR>
		</TABLE>
	</FORM>
<%
rs.close();
stmt.close();
conn.close();
%>
</body>
</html>

4. DB를 사용하는 페이지이므로 import가 필요합니다

reg.jsp에서는 판매번호를 자동으로 가져오고,
제과점 목록과 제과 목록을 DB에서 불러옵니다.

그래서 아래 코드가 필요합니다.

<%@ page import = "java.sql.*" %>
<%@ page import = "DBPKG.Util" %>

각 코드의 역할은 다음과 같습니다.

코드역할

java.sql.* DB 연결, SQL 실행 기능 사용
DBPKG.Util 우리가 만든 DB 연결 클래스 사용

또한 현재 날짜를 자동으로 출력하기 위해 다음 import도 사용합니다.

<%@ page import = "java.util.Date" %>
<%@ page import = "java.text.SimpleDateFormat" %>

코드역할

java.util.Date 현재 날짜 가져오기
SimpleDateFormat 날짜 형식 지정

즉 이 페이지는 단순 입력폼만 있는 것이 아니라
DB에서 자동번호와 선택 목록을 가져오는 작업도 합니다.


5. 입력값 검사 함수 만들기

function check_val(){

이 함수는 사용자가 등록 버튼을 눌렀을 때
필수 항목이 비어 있는지 확인합니다.

이번 문제에서는 판매등록을 할 때 다음 값이 반드시 필요합니다.

제과점
제과
판매수량

따라서 이 값들이 비어 있으면 등록되지 않게 막아야 합니다.


제과점 선택 검사

var fk_bakery = document.fm.fk_bakery.value;
if(fk_bakery==""){
	alert("제과점을 선택하지 않았습니다.");
	fm.fk_bakery.focus();
	return false;
}

이 코드는 제과점 선택값이 비어 있는지 확인합니다.

비어 있다면:

제과점을 선택하지 않았습니다.

라는 경고창을 띄우고, 해당 선택칸으로 커서를 이동시킵니다.


제과 선택 검사

var fk_bread = document.fm.fk_bread.value;
if(fk_bread==""){
	alert("제과를 선택하지 않았습니다.");
	fm.fk_bread.focus();
	return false;
}

판매정보에는 어떤 제과를 판매했는지 반드시 들어가야 합니다.

따라서 제과를 선택하지 않으면 등록되지 않도록 막습니다.


판매수량 검사

var deal_count = document.fm.deal_count.value;
if(deal_count==""){
	alert("판매수량을 입력하지 않았습니다.");
	fm.deal_count.focus();
	return false;
}

판매수량도 반드시 입력해야 하는 값입니다.

비어 있으면 등록할 수 없으므로 입력 여부를 확인합니다.


6. 판매번호를 자동으로 가져와야 하는 이유

문제 화면에서는:

판매번호(자동발생)

이라고 되어 있습니다.

즉 사용자가 직접 판매번호를 입력하는 것이 아니라,
DB에서 다음 번호를 자동으로 계산해서 보여줘야 합니다.

그래서 다음 SQL문을 사용합니다.

SELECT TRIM(TO_CHAR(MAX(pk_sale)+1, '00000')) AS pk_sale
FROM tbl_sale

7. 자동번호 SQL 설명

현재 tbl_sale에는 이미 판매번호가 있습니다.

예를 들어 마지막 판매번호가:

00015

라면 다음 번호는:

00016

이 되어야 합니다.

그래서:

MAX(pk_sale)+1

을 사용합니다.

뜻은:

현재 가장 큰 판매번호를 찾고
거기에 1을 더한다

입니다.


TO_CHAR를 사용하는 이유

TO_CHAR(MAX(pk_sale)+1, '00000')

숫자 결과를 다섯 자리 문자 형태로 바꿉니다.

예를 들어:

16

이라는 숫자가 나오면:

00016

처럼 출력되게 합니다.


TRIM을 사용하는 이유

TRIM(TO_CHAR(MAX(pk_sale)+1, '00000'))

문자 변환 과정에서 생길 수 있는 앞뒤 공백을 제거합니다.

즉 화면에 깔끔하게 판매번호만 출력되도록 처리합니다.


8. 판매일자를 자동으로 가져오는 이유

문제 화면에서는:

판매일자(자동발생)

이라고 되어 있습니다.

즉 사용자가 직접 날짜를 입력하는 것이 아니라
현재 날짜가 자동으로 입력되어야 합니다.

그래서 다음 코드를 사용합니다.

Date date = new Date();
SimpleDateFormat deal_date = new SimpleDateFormat("yyyyMMdd");

그리고 input 값에 넣습니다.

value="<%=deal_date.format(date) %>"

현재 날짜가 2025년 5월 9일이라면:

20250509

처럼 출력됩니다.


9. DB 연결 코드

Connection conn = Util.getConnection();
Statement stmt = conn.createStatement();

이 코드는 Oracle DB와 연결하고 SQL 실행 준비를 하는 코드입니다.

코드의미

Connection conn DB 연결
Statement stmt SQL 실행 준비

10. 판매번호 SELECT 실행하기

ResultSet rs = stmt.executeQuery(sql);
rs.next();

String pk_sale = rs.getString("pk_sale");

자동번호를 가져오는 SQL은 조회문입니다.

조회문은:

executeQuery()

를 사용합니다.

그리고 결과값을 읽기 위해:

rs.next();

를 실행합니다.

이후 결과값을 변수에 저장합니다.

String pk_sale = rs.getString("pk_sale");

11. form 태그 만들기

<FORM name="fm" action="action.jsp" onsubmit="return check_val()">

이 코드는 입력폼을 만드는 부분입니다.

여기서 중요한 속성은 세 가지입니다.

속성의미

name="fm" JavaScript에서 폼을 찾기 위한 이름
action="action.jsp" 등록 버튼 클릭 시 이동할 페이지
onsubmit 전송 전 검사 함수 실행

즉 등록 버튼을 누르면 먼저 check_val()이 실행되고,
문제가 없으면 action.jsp로 이동합니다.


12. 판매번호 입력칸

<INPUT type="text" name="pk_sale" value="<%=pk_sale %>" readonly>

이 부분은 자동으로 계산된 판매번호를 화면에 보여주는 입력칸입니다.

여기서:

<%=pk_sale %>

는 JSP 변수 값을 화면에 출력하는 코드입니다.

즉 DB에서 가져온 다음 판매번호를 input에 넣어줍니다.

readonly는 사용자가 값을 수정하지 못하게 하는 속성입니다.


13. 판매일자 입력칸

<INPUT type="text" name="deal_date" value="<%=deal_date.format(date) %>" readonly>

현재 날짜를 자동으로 보여주는 입력칸입니다.

판매일자는 자동발생 값이므로 사용자가 직접 수정하지 못하도록 readonly를 사용합니다.


14. 제과점 선택 목록 만들기

sql = " SELECT pk_bakery, name FROM tbl_bakery ORDER BY pk_bakery ";
rs = stmt.executeQuery(sql);

제과점 목록은 사용자가 직접 입력하는 것이 아니라
DB에 저장된 제과점 데이터를 가져와 선택하도록 만듭니다.

즉 tbl_bakery 테이블에서 제과점 코드와 이름을 조회합니다.


SELECT 태그 사용

<SELECT name="fk_bakery">
	<OPTION value="">선택</OPTION>

SELECT는 드롭다운 목록을 만들 때 사용합니다.

첫 번째 옵션은 아무것도 선택하지 않은 상태를 의미합니다.

<OPTION value="">선택</OPTION>

while문으로 제과점 목록 출력

while(rs.next()){

DB에 저장된 제과점 수만큼 반복하여 option을 생성합니다.

<OPTION value="<%=rs.getString("pk_bakery") %>">
	<%=rs.getString("name") %>
</OPTION>

여기서 중요한 점은:

화면에는 제과점 이름이 보이고
실제로 전송되는 값은 제과점 코드

라는 점입니다.

예를 들어 화면에는:

정심당

이 보이지만 실제 action.jsp로 전송되는 값은:

A0001

입니다.


15. 제과 선택 목록 만들기

sql = " SELECT pk_bread, name FROM tbl_bread ORDER BY pk_bread ";
rs = stmt.executeQuery(sql);

제과 목록도 DB에서 가져옵니다.

tbl_bread 테이블에서 제과 코드와 제과명을 조회합니다.

<SELECT name="fk_bread">
	<OPTION value="">선택</OPTION>

그리고 while문으로 제과 목록을 option으로 출력합니다.

화면에는:

대보름빵
자라빵
코끼리빵

이 보이고, 실제로 전송되는 값은:

B0001
B0002
B0003

입니다.


16. 판매수량 입력칸

<INPUT type="text" name="deal_count">

사용자가 판매수량을 입력하는 칸입니다.

예를 들어:

10
15

처럼 입력합니다.

이 값은 action.jsp로 전달되어 tbl_sale 테이블에 저장됩니다.


17. 등록 버튼

<INPUT type="submit" value="등록">

등록 버튼입니다.

이 버튼을 누르면 form이 전송됩니다.

즉:

check_val() 실행
→ 입력값 검사
→ action.jsp로 이동

흐름으로 동작합니다.


18. 조회 버튼

<INPUT type="button" value="조회" onclick="location.href='list_j.jsp'">

조회 버튼입니다.

이 버튼을 누르면 판매현황 화면인 list_j.jsp로 이동합니다.


19. DB 연결 닫기

rs.close();
stmt.close();
conn.close();

DB 사용이 끝났기 때문에 연결을 닫아줍니다.

실습에서는 코드가 짧아도 DB 관련 객체는 사용 후 닫아주는 습관을 들이는 것이 좋습니다.


20. 현재까지의 작업 흐름

db.sql
→ 제과점, 제과, 판매정보 테이블 생성

Util.java
→ Oracle DB 연결

index.jsp
→ 전체 화면 틀 생성

style.css
→ 화면 디자인 적용

main.jsp
→ 프로그램 설명 화면

reg.jsp
→ 판매등록 입력폼 생성

21. 핵심 정리

이번 reg.jsp에서 중요한 것은 단순히 입력칸을 만드는 것이 아닙니다.

문제에서 요구한:

판매번호 자동발생
판매일자 자동발생
제과점 선택
제과 선택
판매수량 입력
등록 전 빈칸 검사

기능을 화면에 구현하는 것입니다.

즉 reg.jsp는:

사용자에게 판매정보를 입력받는 화면

이고, 실제 DB 저장은 다음 단계에서 작성할:

action.jsp

가 담당하게 됩니다.

'2🥐 제과점 프로그램' 카테고리의 다른 글

🥐8. list.jsp 작성하기  (0) 2026.06.01
🥐7. action.jsp 작성하기  (0) 2026.06.01
🥐5. main.jsp 작성하기  (0) 2026.06.01
🥐4. style.css 작성하기  (0) 2026.06.01
🥐3. index.jsp 작성하기  (0) 2026.06.01