[Adv SQL] JDBC, Accessing SQL
Category: Database System
Tags: SQL
DB의 데이터로 이후 다른 처리(graph, report 등)들을 가능하게 하기 위해서는 다른 프로그래밍 언어와 SQL이 상호작용할 수 있도록 연결해주어야 한다.
이때 데이터베이스 드라이버(DB Driver)나 데이터베이스 연결 라이브러리를 사용한다.
대표적인 DB 드라이버 종류 :
- JDBC : Java를 통해 접근
- ODBC : C, C++를 통해 접슨
- %sql, ipython-sql : Python에서 사용
JDBC
Java를 베이스로 SQL을 사용해서 데이터베이스에 접근할 수 있도록 하는 API
- 데이터를 query하고 updating하는 기능
- 메타데이터(attribute name, type 등)에 대한 retrieval 기능
- 에러에 대한 handling mechanism 등을 제공한다.
DB Connection
ex1. JDBC를 사용해서 db에 연결하는 코드
Updating, Retreiving Data
ex2. JDBC를 사용해서 db를 업데이트하고 결과를 가져오는 코드
Prepared Statement (동적할당)
사용자로부터 입력을 받을 때는 Prepared Statement를 사용해서 받는 것이 좋다. (SQL injection 공격에 안전)
SQL Injection
사용자가 input에 특정 코드를 삽입해서 query의 원래의 의도와 다르게 동작하도록 만들어 데이터베이스를 무단으로 조회하고 수정할 수 있게 되는 공격 기법이다.
예를 들어, 다음과 같이 String Concatenating으로 유저의 입력을 받는다고 하자.
"select * from instructor where name = '" + name + "'"
이때 가능한 SQL injection 공격 기법은 :
-
name : X’ or ‘Y’ = ‘Y 삽입 **
select * from instructor where name = ‘ X' or 'Y' = 'Y ’
항상 ‘Y’=’Y’가 참이 되므로 instructor의 모든 정보를 출력하게 된다. (= 무단 조회)
-
name : X’; update instructor set salary = salary + 10000; – 삽입
select * from instructor where name = ' X'; update instructor set salary = salary + 10000; -- '
;로 쿼리를 두 개 사용해서 instructor의 salary를 10000만큼 올리고 뒤에는 – 주석 처리 한다. (= 무단 수정)
따라서 Prepared Statement로 사용자 입력을 받아야 한다.
변수가 단순히 데이터로만 처리되기 때문에 비교적 안전하게 입력을 받을 수 있다.
Getting Metadata
메타데이터는 데이터를 설명하는 데이터로, 주로 DB에서 attiribute 이름이나 제약 조건 등이 해당된다.
ex4. DB metadata 가져오는 코드
@Database System Concepts sixth edition 내용을 참고함