Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

자바가 디비와 사귀기 까지 벌어지는 일들

3,387 views

Published on

자바가 디비와 사귀기 까지 벌어지는 일들

Published in: Technology
  • Hello! Get Your Professional Job-Winning Resume Here - Check our website! https://vk.cc/818RFv
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Nice !! Download 100 % Free Ebooks, PPts, Study Notes, Novels, etc @ https://www.ThesisScientist.com
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

자바가 디비와 사귀기 까지 벌어지는 일들

  1. 1. MySQL 디비에 자바(JDBC)가 접속하면 벌어지는 일들 자바가 디비와 사귀기 까지 벌어지는 일들 테드폴허브 조현종
  2. 2. 목차 • SQL은? • JDBC API는? • JDBC API는 무엇이 있나? • 본격 알아보자
  3. 3. 나는 • 테드폴디비 허브를 만들었고 • 그것으로 뭔가 희망이 가져보려는 개발자 웹 브라우저에서 동작하는 데이터베이스 협업 플렛폼
  4. 4. DB의 언어 SQL • SQL(Structured Query Language)이고 DB의 관리를 위해 만들 어진 언어 • 1970년 초에 IBM의 도널드D. 챔벌린과 레이먼드 F.보이스가 만듬. • DB 스키마 생성과 수정 • DB의 조작제어 • 등을 하지요.
  5. 5. SQL이 없다면? 으악
  6. 6. JDBC API는? • Java에서 DB를 사용에 필요한 표준 인터페이스를 재공 • 표준 인터페이스를 각 DB 밴더들이 구현 한 것이 JDBC Driver • JSR-221(JDBC 4.0)의 스팩 • MySQL Connector/J • Oracle JDBC Driver • PostgreSQL JDBC Driver
  7. 7. JDBC API가 없다면? 으악
  8. 8. 자바에서 디비를 연결하는 기본 코드
  9. 9. JDBC API의 주요 구성요소 이름 내용 DriverManager class Driver interface Connection interface Statement interface ResultSet interface SQLException class http://ecomputernotes.com/servlet/servlet-with-mysql-database/jdbc-api
  10. 10. DriverManager class • DB 연결에 필요한 사항을 관리 • 사용자가 로드(?) 해 놓은 드라이버를 관리 • 사용자가 로드(?) 해 놓은 드라이버를 사용하는 클래스
  11. 11. Driver Interface • 디비를 연결해야하는 실제 구현 클래스 • MySQL의 경우 com.mysql.jdbc.Driver의 부모인 com.mysql.jdbc.NonRegisteringDriver 클래스
  12. 12. Connection interface • 실제 디비에 연결하고 • DB의 메타데이터를 관리합니다. • MySQL은 com.mysql.jdbc.ConnectionImpl
  13. 13. Statement Interface • 디비에 SQL을 실행하고 실행결과 받는다. • MySQL은 com.mysql.jdbc.StatementImpl
  14. 14. ResultSet Interface • 쿼리실행 후 받은 결과 데이터를 처리합니다.
  15. 15. 여기까지만 들으면 행복합니다. • JDBC API 를 구현한 디비의 드라이버 만 쓰면 모두 행복할까요? 표준 인터페이스 대로만 쓰면 다 해결될까요?
  16. 16. JDBC API 인터페이스와 구현 • 인터페이스는 인터페이스일뿐 구현의 책임은 각 밴더사에 있다. • 구현이 안되어 있을수 있다. • 구현이 다를수도 있습니다. • 디비에서 지원을 하지 않을수 있다. • 버그는 당연하다. • 드라이버이다 보니 기본 구현에 버그가 있으면 괴롭다. • 인터페이스에 최신 기술 사항이 반영이 느리다.
  17. 17. 구현이 안되어 있을수 있다 • Apache Hive의 경우 statement.setQueryTimeout(queryTimeOut); statement.setMaxRows(intSelectLimitCnt); 메소드가 구현이 안되어 있습니다. (사실 구현하기도 어중간(?) 합니다)
  18. 18. 구현이 다를수 있습니다. • 쿼리 플랜을 가져올때 MySQL은 explain extended select 문을 PostgreSQL은 EXPLAIN (ANALYZE on, VERBOSE on, COST S on, BUFFERS on, TIMING on) 문을 Cubrid는 ((CUBRIDStatement) pstmt).setQueryInfo(true); 등의 구현으로.
  19. 19. 버그는 당연하다. • getIdentifierQuoteString() • storesLowerCaseIdentifiers() • storesLowerCaseQuotedIdentifiers() • storesMixedCaseIdentifiers() • storesMixedCaseQuotedIdentifiers() • storesUpperCaseIdentifiers() • storesUpperCaseQuotedIdentifiers() https://github.com/hangum/TadpoleForDBTools/issues/412
  20. 20. 버그는 당연하다. • SQLite 3.7.2 SQLiteJDBC native • getIdentifierQuoteString : storesLowerCaseIdentifiers : false storesLowerCaseQuotedIdentifiers : false storesMixedCaseIdentifiers : true storesMixedCaseQuotedIdentifiers : false storesUpperCaseIdentifiers : false storesUpperCaseQuotedIdentifiers : false • 대소문자 중복 불가능 대소문자 이름이 중복될 경우 오류발생 테이블 명 중간에 공백가능(‘, “ 로 설정해 주어야 함)
  21. 21. 버그는 당연하다. • MySQL 5.5.30-MariaDB mariadb-jdbc 1.1 • getIdentifierQuoteString : ` storesLowerCaseIdentifiers : true storesLowerCaseQuotedIdentifiers : true storesMixedCaseIdentifiers : false storesMixedCaseQuotedIdentifiers : false storesUpperCaseIdentifiers : false storesUpperCaseQuotedIdentifiers : false • 공백허용하지 않음. 모두 소문자 처리함. QUOTE로 설정하면 에러(QUOTE는 어디다가 쓰일까?)
  22. 22. 버그는 당연하다. • PostgreSQL 9.2.2 PostgreSQL Native Driver PostgreSQL 9.3 JDBC4 (build 1100) • getIdentifierQuoteString : " storesLowerCaseIdentifiers : true storesLowerCaseQuotedIdentifiers : false storesMixedCaseIdentifiers : false storesMixedCaseQuotedIdentifiers : false storesUpperCaseIdentifiers : false storesUpperCaseQuotedIdentifiers : false • 대소문자 혼용가능. 대문자 이거나, 중간에 공백이 있다면 QUOTE로 묵어주어야 합니다. 설정 값과 실제 동작이 틀리다.
  23. 23. 드라이버 버그는 고치기힘들다. • 위의 버그를 수정하여 풀리퀘스트를 보내 보았습니다. • 머지 되었다가 리버트되기를 몇번째 반복 중입니다.
  24. 24. 인터페이스에 최신 기술 사항이 반영이 느리다? 힘들다? • 요즘 대부분의 디비에서는 JSON을 지원합니다. • java.sql.Type에는 어디에서 JSON이 정의되어 있지않습니다.
  25. 25. • JDBC API 인터페이스와 구현했다고 만능은 아니고… 구현을 책임지는 밴더들에게 있습니다.
  26. 26. 본격 탐험에 앞서 준비물을 살펴보자. • MySQL 5.7.19 • JDBC Driver (JDBC 4.2) • mysql-connector-java-5.1.44-bin.jar • Test java code • Wireshark Network Analyzer 간단한 관계 그림
  27. 27. 자바에서 디비를 연결하는 기본 코드
  28. 28. 구성 • Java DB 연결 코드 -> MySQL 5.8 디비 연결 • Wireshark 로 tcp dump 를 뜬다. • 서로 어떤 메시지를 주고 받는지 살펴본다.
  29. 29. TCP dump 내용 보기 • 디비 연결을 위해 26번의 메시지를 교환합니다.
  30. 30. 확인된 사실 • 자바 명령을 날리면 모든 명령을 커밋합니다. • Connection.commit(); 을 호출하면… 실제 MySQL에서는 execSQL(null, "commit", -1, null, DEFAULT_RESULT_SET_TYPE, DEFAULT_RESULT_SET_CONCURRENCY, false, this.database, nul l, false); 라고 쿼리를 날립니다.
  31. 31. 저는 JDBC 드라이버를 통해 하고싶은 일 • 요즘은 다양한 목적, 형태, 상황에 따른 디비가 나오고있습니다. • 디비가 아니더라도 다양한 데이터를 가진 아이들이 나오고 있 지요. • 이것들을 드라이버를 통해 묶어보고싶습니다. Tadpole JDBC Hub Soon….
  32. 32. 좀더 확장하면 • 누가/언제 데이터를 요청했고, • 요청한 결과는 어떻했고, • 그 결과로 인해 만들어진 분석 데이터는 어떠했다도 남겨 볼수 있지 않을까 합니다.
  33. 33. 참고 • Java JDBC API (https://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/) • JDBC API (http://thatsjavainfo.com/java/jdbc-api/) • MySQL API (https://dev.mysql.com/doc/refman/5.7/en/) • What is JDBC?(http://ecomputernotes.com/servlet/servlet- with-mysql-database/jdbc)

×