역사:jsp 설계자님들께서 jdbc를 jsp에서 사용하기로 결정하셨음;;

      그럼으로 jsp어플로 db조작하고 싶으면 jdbc api로 작성해서 디비 제작사가 공급하는 드라이버 클래스를 사용해야함;;
      (오라클 님들 java.sql.Driver interface 구현하느라 수고 많으셨음   ojdbc14.jar .. 앗 오라클 놈이나 자바 선놈이나 그놈이 그놈? 
       젠장.. 그래도 ㄳ)

기본전략:db접속 코드들은 전부 bean이나 서블릿에 때려 박고 jsp에선 요것들을 커스텀 태그등을 이용해 사용하여
             프리젠테이션 영역과 프로그램의 구현을 분리 시켜아함. (나도 원함)

초 간략 jdbc 사용방법(선생님의 명언.. 일반io나 db,net io나.. 매 한가지이다.)
1.오라클 jdbc 드라이버 로드
2.db connection 연결(한마디로 스트림 생성)
3.db와 대화를 나누기 위한 struct query language 준비
  3.1 Statement or PreparedStatement(내가 툴만들때 쓴거) or CallAbleStatement 객체 생성해서 쿼리 세팅
4.음..3번객체.excute()였나.. 하여튼 쿼리 실행(스트림을 통해 데이터 보내기)
5.결과값 받기 ResultSet으로...  (4번에서 db의 응답이 오기 전까지 무한 루프 돌리고 있으려나? 설마 그리 단순하게 하진 않았겠지..
  나중에 grepcode로 소스 확인)
6.볼일 종료했으니 스트림및 생성했던 객체들 소멸 (중요한것은 잦은 db커넥션에 부담을 가져야함. 그럼으로 db커넥션 풀링,
   마찬가지로 잦은 쿼리 수행도 부담스러움..  그럼으로 버퍼방식으로 모으고 모으던지.. 아니면 db가 알아서 트랜잭션 처리를
   하던지.. 그것도 아니면 서버측이 자주 접근하되, 수정되지 않는 데이터를 메모리에 띄워놓고 있던지.. 하여간 db는 너무 귀찮
   게 하면 곤란함.. 그나저나 트랜잭션.. 모아놨다가 조건 맞으면 commit, 아니면 rollback.. 하는 짓이 svn 닮았네?.. 지훈형님마저
   없으니.. 내 정신머리가 점점 폭주하는구나 OTL )

간단하게 구현을 반 의사코드로 적어보면..
1.드라이버 이름인 문자열 "오라클.jdbc.driver" 를 가지고
  1.1 Class.forName("드라이버이름") 을 통해 드라이버 클래스가 존재하는지 확인해야함.

2.커넥션 객체 생성위해 내가 열어둔 db의 url(내껀 로컬:8080), 로긴용 id , pw 를 가지고 
  2.1 java.sql.드라이버 매니저클래스님께 커넥션 객체 달라고 요청 

3."insert into xxx"던 "select from xxx"등의 문자열을 가지고 PreparedStatement(재사용가능하고 지정되지 않은 변수를 ?,? 식으로
   사용이 가능함 = 동적바인딩이 가능하단 얘기는 한마디로.. 실시간으로 유저의 입력을 받아서 세팅해줄 수 있단 의미일까? ) 
   객체를 생성해야 하는데.. (call어쩌구 statement는 db 내장 프로시저 호출해서 일시키는 것)
  3.1 요 역할은 2.1에서 얻은 커넥션 객체가 생성해줌.

4. 3.1에서 얻은 sql문장 객체에게 excute() 작업시키고 ResultSet 으로 결과 받을 준비 = db에 "요청" 전달 & "응답" 회신
(아..브라우저와 서버페이지(or서블렛)간 request/response와 오버랩되네.. 자바 프레임 워크 만만세!)

5. 결과값(ResultSet) 받았으면 요거에서 잘 추출해야함.. 테이블형의 자료구조기 때문에 행,열단위로 알아서 잘 추출
   (데이터 형식에 따라 행,열로 접근할 경운 이중 반복문 or map 자료구조의 entrySet처럼 키와 값들 두쌍의 데이터 집합이면..
    뭐 알아서 잘.. 너무 경우의 수가 많으니 일반화하기 어렵다. 물론 해본적도 없지만;;)
   5.1 db에 있던 데이터 내 app의 메모리상 xx객체에 세팅해놨으니.. 알아서 쓰면 됨
   (etc)결과값 내용이 많을 경우 모든 데이터(resultSet중 모든 row)를 메모리에 한번에 올려주진 않음..set객체가 묵시적
   으로 db와 커넥션을 유지하고 있음.. 버퍼링 방식으로.. (아마 게시판이 이런식으로 읽혀오지 않을까 싶다. 한번에 읽어
   와서 메모리에 띄우긴 너무 많잖아..)

6. 용건 끝났으니 커넥션 객체, 쿼리 문장 객체등 소멸   or  만약 커넥션 풀링 개념을 사용한다면.. 풀에 반납

***resultSet에서 커서로 제어한다는 컨셉***
 (여러번에 걸쳐 필요한 행을 읽어오고, 다음번엔 그 이후부터 읽어오는게 가능, 물론 각 데이터 필드에 접근할수 있는 get메서드
들도 있다)

 booleanabsolute (int row) 
          커서를 이 ResultSet 객체내의 지정된 행으로 이동합니다.
 voidafterLast () 
          커서를 이 ResultSet 객체의 끝, 즉 맨 마지막 줄의 직후로 이동합니다.
 voidbeforeFirst () 
          커서를 이 ResultSet 객체의 첨단, 즉 선두행의 직전으로 이동합니다.
 voidcancelRowUpdates () 
          이 ResultSet 객체의 현재의 행에 대해서 간 갱신을 취소합니다.
 voidclearWarnings () 
          이 ResultSet 객체에 관해서 보고된 모든 경고를 클리어 합니다.
 voidclose () 
          자동적으로 클로즈 될 때, 이것을 기다리는 것이 아니라, 즉시 ResultSet 객체의 데이타베이스와 JDBC 자원을 해제합니다.
 voiddeleteRow () 
          이 ResultSet 객체 및 기본으로 되는 데이타베이스로부터, 현재의 행을 삭제합니다.
 intfindColumn (String  columnLabel) 
          지정된 ResultSet 의 열라벨을 ResultSet 열인덱스에 매핑 합니다.
 booleanfirst () 
          커서를 이 ResultSet 객체내의 선두행으로 이동합니다.


by givingsheart 2014. 1. 1. 16:00