PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2012/12/10 21:21:54
Name 이슬먹고살죠
Subject [자바] JSP에서 예외조건, Commit();, DB수정 질문입니다.
이게 아마 마지막 질문이 될 것 같네요 ㅠ.ㅠ 맨땅에서 시작하니깐 이해하는데 90%, 코딩하는데 10% 걸리네요.

대체 왜 우리학교는 C++도 그렇고 비주얼베이직도 그렇고 자바도 그렇고 안가르치고 숙제로 내는걸까요... 꾸역꾸역 하는게 또 신기하긴합니다만.

아무튼!! 우문에도 현답으로 답해주시는 피지알러님들 너무 감사합니다. 저도 이런 이타적 선행을 질게에서 꼭 베풀겠어요!


1. JSP에서 Exception구문을 통해 오류메시지를 출력하는법! 아래에 상세질문 적어뒀습니다.

2. conn.commit();와 conn.rollback();을 넣을 위치는 어디죠? 제가 생각하던데에 별표쳐놨는데 저기다가 넣으면 오류가 뜹니다.

현재 DB TABLE은 네개의 애트리뷰트, 기본키는 Equip_id, 외래키는 Equip_type,  네개의 애트리뷰트 모두 NOT NULL 상태입니다.

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
<%@ 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");


★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

if(Equip_id=="" || Equip_type=="" || Maintenance_start=="" || Maintenance_finish=="")
    throw new SQLException("값이 비었습니다.");

바로 여기입니다.  저는 네 가지 값 중 하나라도 비면 저렇게 "값이 비었습니다"라고 뜨면서 그만둬주길 바라는데,
그냥 JSP 오류만 발생하게 되네요.  왜그런가요?
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★


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();
        out.println("새 Equipment 가 입력되었습니다.");
      
       ★★★conn.commit();★★★
} catch (SQLException e) {
        
        out.println("문제 발생");
        ★★★conn.rollback();★★★
}  finally {

        if(pstmt != null)
                try {
                        pstmt.close();
                } catch (SQLException e) {}
        if(conn != null)
                try {
                        conn.close();
                } catch (SQLException e) {}
}
%>

<a href="Equipment_insert.jsp">계속 등록</a>
<a href="Equipment.jsp">Equipment 페이지로</a>
</body>
</html>




3. 위의 소스가 새로운 데이터를 삽입하는 거였다면 이건 기존 데이터를 수정하는 소스입니다. Modify.jsp에서 값을 수정하고, Modify_done.jsp가 그 값을 받아 DB에 반영하는 전형적인 구조인데요, 왠지 실행이 되지 않습니다. ㅠㅠ


<%@ 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 modify done</title>
</head>
<body>
<%@ page import= "java.sql.*, java.util.*" %>
<%
request.setCharacterEncoding("UTF-8");

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

Class.forName("com.mysql.jdbc.Driver");
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
int updateCount = 0;

try {
        conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbfinalproject", "root", "");
        stmt = conn.createStatement();
★★★★★★★★★★★★★   ↓요놈이 문제가 있다네요 ★★★★★★★★★★★★★★
        updateCount = stmt.executeUpdate("update Equipment set Equip_type = '"+Equip_type+"', Maintenance_start = '"+Maintenance_start+"', Maintenance_finish = '"+Maintenance_finish+"' where Equip_id='"+Equip_id+"'");
%>
<%} finally {
        if(stmt != null)
                try{
                        stmt.close();
                } catch (Exception e) {}
        
        if(rs != null)
                try {
                        rs.close();
                } catch (Exception e) {}
        
        if(conn != null)
                try {
                        conn.close();
                } catch (Exception e) {}
        
}
%>
<% if(updateCount > 0) { %>
데이터가 수정되었습니다.
<%} else { %>
동일한 아이디가 존재하지 않습니다.
<% } %>

</body>
</html>

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
정지연
12/12/10 21:40
수정 아이콘
1. throw new SQLException("값이 비었습니다."); 이렇게 exception 을 날리면 어디선가는 받아서 처리를 해줘야 합니다.. 위의 소스 대로라면 try if 위까지 올려서 throw 한 것을 받을 수 있게 하면 됩니다.
try

if(Equip_id=="" || Equip_type=="" || Maintenance_start=="" || Maintenance_finish=="")
이런식으로요

2. 위치상으로는 저기가 맞습니다. 어떤 에러가 뜨는지 구체적으로 모르면 답을 드릴 수가 없네요..

3. 구문이 제대로 완성이 안됐네요..
try{
.........
catch(Exception e)

........
finally

......

이렇게 되어야 하는 구조인데 try 만 있고 catch 가 없고 바로 finally 로 떨어지네요..
이슬먹고살죠
12/12/10 21:48
수정 아이콘
3번 감사합니다! 그런데 이렇게 바꾸니 계속 동일한 아이디가 존재하지 않다고 나와요 ㅠㅠ

그러니깐 이제 try와 catch는 제대로 해서 기본키를 변경하면 catch로 가는데, updatecount가 증가하지 않는건지 계속 동일한 아이디가 존재하지 않는다고만 나오네요...
정지연
12/12/10 22:05
수정 아이콘
updateCount 는 위 쿼리문으로 수정된 행이 몇개나 있는지를 리턴합니다.. 실제 업데이트 된 데이터가 없다는 얘기가 되는데요..
"update Equipment set Equip_type = '"+Equip_type+"', Maintenance_start = '"+Maintenance_start+"', Maintenance_finish = '"+Maintenance_finish+"' where Equip_id='"+Equip_id+"'"
이걸 그대로 출력해 봐서 의도한 대로 쿼리문이 완성되었는지 확인해 보세요.. 아마도 Equip_id 가 원하는 값으로 넘어오지 않은게 아닌가 추측해 봅니다..
이슬먹고살죠
12/12/10 22:09
수정 아이콘
오메!!!! Equip_id 가 원하는 값으로 넘어오지 않은게 맞았어요!!! ㅠㅠㅠ 아 진짜 너무너무 감사합니다!!
이슬먹고살죠
12/12/10 21:57
수정 아이콘
그리고 2번같은 경우는 conn.commit();는 제대로 되는데 conn.rollback();이 오류를 만듭니다.
정지연
12/12/10 22:02
수정 아이콘
그럼 conn.rollback() 가 발생시키는 exception 을 처리하지 않아서 인거 같습니다..
try

conn.rollback();
catch (Exception e)

이렇게 처리하면 될거 같네요
이슬먹고살죠
12/12/10 22:06
수정 아이콘
읭 그게 catch안에 들어가는건가요? 어디다가 넣으면 되는지...
정지연
12/12/10 22:11
수정 아이콘
catch 안에 또 try를 써도 됩니다.. conn.rollback() 를 빼고 제가 적은걸 통째로 넣으면 됩니다.
이슬먹고살죠
12/12/10 22:17
수정 아이콘
duplicate parameter e라고 하는데 다른걸로 대체하면 되나요? 아 현재 모든 SQLException은 Excetion이에요.
정지연
12/12/10 22:21
수정 아이콘
e 라는 변수명이 중복된거뿐이니까 타입은 Exception 그냥 써도 되고 변수명만 바꿔서 쓰세요..
아스트랄
12/12/10 22:41
수정 아이콘
답변은 정지연님이 다 드린거 같으니 전 부가적인 얘기를 적어봅니다.
throw new SQLException("값이 비었습니다.");
이부분에서 SQLException 을 사용하시는 것보다는 RuntimeException을 사용하는 설계방식이 더 좋습니다.
예를들어 RecoverableException 같은거요.

왜냐하면 값이 비었습니다.는 사용자에게 알려주고자 하는 메세지인데 SQLException 을 화면까지 띄워주면 보안상 문제가 있습니다.
( 그리고 해당 로직은 SQLException 이랑은 상관이 없습니다. 아직 sql 구문도 안 날렸는걸요. 차라리 IllegalArgumentException 이라면 의미는 통합니다. )
따라서 RecoverableException 처럼 예외를 포장해서 던져줘야 합니다.

예외는 크게 checkedException 과 runtimeException 으로 구분하는데 대부분의 경우 runtimeException 을 사용하는 것이 좋습니다.
Java API도 보면 과거에는 checkedException 을 많이 사용했으나 쓸데없이 try catch 가 많아지고 해당 Exception 이 발생한다고 개발자가 해줄 수 있는 것이 거의 없기 때문에 이제는 runtimeException 으로 처리하는 방식이 대세를 이루고 있습니다.

그리고 다시 보니까 어차피 sqlException 을 잡아서 한 것이 아니니까 그냥
throw new SQLException("값이 비었습니다."); 부분을
out.println("값이 비었습니다."); return;
이렇게 변경하셔도 됩니다.
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
154489 [lol] 지금 게임 잘 되시나요? [2] Made in Winter1390 12/12/10 1390
154488 이정희 후보 및 통합진보당이 까이는 사실이 뭐죠? [83] Waldstein2152 12/12/10 2152
154487 크롬 쓰시는분들 유게 접속되시나요? [7] 유니꽃1572 12/12/10 1572
154486 키스를 하지않거나 사랑한다고 말하지않는 멜로영화가 있나요? [19] 단수1861 12/12/10 1861
154485 . [25] 삭제됨2092 12/12/10 2092
154484 故 노무현 전대통령 질문 [5] 긍정_감사_겸손1571 12/12/10 1571
154483 [토론회] 박근혜후보가 받은 6억원 심각한 사실 아닌가요? [24] 실연남2049 12/12/10 2049
154482 제가 잘못들었나요?(토론회) [27] 티모2223 12/12/10 2223
154481 어도비 아크로뱃 리더?가 제대로 작동하지 않습니다! [2] 저그네버다��2974 12/12/10 2974
154480 중고나라 직거래 메모리사기를 당한것같습니다 [10] ko-star2254 12/12/10 2254
154478 [자바] JSP에서 예외조건, Commit();, DB수정 질문입니다. [11] 이슬먹고살죠3044 12/12/10 3044
154477 일베말고 (비교적) 반민주당 커뮤니티 없나요? [20] 치코리타2113 12/12/10 2113
154475 겨울철산행 구스다운 필수인가요? [3] 글로리1224 12/12/10 1224
154474 안드로이드폰 루팅 이후 게임빌 게임 실행 문제 [1] 레몬커피2444 12/12/10 2444
154473 FM2013 질문드립니다. (그리고 FM2012 한글화 누가했나요-_-) [2] ComeAgain2424 12/12/10 2424
154472 부재자 투표 공보물 받으셨나요? 투표 못할 수도 있을 것같네요 [11] 실전1619 12/12/10 1619
154470 아이폰 5 처음 사면 뭘 해야 할까요? [4] 천진희1761 12/12/10 1761
154469 [와인] 질문있습니다. [5] Bayer Aspirin1269 12/12/10 1269
154468 [디아3] 목걸이 가격 질문입니다. [9] illmatic1213 12/12/10 1213
154467 [핸드폰] 카톡이랑 인터넷만 되는 제일 저렴한 스마트폰 질문! [6] HesBlUe1588 12/12/10 1588
154466 그냥 울고싶을때 없으신가요?? [17] 머린이야기1919 12/12/10 1919
154465 상속 관련 법 때문에 질문드립니다 [1] 도라귀염1228 12/12/10 1228
154464 컴퓨터 조립견적 호환성 확인 부탁드립니다~~^^ [4] 카이노스1288 12/12/10 1288
목록 이전 다음
댓글

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