JDBC by using DriverManager
by rlaehddnd0422JDBC๋ ์๋ฐ ํ๋ก๊ทธ๋จ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ๋์ด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๊ฒ ํด์ค ์ ์๋ ํ๋ก๊ทธ๋๋ฐ ์ธํฐํ์ด์ค ์ ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์๋ MySQL, OracleDB ๋ฑ ์ข ๋ฅ๊ฐ ๋งค์ฐ ๋งค์ฐ ๋ค์ํฉ๋๋ค.
๋ฌธ์ ๋ ์ด๋ฐ ๊ฐ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ง๋ค ์๋ฒ์ ์ปค๋ฅ์ ์ ์ฐ๊ฒฐํ๊ณ SQL๋ฅผ ์ ๋ฌํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์๋ต๋ฐ๋ ๋ฐฉ๋ฒ์ด ๋ชจ๋ ๋ค๋ฅด๋ค๋ ์ ์ ๋๋ค.
์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ JDBC๋ผ๋ ์๋ฐ ํ์ค์ด ๋ฑ์ฅํ๊ฒ ๋์์ต๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ฐ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ ์ฐ๊ฒฐํ์ง ์๊ณ JDBC๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์์กดํ๊ฒ ๋๋ฉด
์ปค๋ฅ์ ๋ถํฐ SQL์ ๋ฌ, ๊ฒฐ๊ณผ ์๋ต๊น์ง ์๋ฐ๋ ์ด๋ ๊ฒ JDBC ํ์ค ์ธํฐํ์ด์ค์ ์ ์ํด๋์๊ธฐ ๋๋ฌธ์, ์ด ํ์ค ์ธํฐํ์ด์ค๋ง์ ์ด์ฉํด์ ๊ฐ๋ฐ์๋ ๊ฐ๋ฐํ๋ฉด ๋ฉ๋๋ค.
์ด๋ ๊ฒ JDBC์ ๋ฑ์ฅ์ผ๋ก ๊ฐ๋ฐ์๊ฐ ๊ฐ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ, ์ ๋ฌ, ์๋ต๊น์ง ์๋ก ํ์ตํด์ผํ๋ ๋ฌธ์ ๊ฐ ๊ฐ์ ๋์๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ ์ ์ธํฐํ์ด์ค์ ์์กดํ๊ธฐ ๋๋ฌธ์ ์ ์ฒด ์ฝ๋๋ฅผ ๋ค ๋ณ๊ฒฝํด์ผ ํ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
์ฌ์ค JDBC๋ ์ถ์๋์ง ๊ต์ฅํ ์ค๋๋ ๊ธฐ์ ์ด๊ณ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ๋ณต์กํฉ๋๋ค. ๊ทธ๋์ ์ต๊ทผ์๋ ์ด JDBC๋ฅผ ์ง์ ์ฌ์ฉํ์ง ์๊ณ SQL Mapper์ด๋ ORM ๊ธฐ์ ๊ฐ์ด JDBC๋ฅผ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋ ๊ธฐ์ ๋ค์ ์ฌ์ฉํด JDBC๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
SQL Mapper์ ์ ํ๋ฆฌ์ผ์ด์ ์์ SQL Mapper๋ก SQL์ ์ ๋ฌํ๊ณ SQL Mapper์์ JDBC๋ก ์ ๋ฌํ๋ ๋ฐฉ์์ผ๋ก ์งํ๋ฉ๋๋ค.
- Application -> SQL Mapper -> JDBC
- SQL Mapper์ ๋ํ ๊ธฐ์ ๋ก๋ Spring JdbcTemplate, MyBatis ๊ฐ ์์ต๋๋ค.
- JDBC๋ฅผ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ๋๋ก ๋์์ฃผ๊ณ , JDBC์ ๋ฐ๋ณต ์ฝ๋๋ฅผ ์ ๊ฑฐํด์ค๋๋ค.
- SQL ์๋ต ๊ฒฐ๊ณผ๋ก ๊ฐ์ฒด๋ฅผ ํธ๋ฆฌํ๊ฒ ๋ณํํด์ค๋๋ค.
ORM ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ JPA์๊ฒ SQL์ด ์๋ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํด JPA์์ JDBC๋ก SQL์ ์ ๋ฌํ๋ ๋ฐฉ์์ ๋๋ค.
- Application -> JPA -> JDBC
- JPA ๊ตฌํ์ฒด์์ SQL์ ๋์ ์ผ๋ก ์์ฑํด JDBC๋ก ๋๊ฒจ์ฃผ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์ ์ ์ฅ์์๋ SQL์ ์ง์ ์์ฑํ์ง ์์๋ ๋๋ ํธ๋ฆฌํจ์ ์ฅ์ ์ผ๋ก ๊ฐ๊ณ ์์ต๋๋ค.
- ์ถ๊ฐ๋ก ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ง๋ค ๋ค๋ฅธ SQL์ ์ฌ์ฉํ๋ ๋ฌธ์ ๋ ํด๊ฒฐ ( JPA๊ฐ ์ง์ SQL์ ๋ง๋ค์ด ์ฃผ๊ธฐ ๋๋ฌธ )
- JPA๋ ์ธํฐํ์ด์ค๋ก ๊ตฌํ์ฒด๋ก๋ ํ์ด๋ฒ๋ค์ดํธ์ ์ดํด๋ฆฝ์ค ๋ฑ์ด ์๊ณ ํ์ด๋ฒ๋ค์ดํธ๋ฅผ ๋ง์ด ์ฐ๋ ์ถ์ธ์ ๋๋ค.
SQL Mapper๋ ORM์ด๋ ๊ฒฐ๊ตญ์ JDBC๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ JDBC๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ๊ธฐ๋ณธ์๋ฆฌ๋ ํ์์ ์ผ๋ก ์์๋์ด์ผ ํฉ๋๋ค.
์ ์ด์ , ์ด JDBC๋ฅผ ์ฌ์ฉํด ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ๋ถํฐ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ฐ์ ์ SQL Mapper, ORM ๊ธฐ์ ์ ์ ์ฉํ์ง ์๊ณ ์์ด์ ์ธ ๋ฐฉ๋ฒ๋ถํฐ ์ฌ์ฉํด์ ์ฐ๊ฒฐํด๋ณผ ์์ ์ ๋๋ค.
์ฐธ๊ณ ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ H2 ๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
DB์ฐ๊ฒฐ
1. ์ปค๋ฅ์ ํ๋ - JDBC๊ฐ ์ ๊ณตํ๋ DriverManager.getConnection() ์ฌ์ฉ
@Slf4j
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 (SQLException e) {
throw new IllegalStateException(e);
}
}
}
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ํ๋๋ฐ ํ์ํ ๊ธฐ๋ณธ ์ ๋ณด๋ค์ ์ฌ์ ์ ์์๋ค๋ก ์ ์ํด ๋์์ต๋๋ค. ( URL, USERNAME, PASSWORD )
- ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ DB๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํด์๋ ์ฐ์ "์ปค๋ฅ์ "์ด๋ ๋งค๊ฐ์ฒด๊ฐ ํ์ํฉ๋๋ค. ์ปค๋ฅ์ ์ JDBC๊ฐ ์ ๊ณตํ๋ DriverManager์ getConnection() ๋ฉ์๋๋ฅผ ํตํด DB์ ๋ํ ์ปค๋ฅ์ ์ ํ๋ํ ์ ์์ต๋๋ค.
- getConnection()์ ํ๊ฒ ๋๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ผ์ด๋ฒ๋ฅผ ์ฐพ์ ํด๋น ๋๋ผ์ด๋ฒ๊ฐ ์ ๊ณตํ๋ ์ปค๋ฅ์ ์ ๋ฐํํด์ค๋๋ค.
- H2์ ๊ฒฝ์ฐ H2์ ๋ํ ์ปค๋ฅ์ , MySQL์ด๋ฉด Mysql์ ๋ํ ์ปค๋ฅ์ ์ DriverManager๊ฐ ์๋์ผ๋ก ์ฐพ์์ ๋ฐํํด์ค๋๋ค.
- DirverManager.getConnection()์ ์ฌ์ฉํด JDBC๊ฐ ์ ๊ณตํ๋ Connection(์ธํฐํ์ด์ค)๋ฅผ ์ป์ ์ ์์ต๋๋ค.
- Connection์ ์ธํฐํ์ด์ค์ด๋ฉฐ, getConnection()์ ํตํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ผ์ด๋ฒ๋ฅผ ์ฐพ์ ํด๋น ๋๋ผ์ด๋ฒ๊ฐ ์ ๊ณตํ๋ ์ปค๋ฅ์ ๊ตฌํ์ฒด๋ฅผ ์ป์ ์ ์์ต๋๋ค.
Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
์ด์ JDBC์ ์ปค๋ฅ์ ์ ํ๋ํด์ DB์ ์ ๊ทผํด ๋ก์ง์ ํตํด DB์ ๋ฐ์ดํฐ๋ฅผ ์ด๊ธฐํ ํ ํ ํ ์ด๋ธ์ ๋ง๋ค๊ณ , ๋ฐ์ดํฐ๋ฅผ ์ฝ์ , ๋ฐ์ดํฐ๋ฅผ Id๋ฅผ ํตํด ์กฐํํด๋ณด๊ฒ ์ต๋๋ค.
DB ์ ๊ทผ
package hello.repository;
import hello.connection.DBConnectionUtil;
import hello.domain.Member;
import lombok.extern.slf4j.Slf4j;
import java.sql.*;
import java.util.NoSuchElementException;
/**
* JDBC - DriverManager ์ฌ์ฉ
*/
@Slf4j
public class MemberRepositoryV0 {
public void init() throws SQLException {
String sql = "drop table member if exists cascade;\n" +
" create table member (\n" +
" member_id varchar(10),\n" +
" money integer not null default 0,\n" +
" primary key (member_id)\n" +
");";
Connection con = null;
PreparedStatement pstmt = null;
try
{
con = getConnection();
pstmt = con.prepareStatement(sql);
pstmt.executeUpdate();
} catch (SQLException e) {
throw e;
}finally
{
close(con,pstmt,null);
}
}
public Member save(Member member)
{
String sql = "insert into member(member_id, money) values(?,?)";
Connection con = null;
PreparedStatement pstmt = null;
try
{
con = getConnection();
pstmt = con.prepareStatement(sql);
pstmt.setString(1,member.getMemberId());
pstmt.setInt(2, member.getMoney());
pstmt.executeUpdate();
return member;
} catch (SQLException e) {
log.error("db error",e);
throw new RuntimeException(e);
}finally {
close(con, pstmt, null);
}
}
public Member findById(String memberId) throws SQLException {
String sql = "select * from member where member_id = ?";
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
con = getConnection();
pstmt = con.prepareStatement(sql);
pstmt.setString(1,memberId);
rs = pstmt.executeQuery();
if(rs.next())
{
Member member = new Member();
member.setMemberId(rs.getString("member_id"));
member.setMoney(rs.getInt("money"));
return member;
}
else
{
throw new NoSuchElementException("member not found memberId="+memberId);
}
} catch (SQLException e) {
log.error("db error",e);
throw e;
}finally{
close(con,pstmt,rs);
}
}
private Connection getConnection() {
return DBConnectionUtil.getConnection();
}
private void close(Connection con, Statement stmt, ResultSet rs)
{
if(rs!=null)
{
try
{
rs.close();
} catch (SQLException e) {
log.info("error",e);
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
log.info("error", e);
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
log.info("error", e);
}
}
}
}
์ฐ๊ฒฐ๋ถํฐ "๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๊ธฐํ", "๋ฐ์ดํฐ ์กฐํ", "์ญ์ ", "์ ๋ฐ์ดํธ", "์ฐ๊ฒฐ ์ข ๋ฃ" ๋ฑ DB์ ์ ๊ทผํ๋ ์ํฉ์์ DB์ ์ฐ๊ฒฐ์ด ๋ด๋ถ์ ์ธ ๋ฌธ์ ๋ก ์ฐ๊ฒฐ์ด ์๋๋ ๊ฒฝ์ฐ SQLException ์์ธ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ try catch๋ฌธ์ ์ด์ฉํด์ ๋ฉ์๋์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํด์ฃผ์ด์ผ ํฉ๋๋ค. ๊ฝค ๋ฒ๊ฑฐ๋ก์ด ์์ ์ ๋๋ค.
์ด ์์ ์ "JdbcTemplate"์ ์ฌ์ฉํด ์ค์ผ ์ ์์ต๋๋ค.
- ์ด ์ ์ ๋ง๋ค์ด ๋ DBConnectionUtil์ ํตํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ con์ ํ๋ํ๊ณ ,
- con.prepareStatement(sql)์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ฌํ SQL์ PrepareStatement ๊ฐ์ฒด์ ์ ๋ฌํ๊ณ ,
- ์ถ๊ฐ์ ์ผ๋ก ์ ๋ฌํ ๋ฐ์ดํฐ๋ค์ PrepareStatement ๊ฐ์ฒด์ setString์ผ๋ก ์ง์ ํฉ๋๋ค.
- ์ฟผ๋ฆฌ๋ฅผ execute~()๋ฅผ ์ฌ์ฉํด ์คํํ๊ณ ๋ ๋ค ๊ฒฐ๊ณผ๊ฐ์ ResultSet rs์ ์ ์ฅ๋ฉ๋๋ค.
- executeQuery() - DB ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ ์ฌ์ฉ
- executeUpdate() - ์กฐํํ ๋ ์ฌ์ฉ
- ์ฟผ๋ฆฌ๋ฌธ์ ์คํํ ๊ฒฐ๊ณผ๋ฅผ ๋๊ฒจ๋ฐ์ Resultset rs์์ ์ฟผ๋ฆฌ๋ฌธ ์คํ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ด๊ธฐํํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํด๋ณด์๋๋ฐ, ๋ฐ์ดํฐ ์ญ์ , ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ ๋ฑ ๋ค๋ฅธ ์์ ๋ค๋ ์์ ๊ฐ์ ๋งฅ๋ฝ์ผ๋ก ์งํ๋๊ธฐ ๋๋ฌธ์ ์ฝ๋๋ ์๋ตํ๋๋ก ํ๊ฒ ์ต๋๋ค.
์ด๋ ๊ฒ ์ฌ์ฉํ๋ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ปค๋ฅ์ ์ ์ง์ ์ป์ง ์๊ณ , ์๋ฐ๊ฐ ์ ๊ณตํ๋ JDBC ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด ์ปค๋ฅ์ ์ JDBC๋ฅผ ํตํด ์ง์ ์ป๊ณ , SQL์ JDBC์ ์ ๋ฌํด์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ณ ์ ์ฅํ๋ ์์ ๋ค์ ์ํํด๋ณด์์ต๋๋ค.
Repository ๊ณ์ธต์์ ๊ฐ ๋ฉ์๋๋ง๋ค try - catch๋ฌธ์ ์ฌ์ฉํด ์์ธ๋ฅผ ์ฒ๋ฆฌํด์ฃผ๋ ์์ ๋ฟ๋ง ์๋๋ผ, ๋ฉ์๋๋ฅผ ์ํํ ๋๋ง๋ค ์ปค๋ฅ์ ์ ํ๋ํ๋ ๊ท์ฐฎ์ ์์ ๋ค์ด ๋ง์๋๋ฐ์. ์ด์ ํ ๋จ๊ณ์ฉ ์ ์ง์ ์ผ๋ก ๋ฐ์ ์์ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ๋ค์ ์์๋ณด๊ฒ ์ต๋๋ค !
<์ฐธ๊ณ ์๋ฃ>
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1/dashboard
'๐ Backend > DB Access' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํธ๋์ญ์ AOP + ์์ธ ์ ํ ์ ์ฉํ Service ๊ณ์ธต ๋ถ๋ฆฌ (0) | 2023.04.06 |
---|---|
Spring ํธ๋์ญ์ AOP - @Transactional ์ฌ์ฉ (0) | 2023.04.05 |
ํธ๋์ญ์ ์ธํฐํ์ด์ค, ํธ๋์ญ์ ํ ํ๋ฆฟ์ ์ด์ฉํ Service ๊ณ์ธต์ Transaction ๋ฌธ์ ํด๊ฒฐ (0) | 2023.04.05 |
Spring์ ์ฌ์ฉํ์ง ์๊ณ Transaction ํด๊ฒฐ (0) | 2023.04.04 |
์ปค๋ฅ์ ํ by using DataSource Interface (0) | 2023.04.03 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422