PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2012/12/10 17:28:18
Name 이슬먹고살죠
Subject [자바] JSP에서 외래키, NOT NULL 제약조건을 인식하는 코딩방법은?
안녕하세요. 계속되는 자바 질문입니다. 항상 답변해주시는 분들께 감사하고 따로따로 감사인사를 드리려고 노력하겠습니다.

이번 질문은 JSP를 통해 데이터베이스에 접근하고, 새로운 데이터를 삽입하는 부분에 대한 질문입니다.

먼저 INSERT 페이지를 설정하고, 여기서 넣은 데이터를 INSERT_DONE 페이지에서 DB에 반영하려고 합니다.

insert.jsp입니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Equipment insert Page</title>
</head>
<body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">

생성할 Equipment 를 입력하세요.


<form name="form1" action="Equipment_insert_done.jsp" method="post">
        

        Equip_id: <input type="text" name="Equip_id">
                        Equip_type: <input type="text" name="Equip_type">
                        Maintenance_start: <input type="text" name="Maintenance_start">
                        Maintenance_finish: <input type="text" name="Maintenance_finish">
        <input type="submit" name="formbutton1" value="보내기"> 



</form>

 

</html>





insert_done.jsp입니다.

<%@ page language="java" contentType="text/html; charset=UTF-8"   pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert Equipment done Page</title>
</head>

<body>
<%@ page import = "java.sql.*, java.util.*" %>

<%
String Equip_id=request.getParameter("Equip_id");
String Equip_type=request.getParameter("Equip_type");
String Maintenance_start=request.getParameter("Maintenance_start");
String Maintenance_finish=request.getParameter("Maintenance_finish");

Class.forName("com.mysql.jdbc.Driver");
Connection conn = null;
PreparedStatement pstmt = null;

StringBuffer sql = new StringBuffer();

try {
        conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbfinalproject", "root", "");
        pstmt = conn.prepareStatement("insert into equipment (Equip_id, Equip_type, Maintenance_start, Maintenance_finish) values(?,?,?,?) ");
        pstmt.setString(1, Equip_id);
        pstmt.setString(2, Equip_type);
        pstmt.setString(3, Maintenance_start);
        pstmt.setString(4, Maintenance_finish);
        
        pstmt.executeUpdate();  

        
} catch (SQLException e) {
        e.printStackTrace();
} finally {

        if(pstmt != null)
                try {
                        pstmt.close();
                } catch (Exception e) {}
        if(conn != null)
                try {
                        conn.close();
                } catch (Exception e) {}
}
%>
새 Equipment 가 입력되었습니다.
계속 등록
메인으로</html>


이런식으로 코딩을 했고, 구동은 정상적으로 되고 있습니다.

다만 궁금한 것이, 현재 데이터베이스 테이블의 모든 애트리뷰트는 NOT NULL이고, Equip_type은 외래키로 다른 테이블에서 데이터를 끌어오고 있습니다.

현재 상태로는 외래키 제약조건이나, NOT NULL 제약조건을 만족하지 못하면 데이터베이스에 업로드만 안되고 정상적으로 업로드된것과 동일한 메시지가 출력되는데요, JSP에서 이러한 제약조건을 검사하고 제약조건을 만족시키지 못할 경우 일련의 에러 메세지를 출력하려면 어떤 식의 코딩을 해야하나요?

검색 키워드만 주셔도 제가 너무나 큰 도움이 될 것 같습니다. 도와주세요~

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
정지연
12/12/10 17:33
수정 아이콘
db 에 인서트 하다가 에러가 나는 경우엔 insert_done.jsp의 catch (SQLException e) 구문에서 잡게 됩니다.
근데 여기서는 e.printStackTrace(); 만 하고 끝나네요.. 여기서 에러 메시지를 출력하도록 내용을 수정하면 됩니다..
예를 들어 메시지 변수를 하나 두고 default 로 성공 메시지를 뿌리게 하고 catch 문에서 exception 을 잡으면 에러 메시지로 변경하고 아래쪽 메시지 출력하는 곳에서는 해당 변수의 값만을 뿌려주는 식으로 하면 되겠죠..
그리고 가장 좋은건 애초에 입력할때부터 not null 항목은 반드시 입력하게 하는거지요. submit 하기 전에 javascript 로 not null 항목에 값을 넣었는지 체크해서 값을 안 넣었으면 alert 메시지를 띄우고 입력하도록 유도하는식으로요
이럴 경우엔 submit 버튼으로 쓰면 validation 체크하는 자바스크립트를 쓸 수 없기 때문에 일반 button 으로 만들고 클릭할때 특정 javascript 함수를 실행하게 만들고 그 함수 안에서 validation 을 체크하고 다 통과하면 form 을 submit 하게 하면 됩니다.
또 하나, 외래키의 경우 유저에게 직접 입력하라고 하면 십중팔구 오류가 나게 됩니다. 유저가 외래키를 전부 알고 있을거라는 가정을 하지말고 아예 select 처럼 직접 입력이 아닌 선택형으로 바꿔주는게 오류를 줄이는 방법입니다.
입력폼 jsp 화면에서 equip_type 에 해당하는 항목을 db에서 조회해 select 태그로 구성해서 골라서 입력하도록 만들어주는게 좋습니다.
마지막으로 conn.commit(); 혹은 conn.rollback();가 없네요.. insert, update, delete 작업을 한 후 커밋 혹은 롤백을 하지 않으면 db 에 락이 걸려 다음 작업을 할 수 없습니다..
작업이 무사히 끝났으면 반드시 커밋을 써주고 중간에 에러가 났으면(catch 구문에 들어왔으면) rollback 를 실행해서 그간 작업한걸 날려줘야 합니다..
이슬먹고살죠
12/12/10 17:52
수정 아이콘
감사합니다. catch(SQLException e) 구문을 변경해볼게요~

그런데 애초에 입력할때부터 not null 항목을 반드시 입력하게 하는 것을 어떻게 하는지 모르겠습니다.

또, conn.commit(); 이 unlock을 하는 것이죠? 이건 어디다 넣어야 하나요?


마지막으로 이 부분이 무슨 용도인지 모르겠습니다.
finally


if(pstmt != null)
try {
pstmt.close();
catch (Exception e)

if(conn != null)
try

conn.close();
catch (Exception e)

}
정지연
12/12/10 17:58
수정 아이콘
javascript 로 하는 validation 은
<script>
function accept()

if(document.form1.Equip_id.value == '') {
alert('Equip_id를 입력하세요");
return;

document.form1.submit();
}
</script>
이런식으로 구현하면 됩니다. script 태그는 head 안에 쓰면 되고요..
자바스크립트는 자바의 문법을 가져온 스크립트 언어라 자바 쓰듯이 쓰면 얼추 됩니다. html 단의 오브젝트를 가져다 쓰는게 좀 까다롭긴 합니다만...

conn.commit(); 은 모든 작업이 순조롭게 끝났을때, 즉 try
구문의 맨 마지막에 쓰면 됩니다. try
안에서 에러가 났으면 catch 로 넘어갈테니 conn.rollback(); 은 catch 안에 써주면 되고요..
정지연
12/12/10 18:01
수정 아이콘
finally 부분은 썼던 db 연결과 관련된 객체들을 닫아서 메모리에서 없애고 connection pool 에 자원을 반납해 주는겁니다.
이걸 닫지 않으면 쓰지 않는 객체인데 메모리에 계속 남아있어서 이 부분이 몇번 호출되면 메모리 점유율이 쭉쭉 올라가서 결국 out of memory 에러를 내거나 was(톰캣) 에서 관리하는 connection pool 을 다 잡아먹어서 더이상 db 접속을 못하게 될수도 있고요
이슬먹고살죠
12/12/10 18:24
수정 아이콘
네 정말 감사해요!! 그런데... validation을 어디다 넣어야 하는건지 모르겟어요 ㅠㅠ

<script>
function accept()

if(document.form1.Equip_id.value == '') {
alert('Equip_id를 입력하세요");
return;

document.form1.submit();
}
</script>

이부분이 어디에 들어가는건가요?

지금 제일 큰 문제가 신규등록에서 외래키만 제대로 지정을 하면 심지어는 PK인 Equip_id가 없어도 DB에 등록이 된다는거 -0-;;
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
154463 몸에 문제가 있는거 같은데 어디로 가야하죠? [2] SaiNT1363 12/12/10 1363
154462 . [6] 삭제됨1325 12/12/10 1325
154461 경상남도 방언은 쌍시옷 발음을 못하나요? [32] 3053 12/12/10 3053
154460 식품공학과 나와서 취직이 힘든가요? [4] 에리2797 12/12/10 2797
154459 서울 1박2일로 애인이랑 놀러갈 만한곳 조언 부탁드립니다! [2] JSK1654 12/12/10 1654
154458 저가 스키복(보드복) 브랜드는 어떤게 있나요? [1] 시오리2613 12/12/10 2613
154457 인사(HR)분야에서 종사 하시는 인생 선배님들께 질문드립니다. [8] 다미1628 12/12/10 1628
154456 게임 이름 찾습니다. [4] sunsu1435 12/12/10 1435
154455 [LOL] 시즌3 오라클 타이밍 질문입니다. [4] 순대국1653 12/12/10 1653
154454 [자바] JSP에서 외래키, NOT NULL 제약조건을 인식하는 코딩방법은? [5] 이슬먹고살죠3300 12/12/10 3300
154453 컴퓨터 부품교체 질문입니다. [3] 타치바나1306 12/12/10 1306
154452 인도에 차 세워놓은거 어디 신고해야 하나요? [13] 켈로그김1537 12/12/10 1537
154451 금융 자격증 관련 질문 [2] Zergman[yG]1274 12/12/10 1274
154450 [lol] 롤 초보의 적응법. [7] 민머리요정1538 12/12/10 1538
154449 패딩점퍼(구스다운)을 사려하는데 추천 부탁드립니다. [5] 안치열1507 12/12/10 1507
154448 독일차 구매 선택 도와주세요. [46] 샨티2091 12/12/10 2091
154447 연애,,설레발... [11] 너에게힐링을2233 12/12/10 2233
154446 유게글 [그런데 그것이]라는 글 왜 삭게를 갔나요? [3] 노을아래서1520 12/12/10 1520
154445 강남역에 회식 장소로 적당한 곳 추천 부탁드립니다! [1] 키르아 조르딕1564 12/12/10 1564
154444 [lol]시즌3 정석 템트리 같은거 확립 됐나요? [13] 응칠1508 12/12/10 1508
154443 [LOL] 롱판다 vs 강퀴 붙으면 누가 이길까요? [8] 지로1729 12/12/10 1729
154442 디아3 아이템 질문입니다. [10] Darwin40781586 12/12/10 1586
154441 스타2리그 어디에서 보나요? [2] 공허진1551 12/12/10 1551
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로