์ด๋ฒ์๋ ์ํํธ ํ์ฑ๊ณผ ํ๋ ํ์ฑ์ ์ฐจ์ด์ ์์๋ณด๊ธฐ.
์ํํธ ํ์ฑ vs ํ๋ ํ์ฑ
์ฌ์ฉ์๊ฐ SQL๋ฌธ์ ์ ๋ฌํ๋ฉด DBMS๋ SQL์ ํ์ฑํ๊ณ ํด๋น SQL์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์บ์์ ์กด์ฌํ๋์ง๋ถํฐ ํ์ธ
์บ์์์ ์ฐพ์ผ๋ฉด ๊ณง๋ฐ๋ก ์คํ ๋จ๊ณ๋ก ๋์ด๊ฐ์ง๋ง, ์ฐพ์ง ๋ชปํ๋ฉด ์ต์ ํ ๋จ๊ณ๋ฅผ ๊ฑฐ์นจ
โจ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์บ์๋ ?
SQL ํ์ฑ, ์ต์ ํ, ๋ก์ฐ ์์ค ์์ฑ ๊ณผ์ ์ ๊ฑฐ์ณ ์์ฑํ ๋ด๋ถ ํ๋ก์์ ๋ฅผ ๋ฐ๋ณต ์ฌ์ฌ์ฉํ ์ ์๋๋ก ์บ์ฑํด ๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ผ๋ก, SGA ๊ตฌ์ฑ ์์์
โจ SGA (System Global Area) ๋ ?
์๋ฒ ํ๋ก์ธ์ค์ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค๊ฐ ๊ณตํต์ผ๋ก ์ก์ธ์คํ๋ ๋ฐ์ดํฐ์ ์ ์ด ๊ตฌ์กฐ๋ฅผ ์บ์ฑํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ
๐น ์ํํธ ํ์ฑ
- SQL์ ์บ์์์ ์ฐพ์ ๊ณง๋ฐ๋ก ์คํ๋จ๊ณ๋ก ๋์ด๊ฐ๋ ๊ฒ
๐น ํ๋ ํ์ฑ
- ์บ์์์ ์ฐพ๋ ๊ฑธ ์คํจํด ์ต์ ํ ๋ฐ ๋ก์ฐ ์์ค ์์ฑ ๋จ๊ณ๊น์ง ๋ชจ๋ ๊ฑฐ์น๋ ๊ฒ
๋ฐ์ธ๋ ๋ณ์์ ์ค์์ฑ
๐น ์ด๋ฆ์๋ SQL ๋ฌธ์
SQL์ ์ฌ์ฉ์ ์ ์ ํจ์/ํ๋ก์์ , ํธ๋ฆฌ๊ฑฐ, ํจํค์ง ๋ฑ์ฒ๋ผ ์ด๋ฆ์ด ๋ฐ๋ก ์กด์ฌํ์ง ์์ผ๋ฏ๋ก ๋์ ๋๋ฆฌ์ ์ ์ฅํ์ง๋ ์๋๋ค.
SQL ์์ฒด๊ฐ ์ด๋ฆ์ด๊ธฐ ๋๋ฌธ์ ํ ์คํธ ์ค ์์ ๋ถ๋ถ์ด๋ผ๋ ์์ ๋๋ฉด ๊ทธ ์๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ์๋ก ํ์ํ๋ ๊ตฌ์กฐ๋ค.
SQL ID๋ SQL ์ ์ฒด ํ ์คํธ๋ฅผ ๊ฐ๋ตํ ํํํ๊ธฐ ์ํด ์ค๋ผํด์ด ๋ด๋ถ ํจ์๋ฅผ ์ด์ฉํ์ ์์ฑํ ๊ฐ์ด๋ฏ๋ก SQL ์ ์ฒด ํ ์คํธ์ 1:1 ๋์ ๊ด๊ณ๋ฅผ ๊ฐ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก SQL ํ
์คํธ๊ฐ ๋ณํ๋ฉด SQL ID๋ ๋ณํ๋ค.
DBMS์์ ์ํ๋๋ SQL์ด ๋ชจ๋ ์์ฑ๋ ๊ฒ์ด ์๋๋ฉฐ, ๊ฐ๋ฐ ๊ณผ์ ์๋ ์์๋ก ๋ณ๊ฒฝ๋๋ค.
์ผํ์ฑ๋ ๋ง๊ณ ๋ฌดํจํ๋๋ ๊ฒ๋ ๋ง์ผ๋ฏ๋ก SQL์ ๋ชจ๋ ์ ์ฅํ๋ ค๋ฉด ๋ง์ ๊ณต๊ฐ์ด ํ์ํ๊ณ , ๊ทธ๋งํผ SQL์ ์ฐพ๋ ์๋๋ ๋๋ ค์ง๋ค.
์ด๋ฌํ ์ด์ ๋ก DBMS๊ฐ SQL์ ์๊ตฌ ์ ์ฅํ์ง ์๋๋ค.
๐น ๊ณต์ ๊ฐ๋ฅ SQL
public void login(String login_id) throws Exception {
String SQLStmt = "SELECT * FROM CUSTOMER WHERE LOGIN_ID = '" + login_id + "'";
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(SQLStmt);
if(rs.next()) {
// do anything
}
rs.close();
st.close();
}
500๋ง ๊ณ ๊ฐ์ ๋ณด์ ํ ์ผํ๋ชฐ์์ ๋ก๊ทธ์ธ ๋ชจ๋ ๋ด๋น์๊ฐ ์์ ๊ฐ์ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ค ํ๊ณ , ์ผํ๋ชฐ์์ 12์ ์ ๊ฐ๋ถํฐ 30๋ถ๊ฐ ํ ์ธ ์ด๋ฒคํธ๋ฅผ ํ๊ธฐ๋ก ํ๋ค.
500๋ง ๋ช ์ค 20%์ ํด๋นํ๋ 100๋ง ๊ณ ๊ฐ์ด ์ด๋ฒคํธ ๋น์ผ 12์๋ฅผ ์ ํํด ๋์์ ์์คํ ์ ์ ์ํ๋ค๋ฉด
๊ฐ ๊ณ ๊ฐ์ ๋ํ ๋์๋ค๋ฐ์ ์ธ SQL ํ๋ํ์ฑ ๋๋ฌธ์ I/O๊ฐ ๊ฑฐ์ ๋ฐ์ํ์ง ์์์๋ CPU ์ฌ์ฉ๋ฅ ์ ๊ธ๊ฒฉํ ์ฌ๋ผ๊ฐ ๊ฒ์ด๋ค.
์๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์บ์๋ฅผ ์กฐํํ๋ฉด SQLStmt์ ํด๋นํ๋ ์ฟผ๋ฆฌ๋ฌธ์ผ๋ก ๊ฐ๋ ์ฐจ ์์ ๊ฒ์ด๋ค.
๊ณ ๊ฐ์ด ๋ก๊ทธ์ธํ ๋๋ง๋ค DBMS ๋ด๋ถ ํ๋ก์์ ๋ฅผ ํ๋์ฉ ๋ง๋ค์ด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์บ์์ ์ ์ฌํ๋ค.
create procedure LOGIN_GAMJA() {...}
create procedure LOGIN_GOGUMA() {...}
create procedure LOGIN_GAJI() {...}
create procedure LOGIN_CARROT() {...}
create procedure LOGIN_PEA() {...}
...
...
...
์ ํ๋ก์์ ์ ๋ด๋ถ ์ฒ๋ฆฌ ๋ฃจํด์ ๋ชจ๋ ๊ฐ๋ค.
์๋์ ๊ฐ์ด ๋ก๊ทธ์ธID๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ ํ๋ก์์ ํ๋๋ฅผ ๊ณต์ ํ๋ฉด์ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ด ์ ํฉํ ๊ฒ์ด๋ค.
create procedure LOGIN (login_id in varchar2) {...}
๐ ํ๋ผ๋ฏธํฐ Driven ๋ฐฉ์์ผ๋ก SQL์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ด ์ ๊ณต๋๋๋ฐ, ๋ฐ์ธ๋ ๋ณ์๊ฐ ๋ฐ๋ก ๊ทธ๊ฒ์ด๋ค !!
public void login(String login_id) throws Exception {
String SQLStmt = "SELECT * FROM CUSTOMER WHERE LOGIN_ID = ?";
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(SQLStmt);
if(rs.next()) {
// do anything
}
rs.close();
st.close();
}
๋ก๊ทธ์ธ ํ๋ก๊ทธ๋จ์ ์์ ๊ฐ์ด ์์ ํ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์บ์์ ๋ก๊ทธ์ธ๊ณผ ๊ด๋ จํด์ ์๋ SQL ํ๋๋ง ๋ฐ๊ฒฌ๋๋ค.
SELECT * FROM CUSTOMER WHERE LOGIN_ID = :1
์ด SQL์ ๋ํ ํ๋ํ์ฑ์ ์ต์ด ํ ๋ฒ๋ง ์ผ์ด๋๊ณ , ์บ์ฑ๋ SQL์ 100๋ง ๊ณ ๊ฐ์ด ๊ณต์ ํ๋ฉด์ ์ฌ์ฌ์ฉํ๋ค.
:1์ ๋ฐ์ธ๋ ๋ณ์๋ฅผ ์๋ฏธํ๊ณ , ์ค์ ์คํ๋ ๋ :1 ์๋ฆฌ์ ํน์ ๊ฐ์ด ๋ฐ์ธ๋ฉ๋์ด ์คํ๋๋ค.