๐ ํ ๋น ์คํ๋ง 3์ฅ ์ ๋ฆฌ
๐ข ์์ธ ์ํฉ์ ๋ํ ์ฒ๋ฆฌ
JDBC ์์ ๊ธฐ๋ฅ์ ์์ธ์ฒ๋ฆฌ ์ฝ๋
public void deleteAll() throws SQLException {
Connection c = dataSource.getConnection();
PreparedStatement ps = c.preparedStatement("delete from users");
ps.close();
c.close();
}
์ ๋ฉ์๋๋ Connection
๊ณผ PreparedStatement
๋ผ๋ ๋ ๊ฐ์ ๊ณต์ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์์ ์ฌ์ฉํ๊ณ ์๋ค. ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋ฉด close()
๊ฐ ํธ์ถ๋๋ฉด์ ๋ฆฌ์์ค๋ฅผ ๋ฐํํ๋ค. ๋ง์ฝ์ PreparedStatement
๋ฅผ ์ฒ๋ฆฌํ๋ ๋์ค์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ์ด๋๋ ๋ฉ์๋ ์คํ์ด ์ ๋๋ก ๋๋ง์น์ง ๋ชปํ์ฑ ๋ฉ์๋๋ฅผ ๋น ์ ธ๋๊ฐ๊ฒ๋๋ค. ๋ฐ๋ผ์ close()
๋ฉ์๋๊ฐ ์คํ๋์ง ์์์ ์ ๋๋ก ๋ฆฌ์์ค๊ฐ ๋ฐํ๋์ง ์๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์๋ฒ๋ ์ ํ๋ ๊ฐ์์ DB ์ปค๋ฅ์
์ ๋ง๋ค์ด์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋ก ๊ด๋ฆฌํ๋ค. DB ํ์ ๋งค๋ฒ getConnection()
์ผ๋ก ๊ฐ์ ธ๊ฐ ์ปค๋ฅ์
์ ๋ช
์์ ์ผ๋ก close()
ํด์ ๋๋ ค์ค์ผ์ง์ง๋ง ๋ค์ ํ์ ๋ฃ์๋ค๊ฐ ๋ค์ ์ปค๋ฅ์
์์ฒญ์ด ์์ ๋ ์ฌ์ฌ์ฉํ ์ ์๋ค.
์์ ์ด์ผ๊ธฐํ Connection
๊ณผ PreparedStatement
๊ฐ ์ ๋๋ก ๋ฐํ๋์ง ๋ชปํ๋ ์ํฉ์ ์๊ฐํด๋ณด์. ์ด๋ฐ ์ํฉ์ด ๊ณ์ ์์ด๊ฒ ๋๋ฉด ์ด๋ ์๊ฐ์ ์ปค๋ฅ์
ํ์ ์ฌ์ ๊ฐ ์์ด์ง๊ณ ๋ฆฌ์์ค๊ฐ ๋ชจ์๋๋ค๋ ์ฌ๊ฐํ ์ค๋ฅ๊ฐ ์ผ์ด๋๊ณ ์๋ฒ๊ฐ ์ค์ง๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ ์ฝ๋๋ ํด๋ผ์ด์ธํธ๋ฅผ ์ํ ์ง์์ ์ธ ์๋ฒ ์ด์์ ์น๋ช
์ ์ธ ์ฝ์ ์ ๋ดํฌํ๊ณ ์๋ค.
๋ฆฌ์์ค ๋ฐํ๊ณผ close()
์ ๋ํด
connection
์ด๋ PreparedStatement
์๋ close()
๋ฉ์๋๊ฐ ์๋ค. ์ด๋ close
๋ ๋ฆฌ์์ค๋ฅผ ๋ฐํํ๋ค๋ ์๋ฏธ๋ก ์ดํดํ๋ ๊ฒ์ด ์ข๋ค. Connection
๊ณผ PreparedStatement
๋ ๋ณดํต ํ(pool
)๋ฐฉ์์ผ๋ก ์ด์๋๋ค. pool
๋ฐฉ์์ด๋ ์์ฃผ์ฐ๋ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋๊ณ ํ์ํ ๋๋ง๋ค ๋น๋ฆฌ๊ณ ์ฌ์ฉํ ๋ค์ ๋ฐ๋ฉํ๋ ๋ฐฉ์์ด๋ค. ๋ฐ๋ผ์ ํ ์์ ์ ํ๋ ์์ ๋ฆฌ์์ค(Connection
, Statement
)๋ฅผ ๋ง๋ค์ด ๋๊ณ ํ์ํ ๋ ํ ๋นํ๊ณ ๋ฐํํ์ฌ ๋ค์ ํ์ ๋ฃ๋ ๋ฐฉ์์ผ๋ก ์ด์๋๋ค. ์ฆ ์์ฒญ์ด ๋งค์ฐ ๋ง์ ์๋ฒํ๊ฒฝ์์๋ ๋งค๋ฒ ์๋ก์ด ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ ๋์ ํ์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋ ๋ฆฌ์์ค๋ฅผ ๋๋ ค๊ฐ๋ฉฐ ์ฌ์ฉํ๋ ํธ์ด ํจ์ฌ ์ ๋ฆฌํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉํ ๋ฆฌ์์ค๋ ๋น ๋ฅด๊ฒ ๋ฐํํด์ผํ๋ค. ์ด ๋ ๊ทธ๋ ์ง ๋ชปํ๋ฉด ํ์ ์๋ ๋ฆฌ์์ค๊ฐ ๊ณ ๊ฐ๋๊ณ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์์์ ๋งํ close()
๋ ์ฌ์ฉํ ๋ฆฌ์์ค๋ฅผ ๋๋ ค์ฃผ๋ ์ญํ ์ ํ๋ค.
๊ทธ๋์ JDBC์ฝ๋์์๋ ์ด๋ฐ ์์ธ ์ํฉ์์๋ ๊ฐ์ ธ์จ ๋ฆฌ์์ค๋ฅผ ๋ฐํํ ์ ์๋๋ก try/catch/finally ์ฌ์ฉ์ ๊ถ์ฅํ๋ค. ์๋๋ deleteAll()
๋ฉ์๋๋ฅผ ๋ณํํ ๊ฒ์ด๋ค.
public void deleteAll() throws SQLExceptions {
Connection c = null;
PrepareStatement ps = null;
try {
c = dataSource.getConnection();
ps = c.preparedStatement("delete from users");
ps.executeUpdate();
} catch(SQLException e) {
throw e;
} finally {
if (ps != null) {
try {
ps.close();
} catch(SQLException e) {
}
}
if (c != null) {
try {
c.close();
} catch (SQLException e) {
}
}
}
}
์ด์ ์์ธ ์ํฉ์์๋ ์์ ์ ์ฝ๋๊ฐ ๋์๋ค. finally๋ try ๋ธ๋ก์ ์ํํ ํ์ ์์ธ๊ฐ ๋ฐ์ํ๋ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๋์๋ ์๊ด์์ด ๋ฐ๋์ ์คํ๋๋ ์ฝ๋๋ฅผ ๋ฃ์์ ๋ ์ฌ์ฉํ๋ค. ์ผ๋จ try ๋ธ๋ก์ผ๋ก ๋ค์ด์ฐ๋ค๋ฉด ๋ฐ๋์ connection
์ด๋ PreparedStatement
์ close()
ํธ์ถ์ ํตํด ๊ฐ์ ธ์จ ๋ฆฌ์์ค๋ฅผ ๋ฐํํด์ผ ํ๋ค. ์ด์ ๋ฐ๋ก ๊ณ ๋ คํด์ผํ ์ํฉ์ Connection
๊ณผ PreparedStatement
์ค ์ด๋ค ๊ฒ์ close()
๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํ ์ง๊ฐ ๋ฌ๋ผ์ง๋ค๋ ๊ฒ์ด๋ค.
๋ง์ฝ์ getConnection()
์์ DB
์ปค๋ฅ์
์ ๊ฐ์ ธ์ค๋ค๊ฐ ์ผ์์ ์ธ DB
์๋ฒ ๋ฌธ์ ๋, ๋คํธ์ํฌ ๋ฌธ์ ๋๋ ๊ทธ ๋ฐ์ ์์ธ์ํฉ ๋๋ฌธ์ ์์ธ๊ฐ ๋ฐ์ํ๋ค๋ฉด ps
๋ ๋ฌผ๋ก ์ด๊ณ ๋ณ์ c
๋ ์์ง null
์ํ์ด๋ค. null
์ํ์ ๋ณ์์ close()
๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ ๋๋ค.
PreparedStatement
๋ฅผ ์์ฑํ๋ค๊ฐ ์์ธ๊ฐ ๋ฐ์ํ๋ค๋ฉด ๊ทธ๋๋ c ๋ณ์๊ฐ ์ปค๋ฅ์
๊ฐ์ฒด๋ฅผ ๊ฐ๊ณ ์๋ ์ํ์ด๋ c๋ close()
ํธ์ถ์ด ๊ฐ๋ฅํ ๋ฐ๋ฉด ps
๋ ์๋๋ค. ๋ง์ฝ ps
๋ฅผ ์คํํ๋ค๊ฐ ์์ธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ๋ผ๋ฉด, ps
์ c
๋ชจ๋ close()
๋ฉ์๋๋ฅผ ํธ์ถํด์ค์ผ ํ๋ค. ์ด๋ ์์ ์์ ์์ธ๊ฐ ๋ฐ์ํ๋์ง์ ๋ฐ๋ผ์ close()
๋ฅผ ์ฌ์ฉํ ์ ์๋ ๋ณ์๊ฐ ๋ฌ๋ผ์ง ์ ์๊ธฐ ๋๋ฌธ์ finally
์์๋ ๋ฐ๋์ c
์ ps
๊ฐ null
์ด ์๋์ง ๋จผ์ ํ์ธํ ํ์ close()
๋ฉ์์ค๋ฅผ ํธ์ถํด์ผ ํ๋ค.
๋ค๋ฅธ ๋ฌธ์ ๋ก๋ ์ง๊ธ close()
๋ SQLException
์ด ๋ฐ์ํ ์ ์๋ ๋ฉ์๋๋ผ๋ ์ ์ด๋ค. ๋ฐ๋ผ์ try
/catch
๋ฌธ์ผ๋ก ์ฒ๋ฆฌํ๋ค. ๋ฌผ๋ก close()
๊ฐ ์คํจํ์ ๋๋ ํน๋ณํ ํ ์กฐ์น๋ ์๊ธฐ ๋๋ฌธ์ ๋น์๋๋ค. ์ด๋ ์ด๋ฏธ deleteAll()
์ SQLException
์ด ๋์ ธ์ง๋ค๊ณ ์ ์ธ๋์ด ์์ผ๋ close()
๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋์ง ์์๊น ๋ผ๋ ์๊ฐ์ ํ ์ ์๋ค. [ SQLException์ ๋์ ธ์ง๋ค.
๋ ์๋ฏธ๊ฐ ๋ฌด์์ผ๊น..? ]
SQLException์ ๋์ ธ์ง๋ค.
๋ฅผ ์์๋ณด์๋ค.
์ฌ๊ธฐ์ ๋์ง๋ค๋ ๊ฒ์ ์ฝ๊ฐ ๋ฉ์๋ ์ฌ์ด์ ์กด์ฌํ๋ ์ฑ ์ ์ ๊ฐ๋ผ๋ ์๋ฏธ๋ฅผ ์ง๋๊ณ ์๋๊ฑฐ ๊ฐ๋ค.(๋ฌผ๋ก ๋ด ์๊ฐ์ด๋ค.)
throws
: ์์ธ๋ฅผ ์ ๊ฐ์ํค๋ ๊ฒ
throw
: ๊ฐ์ ๋ก ์์ธ๋ฅผ ๋ฐ์์ํค๋ ๊ฒ
์ฆ throws๋ ์ ๊ฐ, throw๋ ํ๋ก๊ทธ๋๋จธ์ ํ๋จ์ ๋ฐ๋ฅธ ์ฒ๋ฆฌ์ด๋ค.
์กฐ๊ธ ๋ ์์ธํ ์์๋ณด๋ฉด throws๋ฅผ ์ฌ์ฉํ๋ฉด, ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ณณ์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํด์ค์ผ ํ๋ค.
throw๋ ์์ธ๋ฅผ ๊ฐ์ ๋ก ๋ฐ์์ํค๋ ๊ฒ์ด๋ค. ํ๋ก๊ทธ๋๋จธ์ ํ๋จ์ ๋ฐ๋ผ ํด๋น ๋ถ๋ถ์ ์์ธ๋ฅผ ๋ฐ์์์ผ์ผ ํ๋ ๋ถ๋ถ์ throw๋ฅผ ์ฌ์ฉํ๋ค.
๐ข ๋ณํ๋ ๊ฒ๊ณผ ๋ณํ์ง ์๋ ๊ฒ
์์ try/catch/finally๋ก ๊ณ ์น ์ฝ๋์ ๋ฌธ์ ์ ์ ๊ณ์ํด์ ๊ฐ์ ์ฝ๋๋ฅผ ๋ฐ๋ณตํ๊ณ ์๋ค๋ ์ ์ด๋ค. ๋ฐ๋ณต๋ ์ฝ๋๋ฅผ ๊ณ์ ์ฌ์ฉํ๋ค๋ณด๋ฉด, ์ค์, ์ ์ง๋ณด์ ๋ฑ ๋งค์ฐ ๋ง์ ๊ฒ์ด ๋น ์ง ์ํ์ด ์๊ธฐ ๋๋ฌธ์ ์กฐ์ฌํด์ผ ํ๋๋ฐ, ์์์ ์์ฑํ try/catch/finally๋ ๊ฐ์ ์ด์น๋ฅผ ๊ฐ๊ณ ์๋ค. ๋ฐ๋ผ์ ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ํ๋ค.
UserDao์ ๋ฉ์๋๋ฅผ ๊ฐ์ ํ๋ ์์
์ ์์ํด๋ณด์. ๊ฐ์ฅ ๋จผ์ ํ ์ผ์ ๋ณํ๋ ์ฑ๊ฒฉ์ด ๋ค๋ฅธ ๊ฒ์ ์ฐพ์๋ด๋ ๊ฒ
deleteAll()
๋ฉ์๋์ ์ฝ๋๋ฅผ ๋ค์ ์ดํด๋ณด์.
Connection c = null;
PreparedStatement ps = null;
// ---- ๋ณํ์ง ์๋ ๋ถ๋ถ ----
try {
c = dataSource.getConnection();
// ----------------------
ps = c.preparedStatement("delete from users"); // โ ๋ณํ๋ ๋ถ๋ถ
// ---- ๋ณํ์ง ์๋ ๋ถ๋ถ ----
ps.executeUpdate();
} catch (SQLException e) {
throw e;
} finally {
if (ps != null) { try {ps.close();} catch (SQLException e) {} }
if (c != null) { try {c.close();} catch (SQLException e) {} }
// ----------------------
}
1. ๋ฉ์๋ ์ถ์ถ
๋จผ์ ์๊ฐํด ๋ณผ ์ ์๋ ๊ฒ์ ๋ณํ๋ ๋ถ๋ถ์ ๋ฉ์๋๋ก ๋นผ๋ ๊ฒ์ด๋ค. ๋ณํ๋ ๋ถ๋ถ์ ๋ฉ์๋๋ก ์ถ์ถํ๊ณ ๋ณํ์ง ์๋ ๋ถ๋ถ์์ ํธ์ถํ๋๋ก ๋ง๋ค๋ฉด, ์ด๋ ต๋ค๊ณ ์๊ฐํ ์์ ์ ํด๊ฒฐํ ์ ์๋ค.
public void deleteAll() throws SQLExceptions {
//...
try {
c = dataSource.getConnection();
ps = makeStatement(c);
ps.executeUpdate(c);
} catch (SQLException e) {
//...
}
//...
}
private PreparedStatement makeStatement(Connection c) throws SQLException {
PreparedStatement ps;
ps = c.prepareStatement("delete from users");
return ps;
}
์์ฃผ ๋ฐ๋๋ ๋ถ๋ถ์ ๋ฉ์๋๋ก ๋ ๋ฆฝ์์ผฐ๋๋ฐ ๋น์ฅ ๋ด์๋ ๋ณ ์ด๋์ด ์์ด ๋ณด์ธ๋ค. ์๋ํ๋ฉด ๋ณดํต ๋ฉ์๋ ์ถ์ถ ๋ฆฌํํ ๋ง์ ์ ์ฉํ๋ ๊ฒฝ์ฐ์๋ ๋ถ๋ฆฌ์ํจ ๋ฉ์๋๋ฅผ ๋ค๋ฅธ ๊ณณ์์ ์ฌ์ฌ์ฉํ ์ ์์ด์ผ ํ๋๋ฐ, ์ด๊ฑด ๋ฐ๋๋ก ๋ถ๋ฆฌ์ํค๊ณ ๋จ์ ๋ฉ์๋๊ฐ ์ฌ์ฌ์ฉ์ด ํ์ํ ๋ถ๋ถ์ด๊ณ ๋ถ๋ฆฌ๋ ๋ฉ์๋๋ DAO ๋ก์ง๋ง๋ค ์๋กญ๊ฒ ๋ง๋ค์ด์ ํ์ฅ๋ผ์ผ ํ๋ ๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ญ๊ฐ ๋ฐ๋๋ก ๋๋ค.
2. ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด์ ์ ์ฉ
ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด์ ์ด์ฉํด์ ๋ถ๋ฆฌํ ์ ์๋ค. ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด์ ์์์ ํตํด ๊ธฐ๋ฅ์ ํ์ฅํด์ ์ฌ์ฉํ๋ ๋ถ๋ถ์ด๋ค. ๋ณํ์ง ์๋ ๋ถ๋ถ์ ์ํผํด๋์ค์ ๋๊ณ ๋ณํ๋ ๋ถ๋ถ์ ์ถ์ ๋ฉ์๋๋ก ์ ์ํด๋ฌ์ ์๋ธํด๋์ค์์ ์ค๋ฒ๋ผ์ด๋ํ์ฌ ์๋กญ๊ฒ ์ ์ํด ์ฐ๋๋ก ํ๋ ๊ฒ์ด๋ค.
์ถ์ถํด์ ๋ณ๋์ ๋ฉ์๋๋ก ๋
๋ฆฝ์ํจ makeStatement()
๋ฉ์๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ถ์ ๋ฉ์๋ ์ ์ธ์ผ๋ก ๋ณ๊ฒฝํ๋ค. ๋ฌผ๋ก UserDao ํด๋์ค๋ ์ถ์ ํด๋์ค๊ฐ ๋ผ์ผ ํ ๊ฒ์ด๋ค.
abstract protected PreparedStatement makeStatement(Connection c) throws SQLException;
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์์ํ๋ ์๋ธํด๋์ค๋ฅผ ๋ง๋ค์ด์ ๊ฑฐ๊ธฐ์ ์ด ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ค. ๊ณ ์ ๋ JDBC try/catch/finally ๋ธ๋ก์ ๊ฐ์ง ์ํผํด๋์ค ๋ฉ์๋์ ํ์์ ๋ฐ๋ผ์ ์์์ ํตํด ๊ตฌ์ฒด์ ์ธ PreparedStatement๋ฅผ ๋ฐ๊ฟ์ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋๋ ์๋ธํด๋์ค๋ก ๊น๋ํ๊ฒ ๋ถ๋ฆฌํ ์ ์๋ค. ๋ค์์ UserDao๋ฅผ ์์ํด์ ๋ง๋ ํด๋์ค์ด๋ค.
public class UserDaoDeleteAll extends UserDao {
protected PreparedStatement makeStatement(Connection c) throws SQLException {
PreparedStatement ps = c.prepareStatement("delete from users");
return ps;
}
}
์ด๋ ๊ฒ UserDao ํด๋์ค์์ UserDaoDeleteAll์ ํ์ฅํ๋ฏ๋ก์จ UserDao ํด๋์ค์ ๊ธฐ๋ฅ์ ํ์ฅํ๊ณ ์ถ์ ๋๋ง๋ค ์์์ ํตํด ์์ ๋กญ๊ฒ ํ์ฅํ ์ ์๊ณ , ํ์ฅ ๋๋ฌธ์ ๊ธฐ์กด์ ์์ DAO ํด๋์ค์ ๋ถํ์ํ ๋ณํ๋ ์๊ธฐ์ง ์๋๋ก ํ ์ ์์ผ๋ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ ํต์ฌ ์๋ฆฌ์ธ ๊ฐ๋ฐ ํ์ ์์น(OCP)์ ์งํค๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด ๋ผ ์๋ ์๋ ๊ฒ ๊ฐ๋ค. ํ์ง๋ง ํฌํ๋ฆฟ ๋ฉ์๋ ํจํด์ผ๋ก์ ์ ๊ทผ์ ์ ํ์ด ๋ง๋ค. ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ DAO ๋ก์ง๋ง๋ค ์์์ ํตํด ์๋ก์ด ํด๋์ค๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค๋ ์ ์ด๋ค. ๋ง์ฝ ์ด ๋ฐฉ์์ ์ฌ์ฉํ๋ค๋ฉด UserDao์ JDBC ๋ฉ์๋๊ฐ 4๊ฐ์ผ ๊ฒฝ์ฐ 4๊ฐ์ ์๋ธ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํด์ผ ํ๋ค. (๋ญ์งโฆ? ์ด๋ด๊ฑฐ๋ฉด ๊ตณ์ด ์ด๋ ๊ฒ ๋ง๋ค ํ์๊ฐ ์๋?)
์ฆ ์ด๋ฌํ ๊ณผ์ ์ ํตํด ํ์ฅ์ ๊พํ๋ ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด์ ๋จ์ ์ด ๊ณ ์ค๋ํ ๋๋ฌ๋๋ค.
3. ์ ๋ต ํจํด์ ์ ์ฉ
๊ฐ๋ฐฉ ํจ์ ์์น์ ์ ์งํค๋ ๊ตฌ์กฐ์ด๋ฉด์๋ ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด๋ณด๋ค ์ ์ฐํ๊ณ ํ์ฅ์ฑ์ด ๋ฐ์ด๋ ๊ฒ์ด ์ค๋ธ์ ํธ๋ฅผ ์์ ๋๋ก ๋ถ๋ฆฌํ๊ณ ํด๋์ค ๋ ๋ฒจ์์๋ ์ธํฐํ์ด์ค๋ฅผ ํตํด์๋ง ์์กดํ๋๋ก ๋ง๋๋ ์ ๋ต ํจํด์ด๋ค.
์ ๋ต ํจํด์ OCP ๊ด์ ์ ๋ณด๋ฉด ํ์ฅ์ ํด๋นํ๋ ๋ณํ๋ ๋ถ๋ถ์ ๋ณ๋์ ํด๋์ค๋ก ๋ง๋ค์ด ์ถ์ํ๋ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์์ํ๋ ๋ฐฉ์์ด๋ค. ์ด๋ ๋ฏ deleteAll()์ JDBC๋ฅผ ์ด์ฉํด DB๋ฅผ ์ ๋ฐ์ดํธ ํ๋ ์์ ์ด๋ผ๋ ๋ณํ์ง ์๋ ๋งฅ๋ฝ์ ๊ฐ๋๋ค. deleteAll()์ ์ปจํ ์คํธ๋ฅผ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- DB ์ปค๋ฅ์ ๊ฐ์ ธ์ค๊ธฐ
- PreparedStatement๋ฅผ ๋ง๋ค์ด์ค ์ธ๋ถ ๊ธฐ๋ฅ ํธ์ถํ๊ธฐ
- ์ ๋ฌ๋ฐ์ PreparedStatement ์คํํ๊ธฐ
- ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ฅผ ๋ค์ ๋ฉ์๋ ๋ฐ์ผ๋ก ๋์ง๊ธฐ
- ๋ชจ๋ ๊ฒฝ์ฐ์ ๋ง๋ค์ด์ง PreparedStatement์ connection์ ์ ์ ํ ๋ซ์์ฃผ๊ธฐ
์ฌ๊ธฐ์ 2๋ฒ์งธ ์์ ์์ ์ฌ์ฉํ๋ PreparedStatement๋ฅผ ๋ง๋ค์ด์ฃผ๋ ์ธ๋ถ ๊ธฐ๋ฅ์ด ๋ฐ๋ก ์ ๋ต ํจํด์์ ๋งํ๋ ์ ๋ต์ด๋ผ๊ณ ๋ณผ ์ ์๋ค. ์ ๋ต ํจํด ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ผ ์ด ๊ธฐ๋ฅ์ ์ธํฐํ์ด์ค๋ก ๋ง๋ค์ด๋๊ณ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ํตํด PreparedStatement๋ฅผ ์์ฑํ๋ ์ ๋ต์ ํธ์ถํ ๋๋ ์ด ์ปจํ ์คํธ ๋ด์์ ๋ง๋ค์ด๋ DB ์ปค๋ฅ์ ์ ์ ๋ฌํด์ผ ํ๋ค๋ ์ ์ด๋ค. ์ฆ ์ปค๋ฅ์ ์ด ์์ผ๋ฉด PreparedStatement๋ ๋ง๋ค ์ ์๋ค.
PreparedStatement๋ฅผ ๋ง๋๋ ์ ๋ต์ ์ธํฐํ์ด์ค๋ ์ปจํ ์คํธ๊ฐ ๋ง๋ค์ด๋ Connection์ ์ ๋ฌ๋ฐ์์ PreparedStatement๋ฅผ ๋ง๋ค๊ณ ๋ง๋ค์ด์ง PreparedStatement ์ค๋ธ์ ํธ๋ฅผ ๋๋ ค์ค๋ค. ์ด ๋ด์ฉ์ ์ธํฐํ์ด์ค๋ก ์ ์ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
package springbook.user.dao;
public interface StatementStrategy {
PreparedStatement makePreparedStatement(Connection c) throws SQLException;
}
์ ์ธํฐํ์ด์ค๋ฅผ ์์ํด์ ์ค์ ์ ๋ต, ์ฆ ๋ฐ๋๋ ๋ถ๋ถ์ธ PreparedStatement๋ฅผ ์์ฑํ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด๋ณด์. deleteAll() ๋ฉ์๋์ ๊ธฐ๋ฅ์ ์ํด ๋ง๋ ์ ๋ต ํด๋์ค๋ ๋ค์๊ณผ ๊ฐ๋ค.
package springbook.user.dao;
public class DeleteAllStatement implements StatementStrategy {
public PreparedStatement makePreparedStatement(Connection c) throws SQLException {
PreparedStatement ps = c.prepareStatement("delete from users");
return ps;
}
}
์ ๋ต ํจํด์ ๋ฐ๋ผ DeleteAllStatement๊ฐ deleteAll() ๋ฉ์๋์ ์ ์ฉํด๋ณด์.
public void deleteAll() throws SQLException {
try {
c = dataSource.getConnection();
statementStrategy strategy = new DeleteAllStatement();
ps = strategy.makePreparedStatement(c);
ps.executeUpdate();
} catch (SQLException e) {
}
}
์ ์ฝ๋์ฒ๋ผ ์ปจํ ์คํธ ์์์ ์ด๋ฏธ ๊ตฌ์ฒด์ ์ธ ์ ๋ต ํด๋์ค์ธ DeleteAllStatement๋ฅผ ์ฌ์ฉํ๋๋ก ๊ณ ์ ๋์ด ์๋ค๋ฉด ๋ญ๊ฐ ์ด์ํ๋ค. ์ปจํ ์คํธ๊ฐ StatementStrategy ์ธํฐํ์ด์ค๋ฟ ์๋๋ผ ํน์ ๊ตฌํ ํด๋์ค์ธ DeleteAllStatement๋ฅผ ์ง์ ์๊ณ ์๋ค๋ ๊ฑด, ์ ๋ต ํจํด์๋ OCP์๋ ์ ๋ง์ง ์๋๋ค.