๐ ์น์๋น์ค ํ๋ก๊ทธ๋๋ฐ 9์ฅ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ JDBC
CHAP.09 ๋ฐ์ดํฐ๋ฒ ์ด์ค์ JDBC
1. DB๊ฐ์
DB๋?
- ๋ฐ์ดํฐ๋ฒ ์ด์ค(Database)
- ์ฌ์ ์ ์ผ๋ก ์ฌ๋ฌ ์ฌ๋์ด ๊ณต์ ํ์ฌ ์ฌ์ฉํ ๋ชฉ์ ์ผ๋ก ์ฒด๊ณํํ์ฌ ํตํฉ, ๊ด๋ฆฌํ๋ ๋ฐ์ดํฐ์ ์งํฉ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฐฉ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๊ฒ์ํ๊ฑฐ๋ ์ฐพ์ ์ ์๋๋ก ์ฒด๊ณ์ ์ผ๋ก ๋ถ๋ฅํ๊ณ ์ ๋ฆฌํด๋ ์ ๋ณด์ ์งํฉ
- DBMS(Database Management System)
- DB๋ DBMS๋ผ๊ณ ๋ถ๋ฆฌ๋ ์ํํธ์จ์ด ์์คํ ์ฌ์ฉ
- DBMS๋ ํจ๊ณผ์ ์ธ ๋ฐ์ดํฐ ํ์ผ ๊ด๋ฆฌ์ ์ด์๋ฅด ์ํ ๊ตฌ์กฐ์ ํจ๊ป ์ธ๋ฑ์ฑ, ์บ์ฑ, ๋คํธ์ํฌ ์๋ฒ, ์ฌ์ฉ์ ๋ฐ ๊ถํ ๊ด๋ฆฌ, ๋ฐฑ์ /๋ณต์, ํด๋ฌ์คํฐ๋ง ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ ์ ๊ณต
- DBMS์ ์ข ๋ฅ: Oracle, MySQL, IBM DB2, MS SQL ๋ฑ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ์์คํ ์ธ DBMS๋ ๋ค๋ฅธ ์๋ฏธ์ง๋ง ๋ณดํต DB๋ผ๊ณ ํ๋ฉด DBMS๋ฅผ ํฌํจํ ๊ฐ๋
- DB์ ์ผ๋ฐ์ ์ธ ํน์ง
- ๋ฐ์ดํฐ ์ค๋ณต ์ต์ํ
- ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๊ณต์
- ์ผ๊ด์ฑ, ๋ฌด๊ฒฐ์ฑ, ๋ณด์์ฑ ์ ์ง
- ์ต์ ๋ฐ์ดํฐ ์ ์ง
- ๋ฐ์ดํฐ์ ํ์คํ ๊ฐ๋ฅ
- ๋ฐ์ดํฐ์ ๋ ผ๋ฆฌ์ ,๋ฌผ๋ฆฌ์ ๋ ๋ฆฝ์ฑ ์ ์ง
- ๋ฐ์ดํฐ ์ ๊ทผ์ด ์ฉ์ด
- ๋ฐ์ดํฐ ์ ์ฅ ๊ณต๊ฐ ์ ์ฝ
ER DB
- ์ฅ์
- ๋ค์ํ ์ฉ๋๋ก ์ฌ์ฉ ๊ฐ๋ฅ, ๋์ ์ฑ๋ฅ
- ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ ๋ณด์ฅ
- ์ ๊ทํ๋ฅผ ํตํด ๊ฐฑ์ ๋น์ฉ ์ต์ํ
- ๊ตฌ์กฐํ๋์ด์๊ณ ๋์ผํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ์ ๋ฆฌ
- ๋จ์
- ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ณ๊ฒฝ(์นผ๋ผ์ ์์ ์ด๋ ํ์ฅ)์ด ์ด๋ ค์
- ๋น ๋ฅธ ์๋๋ฅผ ์๊ตฌํ๋ ๋จ์ํ ์ฒ๋ฆฌ์ ๋์ํ๊ธฐ ์ด๋ ค์
- ๋ฐ์ดํฐ ๊ด๊ณ๋ ์ ์ฉํ์ง๋ง ๊ทธ๋ก์ธํ ์ฒ๋ฆฌ ์๋ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์
NoSQL DB
- SQL์ ์ฌ์ฉํ๋ ์ ํต์ ์ธ RDBMS๊ฐ ์๋๋ค ๋ผ๋ ์๋ฏธ
- SQL๊ณผ ๋ค๋ฅผ ์ ์์ง๋ง ๋ฐ์ดํฐ ๊ด๋ฆฌ๋ฅผ ์ํด ๋ณ๋์ ์ฟผ๋ฆฌ ์ธ์ด๋ ๊ตฌ์กฐ๋ ์กด์ฌ
- NoSQL์ RDBMS์ ๊ฐ์ฅ ํฐ ํน์ง์ธ ํ ์ด๋ธ ํํ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ํํ๊ฐ ๊ณ ์ ๋์ง ์์ ๋น์ ํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ ์ฉ
- MongoDB, Redis, Casandra, Hbase, CouchDB ๋ฑ์ด ์์
-
Document, Graph, key-value, Wide-column ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์์
- ์ฅ๋จ์
- ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ ๋ฆฌ
- ๋ถ์ฐ ์ฒ๋ฆฌ์ ์ ํฉ
- ํด๋ผ์ฐ๋ ์ปดํจํ ํ๊ฒฝ์ ์ ํฉ
- ๋น ๋ฅธ ์ผ๊ธฐ/์ฐ๊ธฐ ์๋ ์ ๊ณต
- ์ ์ฐํ ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง(๋น์ ํ) ๊ฐ๋ฅ
- ๋ณต์กํ ๋ฐ์ดํฐ ๊ด๊ณ๋ฅผ ํํํ ๋ ์ค๋ณต ๋ฐ์ดํฐ ๋ฐ์ ๊ฐ๋ฅ์ฑ
- ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๋์ผํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ ๊ฒฝ์ฐ์ ์ ๋ฆฌ
- ๋น ๋ฅธ ์ฒ๋ฆฌ ์๋๋ฅผ ์ํด ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ํ ์ด๋ธ ๋ฑ์์ ์ฐธ์กฐํ์ง ์๊ณ ๋ฐ์ดํฐ ์์ฒด์ ํฌํจํ๋ ๊ตฌ์กฐ์ ์ ํฉ
2. ER DB
3. H2 DB
4. SQL ๊ฐ์
SQL์ด๋?
- SQL(STructured Query Language)
- ๊ด๊ณํ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ฟผ๋ฆฌ ์ธ์ด๋ก ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ณด๋จ ๋จ์ํ ๊ตฌ์กฐ
- SQL ์์ฒด๋ ํ์ค ์ธ์ด์ด์ง๋ง ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ง๋ค ์ธ๋ถ์ ์ธ ์ฐจ์ด๊ฐ ์์ ์ ์๊ธฐ ๋๋ฌธ์ ํธํ์ด ์๋ ์ ๋ ์์
- SQL์ ๋จ์ํ ๋ฐ์ดํฐ ๊ด๋ จ ์์ ์ด์ธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฒด์ ๊ด๋ฆฌ ๊ธฐ๋ฅ ์ํ์๋ ์ฌ์ฉ
- SQL์์ ํ ์ ์๋ ์ผ
- ์๋ก์ด ํ ์ด๋ธ ์์ฑ
- ๋ด์ฅ ํ๋ก์์ (Stored Procedure) ์์ฑ
- ๋ทฐ ์์ฑ
- ํ ์ด๋ธ, ํ๋ก์์ ธ, ๋ทฐ ๋ฑ์ ์ ๊ทผ ๊ถํ ๋ถ์ฌ
- DB์ ๋ํ ์ฟผ๋ฆฌ ์คํ
- DB๋ก๋ถํฐ ๋ฐ์ดํฐ ์กฐํ
- DB์ ๊ธฐ๋ก ์ฝ์ , ๊ฐฑ์ , ์ญ์
- ์๋ก์ด DB ์์ฑ
SQL์ ์ ํ
- DDL(Data Definition Language)
- ํ ์ด๋ธ์ ์์ฑ, ์์ , ์ญ์ ์ ๊ฐ์ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ SQL ๋ฌธ
- ์คํค๋ง, ํ ์ด๋ธ, ์ํ์ค, ์ธ๋ฑ์ค, ์ฌ์ฉ์, ๊ถํ ๊ฐ์ฒด๋ฅผ ์์ฑ, ๊ด๋ฆฌ
- DML(Data Manipulation Language)
- ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ ๋ ์ฌ์ฉํ๋ SQL ๋ฌธ
- ๋ฐ์ดํฐ ์กฐ์์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ธ CRUD(Create, Read, Update, Delete)์ ๊ด๊ณ๋ ๋ช ๋ น
5. [์ค์ต 9-1] SQL ์ค์ต : ํ์์ ๋ณด
6. ๋ชฉ๋ก ์์ฑ
7. JDBC ๊ธฐ๋ณธ ๊ตฌ์กฐ์ API์ ์ดํด
JDBC์ ๊ฐ๋
- JDBC์ ๋ฑ์ฅ ๋ฐฐ๊ฒฝ
- DB์ ์ข ๋ฅ๊ฐ ๋ค์ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์ ๋ง์ ์ด๋ ค์์ด ์์
- JDBC๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์์ ํ์คํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ค์ํ DB์ ์ ์ ํ ์ ์๋๋ก ์ค๊ณ๋ ์ธํฐํ์ด์ค
- ์ดํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์๋ ๊ฐ DB์ ๋ํด ์์ธํ ์์ง ๋ชปํด๋ JDBC API๋ง ์๋ฉด ๋ชจ๋ DB์์ ๋์ํ ์ ์๋ ์ดํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ๊ฐ๋ฅ
- ์์ฉ ํ๋ก๊ทธ๋จ์์ Java์ ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํจ๋ JDBC API(์ธํฐํ์ด์ค๋ก ๊ท๊ฒฉ๋ง ์ ์ํ๊ณ ์์)๋ฅผ ์ฌ์ฉํด ํ๋ก๊ทธ๋จ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ค์ DB์ฐ๊ฒฐ์ ๊ฐ DBํ์ฌ๊ฐ ์ ๊ณตํ๋ JDBC ๋๋ผ์ด๋ฒ(JDBC API ๊ตฌํ ํด๋์ค)๋ฅผ ์ด์ฉํด SQL ๋ฌธ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๋ ํํ๋ก ๋์
- JDBC์ ๊ตฌ์กฐ
- JDBC API: ์์ฉ ํ๋ก๊ทธ๋จ์์๋ ์๋ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํจ๋ JDBC API๋ฅผ ์ฌ์ฉํด ํ๋ก๊ทธ๋จ ์ฝ๋ ์์ฑ
- JDBC ๋๋ผ์ด๋ฒ(JDBC API ๊ตฌํ ํด๋์ค): ์ค์ DB ์ฐ๊ฒฐ์ ๊ฐ DB ํ์ฌ๊ฐ ์ ๊ณตํ๋ JDBC ๋๋ผ์ด๋ฒ ์ด์ฉ
- SQL ๋ฌธ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๋ ํํ๋ก ๋์
JDBC ํ๋ก๊ทธ๋๋ฐ
- JDBC ๋๋ผ์ด๋ฒ ๋ก๋
- ๋จผ์ ํด๋น DB์ JDBC ๋๋ผ์ด๋ฒ๋ฅผ ๋ก๋ํ๋ค
- jdbc.drivers๋ผ๋ ์์คํ ํ๊ฒฝ ๋ณ์์ ๋ฑ๋ก๋ ๋ด์ฉ์ผ๋ก ๋ก๋ํ๋ ๋ฐฉ๋ฒ
- Class.forName() ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ์ง์ ํด๋น ํด๋์ค๋ฅผ ๋ก๋ํ๋ ๋ฐฉ๋ฒ
-
๋๋ถ๋ถ์ ๊ฒฝ์ฐ Class.forName() ๋ฉ์๋ ์ด์ฉ
Class.forName("org.h2.Dirver");
- ๋จผ์ ํด๋น DB์ JDBC ๋๋ผ์ด๋ฒ๋ฅผ ๋ก๋ํ๋ค
- DB์ฐ๊ฒฐ
- ๋๋ผ์ด๋ฒ๊ฐ ๋ก๋๋๋ฉด ํด๋น DB์ JDBC ๋๋ผ์ด๋ฒ๋ฅผ ์ด์ฉํด ํ๋ก๊ทธ๋จ์ ์์ฑ ํ ์ ์๋ ์ํ๊ฐ ๋ ๊ฒ์ ์๋ฏธํจ
- ์ค์ DB์ ์ฐ๊ฒฐํ๋ ค๋ฉด Connection ํด๋์ค์ ์ธ์คํด์ค ํ์
-
DriverManager.getConnection()
๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ๋ ํผ๋ฐ์ค๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ - JDBC URL, DB์ฌ์ฉ์ ID/Password ํ์- JDBC URL : DB์ ๋ํ ๋ค์ํ ์ ๋ณด ํฌํจ
- ๊ตฌ์กฐ:
jdbc:ํ์ ํ๋กํ ์ฝ:๋ฐ์ดํฐ ์๋ณธ ์๋ณ์
->jdbc:mysql://localhost:3306/jspbookdb
- Connection ํด๋์ค ์ธ์คํด์ค ๋ ํผ๋ฐ์ค ์ป๊ธฐ
- JDBC ํด๋์ค ๋ก๋ฉ๊ณผ URL์ด ์ค๋น๋์๋ค๋ฉด ์ค์ DB์์ ์ฐ๊ฒฐ์ ๋ง๋ค๊ธฐ ์ํ ์ฝ๋ ์์ฑ
-
DriverManager์ getConnection() ๋ฉ์๋ ์ฌ์ฉ
Connection conn = Driver.Manager.getConnection(JDBC_URL,"ID","Passwowrd");
- Statement ์์ฑ
- DB ์ฐ๊ฒฐ์ ํ๋ฒ ์๋ฃํ๋ฉด ์ดํ ์ฐ๋๋ถํฐ๋ SQL ๋ฌธ์ ์ด์ฉํด ์ด๋ฃจ์ด์ง
- ๋ฌธ์์ด๋ก ์ด๋ฃจ์ด์ง SQL๋ฌธ์ JDBC์์ ์ฒ๋ฆฌํ ์ ์๋ ๊ฐ์ฒด๋ก ๋ณํํด์ผ ํ๋๋ฐ, ์ด๋ ์ฌ์ฉ๋๋๊ฒ์ด Statement ๊ฐ์ฒด
- ๋ณดํต SQL๋ฌธ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์กฐํฉํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ Statement ๋ณด๋ค๋ Statement๋ฅผ ์์๋ฐ๋ PreparedStatement๋ฅผ ์ฌ์ฉํ๋๊ฒ์ด ์ข์
- PreparedStatement
- SQL ๋ฌธ์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋๊ณ ๋ณ์๋ฅผ ๋ฐ๋ก ์ ๋ ฅํ๋ ๋ฐฉ์
- ํจ์จ์ฑ์ด๋ ์ ์ง๋ณด์ ์ธก๋ฉด์์ ์ ๋ฆฌํ ๊ตฌ์กฐ
- Statement ํด๋์ค๋ฅผ ์์๋ฐ๊ธฐ ๋๋ฌธ์ Statementํด๋์ค ๋ฉ์๋ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅ
PreparedStatement pstmt = conn.prepareStatement("insert into test values(?,?)"); pstmt.setString(1,request.getParameter("username")); pstmt.setString(2,request.getParameter("email"));
- PreparedStatement
- SQL ๋ฌธ ์ ์ก
- ์ค์ ์ฟผ๋ฆฌ์ ์คํ์ SQL๋ฌธ ์ข
๋ฅ์ ๋ฐ๋ผ executeQuery() ํน์ executeUpdate()์ฌ์ฉ
- executeQuery()
- SELECT ๋ฌธ์ ์ํํ ๋ ์ฌ์ฉ
- ๋ฐํ๊ฐ์ ResultSet ํด๋์ค ํ์ ์ผ๋ก, ํด๋น SELECT ๋ฌธ์ ๊ฒฐ๊ณผ์ ํด๋นํ๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ ์ ๊ณต
- executeUpdate()
- UPDATE, DELETE์ ๊ฐ์ ๋ฌธ์ ์ํํ ๋ ์ฌ์ฉ
- ๋ฐํํ์ INT๊ฐ์ผ๋ก, ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ์ ์ ๋ฐํ
- executeQuery()
-
๊ฒฐ๊ณผ ๋ฐ๊ธฐ - ์ ๋ ฅ, ์์ , ์ญ์ ์ธ ๋ฌ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ๊ฒฝ์ฐ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ResultSet ๊ฐ์ฒด ํ์ - ResultSet์ ์กฐํํ ๊ฒฐ๊ณผ์ ๊ฐ์ ์์ฐจ์ ์ผ๋ก ์ ๊ทผ ํ ์ ์๋ ์ปค์๋ฅผ ๋ค๋ฃฐ ์ ์๊ฒ ํจ
ResultSet rs = pstmt.executeQuery();
- ์ฐ๊ฒฐ ํด์
- DB ์ฌ์ฉ์ด ์ข
๋ฃ๋๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ฐ๊ฒฐ์ ํด์ ํด์ผ ํจ
- DB๋ ๋์์ ์ฌ๋ฌ ์ฐ๊ฒฐ์ ์ง์ํ์ง๋ง ๋์ ์ฐ๊ฒฐ ์์ ๋ฐ๋ผ ๋ผ์ด์ผ์ค ๋น์ฉ์ด ์ฆ๊ฐํ๊ธฐ๋ ํ๊ณ , ๋์ ์ฐ๊ฒฐ ๊ฐ๋ฅ ์๊ฐ ์ ์ ๊ฒฝ์ฐ ๋๊ธฐ์๊ฐ์ด ๊ธธ์ด์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ๋ ํจ
-
์ฌ์ฉ์ด ๋๋ DB์ฐ๊ฒฐ์ ํด์ ํด์ฃผ๋๊ฒ์ด ์ข์ผ๋ฉฐ ํ๋์ ์ฐ๊ฒฐ์์ ๋ฐ์ํ๋ ์ฌ๋ฌ Statement, ResultSet ๊ฐ์ ๊ฐ์ฒด๋ ์ข ๋ฃํด์ฃผ๋๊ฒ์ด ์ข์
rs.close(); pstmt.close(); conn.close();
-
๋๊ธ๋จ๊ธฐ๊ธฐ