๐ก ๋ณธ ๊ฒ์๊ธ์ ๊น์ํ๋์ ์ธํ๋ฐ(Inflearn) ๊ฐ์ ์คํ๋ง DB 1ํธ - ๋ฐ์ดํฐ ์ ๊ทผ ํต์ฌ ์๋ฆฌ ์ ๋ํด ๊ณต๋ถํ๊ณ , ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
1. JDBC ์ดํด
1๏ธโฃ JDBC ๋ฑ์ฅ ์ด์
- ์ ํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ์ ๋ฐ์ดํฐ ํ์ฉ
- ๋๋ถ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค(DB)์ ์ ์ฅํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ์กฐํํ๋ฉด, ์ ํ๋ฆฌ์ผ์ด์ ์ DB์ ์ฐ๊ฒฐ๋์ด ๋์ํฉ๋๋ค.
2๏ธโฃ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ DB์ ์ฐ๊ฒฐ ๋ฐฉ์
- ์ปค๋ฅ์
์ฐ๊ฒฐ
- ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ ์ฃผ๋ก TCP/IP ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ DB์ ์ฐ๊ฒฐํฉ๋๋ค.
- SQL ์ ๋ฌ
- ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ DB๊ฐ ์ดํดํ ์ ์๋ SQL์ ์ฐ๊ฒฐ๋ ์ปค๋ฅ์ ์ ํตํด DB๋ก ์ ๋ฌํฉ๋๋ค.
- ๊ฒฐ๊ณผ ์๋ต
- DB๋ ์ ๋ฌ๋ SQL์ ์ํํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ ์๋ตํฉ๋๋ค.
- ์๋ต๋ฐ์ ๊ฒฐ๊ณผ๋ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์์ ํ์ฉ๋ฉ๋๋ค.
3๏ธโฃ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ์ ๋ฌธ์ ์
๋ฌธ์ ์์ธ
- ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ข ๋ฅ๊ฐ ๋ง์ผ๋ฉฐ, ๊ฐ๊ฐ์ DB๋ ์ปค๋ฅ์ ์ฐ๊ฒฐ, SQL ์ ๋ฌ, ์๋ต ์ฒ๋ฆฌ ๋ฐฉ์์ด ์๋ก ๋ค๋ฆ ๋๋ค.
- ์ด๋ก ์ธํด ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
๋ฌธ์ ์ 1: ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ ์ ์ฝ๋ ์์ ํ์
- ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค(์: MySQL)๋ก ์์ฑ๋ ์ฝ๋๋ฅผ, ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค(์: Oracle)๋ก ์ ํํ๋ ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ DB ๊ด๋ จ ์ฝ๋๋ฅผ ์์ ํด์ผ ํฉ๋๋ค.
๋ฌธ์ ์ 2: ๊ฐ๋ฐ์์ ์ถ๊ฐ ํ์ต ๋ถ๋ด
- ๊ฐ๋ฐ์๋ ๊ฐ DB์ ์ปค๋ฅ์ ์ฐ๊ฒฐ, SQL ์ ๋ฌ, ๊ฒฐ๊ณผ ์๋ต ๋ฐฉ์์ ๊ฐ๊ฐ ํ์ตํด์ผ ํ์ต๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ข ๋ฅ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ํ์ต ๋น์ฉ์ด ์ฆ๊ฐํฉ๋๋ค.
4๏ธโฃ JDBC์ ๋ฑ์ฅ
JDBC(Java Database Connectivity)๋?
- JDBC๋ ์๋ฐ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ํ ์ ์๋๋ก ํ์คํ๋ ์๋ฐ API์ ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํต์ ๋ฐฉ์์ ๋ํ ํ์ค ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ์ฌ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
JDBC ํ์ค ์ธํฐํ์ด์ค
JDBC๋ ๋ค์ 3๊ฐ์ง ์ฃผ์ ๊ธฐ๋ฅ์ ํ์ค ์ธํฐํ์ด์ค๋ก ์ ๊ณตํฉ๋๋ค:
- Connection
- DB์์ ์ฐ๊ฒฐ์ ๋ด๋นํฉ๋๋ค.
- ์:
java.sql.Connection
- Statement
- SQL ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์ ๋ฌํ๋ ์ญํ ์ ํฉ๋๋ค.
- ์:
java.sql.Statement
- ResultSet
- SQL ์คํ ๊ฒฐ๊ณผ๋ฅผ ์๋ต๋ฐ๋ ๊ฐ์ฒด์ ๋๋ค.
- ์:
java.sql.ResultSet
- ์๋ฐ๋ ํ์ค ์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ฐ๋ฐ์๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ข ๋ฅ์ ์๊ด์์ด ๋์ผํ ๋ฐฉ์์ผ๋ก ์์ ํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
- ํ์คํ๋ ๊ฐ๋ฐ ๋ฐฉ์์ ์ฌ์ฉํ๋ฏ๋ก ์ฝ๋์ ์ด์์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ๋์์ง๋๋ค.
5๏ธโฃ JDBC ๋๋ผ์ด๋ฒ
- JDBC๋ ํ์ค ์ธํฐํ์ด์ค๋ง ์ ์ํ๋ฉฐ, ์ค์ ๋์์ DB ๋ฒค๋(ํ์ฌ)๊ฐ ์ ๊ณตํ๋ JDBC ๋๋ผ์ด๋ฒ๋ฅผ ํตํด ๊ตฌํ๋ฉ๋๋ค.
- ๊ฐ DB ๋ฒค๋๋ ์์ ์ DB์ ๋ง๋ JDBC ๋๋ผ์ด๋ฒ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ฃผ์ JDBC ๋๋ผ์ด๋ฒ ์์
- MySQL JDBC ๋๋ผ์ด๋ฒ
- MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๊ธฐ ์ํ ๋๋ผ์ด๋ฒ.
- ์:
com.mysql.cj.jdbc.Driver
- Oracle JDBC ๋๋ผ์ด๋ฒ
- Oracle ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๊ธฐ ์ํ ๋๋ผ์ด๋ฒ.
- ์:
oracle.jdbc.OracleDriver
- PostgreSQL JDBC ๋๋ผ์ด๋ฒ
- PostgreSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๊ธฐ ์ํ ๋๋ผ์ด๋ฒ.
- ์:
org.postgresql.Driver
JDBC ๋๋ผ์ด๋ฒ์ ์ญํ
- JDBC ๋๋ผ์ด๋ฒ๋ ํ์ค JDBC ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํต์ ํ ์ ์๋๋ก ํฉ๋๋ค.
- ๊ฐ๋ฐ์๋ ๋๋ผ์ด๋ฒ๋ง ๊ต์ฒดํ๋ฉด DB ๋ณ๊ฒฝ ์์๋ ์ฝ๋ ์์ ์์ด ๋์ผํ ๋ฐฉ์์ผ๋ก ์์ ํ ์ ์์ต๋๋ค.
6๏ธโฃ JDBC์ ํ๊ณ์ SQL ์ฐจ์ด
JDBC์ ํ๊ณ
- JDBC๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ SQL์ ์ฐจ์ด๋ฅผ ํด๊ฒฐํ์ง๋ ๋ชปํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ณ๋ก ์ง์ํ๋ SQL ๋ฌธ๋ฒ์ด๋ ๋ฐ์ดํฐ ํ์ ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ค๋ฌด์์์ SQL ์ฐจ์ด ์ฌ๋ก
- ํ์ด์ง ์ฒ๋ฆฌ SQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ง๋ค ์ฌ์ฉ ๋ฐฉ๋ฒ์ด ๋ค๋ฆ
๋๋ค.
- ์: MySQL์์๋
LIMIT์ ์ฌ์ฉํ์ง๋ง, Oracle์์๋ROWNUM์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- ์: MySQL์์๋
7๏ธโฃ JPA(Java Persistence API)์ ๋์
- JPA๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ณ๋ก ๋ค๋ฅธ SQL์ ์ ์ํด์ผ ํ๋ ๋ฌธ์ ๋ฅผ ์ถ์ํํ์ฌ ํด๊ฒฐํ ์ ์๋ ๋๊ตฌ์ ๋๋ค.
- JPA๋ ๊ฐ๋ฐ์๊ฐ ๊ฐ์ฒด ์ค์ฌ์ผ๋ก ๊ฐ๋ฐํ ์ ์๋๋ก ์ง์ํ๋ฉฐ, DB ๋ณ๊ฒฝ ์์๋ SQL์ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
2. JDBC์ ์ต์ ๋ฐ์ดํฐ ์ ๊ทผ ๊ธฐ์
1๏ธโฃ JDBC๋?
- JDBC(Java Database Connectivity)*๋ 1997๋ ์ ์ถ์๋ ์ค๋๋ ๊ธฐ์ ๋ก, ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ํ ์ ์๋๋ก ์ง์ํ๋ ํ์ค API์ ๋๋ค.
- ํ์ง๋ง, ์ง์ ์ฌ์ฉํ๊ธฐ์๋ ๋ณต์กํ๊ณ ๋ฐ๋ณต ์ฝ๋๊ฐ ๋ง์ ๊ฐ๋ฐ ์์ฐ์ฑ์ด ๋จ์ด์ง๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
2๏ธโฃ JDBC๋ฅผ ๋์ ํ๋ ์ต์ ๋ฐ์ดํฐ ์ ๊ทผ ๊ธฐ์
1. SQL Mapper
- SQL Mapper๋ JDBC๋ฅผ ๋ณด๋ค ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ ๊ธฐ์ ์ ๋๋ค.
- ์ฅ์
- JDBC์ ๋ฐ๋ณต ์ฝ๋๋ฅผ ์ ๊ฑฐํ์ฌ ๊ฐ๋ฐ ํธ์์ฑ์ ๋์ ๋๋ค.
- SQL ์๋ต ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฒด๋ก ๋ณํํด์ฃผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- ๋จ์
- ๊ฐ๋ฐ์๊ฐ SQL์ ์ง์ ์์ฑํด์ผ ํ๋ฏ๋ก, SQL ์์ฑ์ ๋ํ ์ง์์ด ํ์ํฉ๋๋ค.
- ๋ํ ๊ธฐ์
- ์คํ๋ง JdbcTemplate
- MyBatis
2. ORM(Object-Relational Mapping) ๊ธฐ์
- ORM ๊ธฐ์ ์ ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๋งคํํ์ฌ, SQL ์์ฑ ์์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐ์ํ ์ ์๋๋ก ๋์์ค๋๋ค.
- ์ฅ์
- ๋ฐ๋ณต์ ์ธ SQL์ ์ง์ ์์ฑํ ํ์ ์์ด, ORM ๊ธฐ์ ์ด SQL์ ๋์ ์ผ๋ก ์์ฑํ์ฌ ์คํํฉ๋๋ค.
- ๊ฐ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ง๋ค ๋ค๋ฅธ SQL ๋ฌธ๋ฒ ๋ฌธ์ ๋ฅผ ์๋์ผ๋ก ํด๊ฒฐํด์ค๋๋ค.
- ๊ฐ๋ฐ ์์ฐ์ฑ์ด ํฌ๊ฒ ํฅ์๋ฉ๋๋ค.
- ๋จ์
- ์ฌ์ฉ์ด ํธ๋ฆฌํ์ง๋ง ๋ฐฐ์ฐ๊ธฐ ์ด๋ ต๊ณ , ๊น์ด ์๋ ํ์ต์ด ํ์ํฉ๋๋ค.
- ๋ด๋ถ ๋์์ ์ดํดํ์ง ๋ชปํ๋ฉด, ์์์น ๋ชปํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ๋์ฒํ๊ธฐ ์ด๋ ต์ต๋๋ค.
- ๋ํ ๊ธฐ์
- JPA (Java Persistence API): ์๋ฐ ์ง์์ ORM ํ์ค ์ธํฐํ์ด์ค.
- ํ์ด๋ฒ๋ค์ดํธ: JPA์ ๋ํ์ ์ธ ๊ตฌํ์ฒด.
- ์ดํด๋ฆฝ์ค๋งํฌ: JPA์ ๋ ๋ค๋ฅธ ๊ตฌํ์ฒด.
3๏ธโฃ SQL Mapper์ ORM ๊ธฐ์ ๋น๊ต
SQL Mapper
- ์ค๋ช
- SQL๋ง ์ง์ ์์ฑํ๋ฉด, ๋๋จธ์ง ์์ ์ SQL Mapper๊ฐ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
- SQL ์์ฑ์ ๋ฅ์ํ ๊ฐ๋ฐ์๋ผ๋ฉด ์ฝ๊ฒ ๋ฐฐ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ฅ์
- SQL ์์ฑ์ ๋ํ ์์ ๋๊ฐ ๋์ต๋๋ค.
- SQL์ ์ง์ ์ ์ดํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋ฐ ์ ๋ฆฌํฉ๋๋ค.
- ๋จ์
- ์ฌ์ ํ SQL์ ์ง์ ์์ฑํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ณต ์์ ์ด ๋จ์์์ต๋๋ค.
ORM ๊ธฐ์
- ์ค๋ช
- SQL์ ์์ฑํ์ง ์๊ณ , ๊ฐ์ฒด ์ค์ฌ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ์ถ์ํ ์์ค์ด ๋์ ๊ฐ๋ฐ ์์ฐ์ฑ์ด ํฌ๊ฒ ํฅ์๋ฉ๋๋ค.
- ์ฅ์
- SQL ์์ฑ ์์ด ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉ ๊ฐ๋ฅ.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ ์์๋ ์ฝ๋ ์์ ์ด ์ต์ํ๋ฉ๋๋ค.
- ๋จ์
- ํ์ต ๊ณก์ ์ด ๊ฐํ๋ฅด๊ณ , ๋ด๋ถ ๋์์ ์ดํดํ๋ ค๋ฉด ๊น์ด ์๋ ํ์ต์ด ํ์ํฉ๋๋ค.
- ์๋ชป ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค.
4๏ธโฃ ๋ด๋ถ ๋์๊ณผ JDBC์ ์ญํ
- SQL Mapper์ ORM ๊ธฐ์ ๋ชจ๋ ๋ด๋ถ์ ์ผ๋ก๋ JDBC๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- JDBC๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํต์ ์ ์ฒ๋ฆฌํ๋ ํต์ฌ ๊ธฐ์ ๋ก, ์ต์ ๊ธฐ์ ๋ค์ด ๋์ํ๊ธฐ ์ํ ๊ธฐ๋ฐ์ด ๋ฉ๋๋ค.
- ๋ฐ๋ผ์, JDBC์ ๊ธฐ๋ณธ ์๋ฆฌ๋ฅผ ์ดํดํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ์ค์ํฉ๋๋ค:
- ๊ธฐ์ ์ ๋์ ์๋ฆฌ ์ดํด: SQL Mapper๋ ORM์ ์๋ ๋ฐฉ์์ ๋ ๊น์ด ์ดํดํ ์ ์์ต๋๋ค.
- ๋ฌธ์ ํด๊ฒฐ ๋ฅ๋ ฅ ํฅ์: JDBC ์๋ฆฌ๋ฅผ ์๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ๊ทผ๋ณธ์ ์ธ ์์ธ์ ์ฐพ์ ํด๊ฒฐํ ์ ์์ต๋๋ค.
5๏ธโฃ ๊ฒฐ๋ก
- SQL Mapper
- SQL ์์ฑ์ ๋ฅ์ํ ๊ฐ๋ฐ์์๊ฒ ์ ํฉํ๋ฉฐ, SQL์ ์ง์ ์ ์ดํ ์ ์๋ ์ฅ์ ์ด ์์ต๋๋ค.
- ORM ๊ธฐ์
- ๋ฐ๋ณต์ ์ธ SQL ์์ ์ ์ ๊ฑฐํ์ฌ ๊ฐ๋ฐ ์์ฐ์ฑ์ ๊ทน๋ํํ ์ ์์ผ๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ์ ์ ์ฐํ๊ฒ ๋์ํ ์ ์์ต๋๋ค.
- ๊ทธ๋ฌ๋ ํ์ต ๊ณก์ ์ด ๊ฐํ๋ฅด๊ณ , ์ฑ๋ฅ ํ๋์ ๋ํ ์ดํด๊ฐ ํ์ํฉ๋๋ค.
- JDBC
- ๋ชจ๋ ๋ฐ์ดํฐ ์ ๊ทผ ๊ธฐ์ ์ ๊ธฐ๋ฐ์ผ๋ก, ์๋ฐ ๊ฐ๋ฐ์๋ผ๋ฉด ๋ฐ๋์ ์ดํดํด์ผ ํ ํ์ ๊ธฐ์ ์ ๋๋ค.
3. JDBC ์ดํด ๋ฐ ํ์ฉ ์์ธ ์ ๋ฆฌ
1๏ธโฃ JDBC๋ฅผ ํตํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ
1.1 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๊ฐ์
- ๋๋ถ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค(DB)์ ์์กดํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํต์ ํ๋ ค๋ฉด JDBC(Java Database Connectivity)์ ๊ฐ์ ํ์ค API๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
1.2 H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ค์
- H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์๋ฒ๋ฅผ ๋ฐ๋์ ์คํํด๋์ด์ผ ํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ํ์ํ ์ ๋ณด๋ ์์๋ก ์ ์ํ์ฌ ์ฌ์ฌ์ฉ์ฑ์ ๋์ ๋๋ค.
public abstract class ConnectionCost {
public static final String URL = "jdbc:h2:tcp://localhost/~/test";
public static final String USERNAME = "sa";
public static final String PASSWORD = "";
}
1.3 DBConnectionUtil ํด๋์ค
- JDBC DriverManager๋ฅผ ํ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋๋ผ์ด๋ฒ๊ฐ ์ ๊ณตํ๋ ์ปค๋ฅ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
public class DBConnectionUtil {
public static Connection getConnection() {
try {
Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
log.info("get connection={}, class={}", connection, connection.getClass());
return connection;
} catch (Exception e) {
throw new IllegalStateException(e);
}
}
}
- DriverManager๊ฐ ์๋ํ์ฌ H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ผ์ด๋ฒ์ ์ฐ๊ฒฐํ๊ณ , java.sql.Connection ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
2๏ธโฃ JDBC์ ์๋ ์๋ฆฌ์ ํ๋ฆ
2.1 DriverManager ์ปค๋ฅ์ ์์ฒญ ํ๋ฆ
- ์ ํ๋ฆฌ์ผ์ด์
๋ก์ง์์ ์์ฒญ:
DriverManager.getConnection()ํธ์ถ.- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด ํธ์ถ์ ํตํด DB ์ฐ๊ฒฐ์ ์์ฒญํฉ๋๋ค.
- DriverManager์ ๋๋ผ์ด๋ฒ ํ์:
- DriverManager๋ ๋ฑ๋ก๋ ๋ชจ๋ ๋๋ผ์ด๋ฒ๋ฅผ ํ์ํ๋ฉฐ, URL๊ณผ ๋งค์นญ๋๋ ๋๋ผ์ด๋ฒ๋ฅผ ์ฐพ์ต๋๋ค.
- URL ์์:
jdbc:h2:tcp://localhost/~/test.
- ์ ํฉํ ๋๋ผ์ด๋ฒ ํธ์ถ:
- URL์ด
jdbc:h2๋ก ์์ํ๋ฉด H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ผ์ด๋ฒ๊ฐ ํธ์ถ๋ฉ๋๋ค. - ๋๋ผ์ด๋ฒ๋ ์ ์ ํ ์ปค๋ฅ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋ฐํํฉ๋๋ค.
- URL์ด
- ์ปค๋ฅ์
๋ฐํ:
- H2 ๋๋ผ์ด๋ฒ๋ org.h2.jdbc.JdbcConnection ๊ตฌํ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
- ์ด ๊ตฌํ์ฒด๋ ํ์ค ์ธํฐํ์ด์ค์ธ java.sql.Connection๋ฅผ ๊ตฌํํฉ๋๋ค.
3๏ธโฃ JDBC๋ฅผ ํ์ฉํ CRUD
3.1 ํ์ ๋ฐ์ดํฐ ๋ฑ๋ก
ํ์ ํ ์ด๋ธ ์์ฑ
CREATE TABLE member (
member_id VARCHAR(10),
money INTEGER NOT NULL DEFAULT 0,
PRIMARY KEY (member_id)
);
ํ์ ๋ฐ์ดํฐ ์ ์ฅ ์ฝ๋
- ํ์ ๋ฐ์ดํฐ๋ฅผ
INSERTSQL๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํฉ๋๋ค. - JDBC์ PreparedStatement๋ฅผ ์ฌ์ฉํ์ฌ SQL๊ณผ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํฉ๋๋ค.
public class MemberRepositoryV0 {
public Member save(Member member) {
String sql = "INSERT INTO member(member_id, money) VALUES(?, ?)";
try (Connection con = getConnection();
PreparedStatement pstmt = con.prepareStatement(sql)) {
pstmt.setString(1, member.getMemberId());
pstmt.setInt(2, member.getMoney());
pstmt.executeUpdate(); // SQL ์คํ
return member;
} catch (SQLException e) {
log.error("DB Error", e);
throw e;
}
}
}
๋ฆฌ์์ค ์ ๋ฆฌ
- ์ฌ์ฉํ ๋ฆฌ์์ค๋ ๋ฐ๋์ ๋ซ์์ผ ํฉ๋๋ค.
- try-with-resources๋ฅผ ํ์ฉํ๊ฑฐ๋, finally ๋ธ๋ก์์ ์ ๋ฆฌ ์์ ์ํ.
3.2 ํ์ ๋ฐ์ดํฐ ์กฐํ
ํ์ ์กฐํ ์ฝ๋
- ํ์ ID๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ฉฐ, ResultSet์ ํ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค.
public Member findById(String memberId) {
String sql = "SELECT * FROM member WHERE member_id = ?";
try (Connection con = getConnection();
PreparedStatement pstmt = con.prepareStatement(sql)) {
pstmt.setString(1, memberId);
try (ResultSet rs = pstmt.executeQuery()) {
if (rs.next()) {
return new Member(rs.getString("member_id"), rs.getInt("money"));
} else {
throw new NoSuchElementException("Member not found: " + memberId);
}
}
} catch (SQLException e) {
log.error("DB Error", e);
throw e;
}
}
ResultSet ๋์
- ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ ResultSet์ ์ ์ฅ๋๋ฉฐ, ๋ฐ์ดํฐ๋ ์ปค์๋ฅผ ํตํด ์์ฐจ์ ์ผ๋ก ์ฝ์ ์ ์์ต๋๋ค.
rs.next(): ์ปค์๋ฅผ ๋ค์ ํ์ผ๋ก ์ด๋ํ๋ฉฐ, ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉดtrue๋ฐํ.rs.getString("column"): ํด๋น ์ปฌ๋ผ์ ๊ฐ์ ๋ฌธ์์ด๋ก ๋ฐํ.rs.getInt("column"): ํด๋น ์ปฌ๋ผ์ ๊ฐ์ ์ ์๋ก ๋ฐํ.
3.3 ํ์ ๋ฐ์ดํฐ ์์
์์ ์ฝ๋
- ํน์ ํ์์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ SQL์ ์์ฑํ๊ณ ์คํํฉ๋๋ค.
- ์ํฅ์ ๋ฐ์ ํ(row)์ ์๋ฅผ ๋ฐํํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํฉ๋๋ค.
public void update(String memberId, int money) throws SQLException {
String sql = "UPDATE member SET money=? WHERE member_id=?";
try (Connection con = getConnection();
PreparedStatement pstmt = con.prepareStatement(sql)) {
pstmt.setInt(1, money);
pstmt.setString(2, memberId);
pstmt.executeUpdate(); // ์์ SQL ์คํ
}
}
3.4 ํ์ ๋ฐ์ดํฐ ์ญ์
์ญ์ ์ฝ๋
- ํน์ ํ์ ID๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํฉ๋๋ค.
public void delete(String memberId) throws SQLException {
String sql = "DELETE FROM member WHERE member_id=?";
try (Connection con = getConnection();
PreparedStatement pstmt = con.prepareStatement(sql)) {
pstmt.setString(1, memberId);
pstmt.executeUpdate(); // ์ญ์ SQL ์คํ
}
}
4๏ธโฃ ํ ์คํธ ์ฝ๋
CRUD ํ ์คํธ
public class MemberRepositoryV0Test {
MemberRepositoryV0 repository = new MemberRepositoryV0();
@Test
void crud() throws SQLException {
// ํ์ ๋ฑ๋ก
Member member = new Member("MemberV0", 10000);
repository.save(member);
// ํ์ ์กฐํ
Member findMember = repository.findById(member.getMemberId());
assertThat(findMember).isEqualTo(member);
// ํ์ ์์
repository.update(member.getMemberId(), 20000);
Member updatedMember = repository.findById(member.getMemberId());
assertThat(updatedMember.getMoney()).isEqualTo(20000);
// ํ์ ์ญ์
repository.delete(member.getMemberId());
assertThatThrownBy(() -> repository.findById(member.getMemberId()))
.isInstanceOf(NoSuchElementException.class);
}
}
5๏ธโฃ ์ฃผ์ ๊ฐ๋ ์์ฝ
- JDBC DriverManager:
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ผ์ด๋ฒ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, URL ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ์ ํ ๋๋ผ์ด๋ฒ๋ฅผ ์ฐพ์ ์ปค๋ฅ์ ๊ฐ์ฒด๋ฅผ ๋ฐํ.
- PreparedStatement:
- SQL์ ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ์ ์ง์ํ๋ฉฐ, SQL Injection ๋ฐฉ์ง ํจ๊ณผ๊ฐ ์์.
- ResultSet:
- ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ฉฐ, ์ปค์๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ํ์.
- ๋ฆฌ์์ค ๊ด๋ฆฌ:
Connection,PreparedStatement,ResultSet์ ๋ฐ๋์ ๋ซ์์ผ ํ๋ฉฐ, ์ด๋ฅผ ๋๋ฝํ๋ฉด ๋ฆฌ์์ค ๋์ ๋ฐ์ ๊ฐ๋ฅ.