KB ITโs Your Life ๊ต์ก๊ณผ์ ์ ์ค์ ์ ์ฃผ ๊ฐ์ฌ๋์ ๊ฐ์, ์คํ์๋ ์ค์ต ๊ฐ์ฌ๋์ ์ง๋ ํ์ ์งํ๋๋ค. ์ค๋ ์๊ฐ ๊ฐ๋ฐ์๋ก ์ง๋ด์ จ๋ ๊ฐ์ฌ๋์๊ฒ ์ง์ Spring์ ํจํด ๋ณํ์ ๊ทธ ์ด์ ์ ๋ํด ๋ค์ผ๋ ์ธ์ ๊น์๋ค. ์ค๋ TIL์์๋ ํด๋น ๋ด์ฉ์ ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
Spring ํ๋ ์์ํฌ ์ด๊ธฐ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํต์ ์ ์ํด DAO(Data Access Object) ํจํด์ ๋ง์ด ์ฌ์ฉํ์๋ค. DAO ํจํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํธ์์ฉ์ ์บก์ํํ์ฌ, ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ฐ์ดํฐ ์ ๊ทผ ๋ก์ง์ ๋ถ๋ฆฌํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค. ์ด ๋ฐฉ์์ ๋ฐ์ดํฐ ์ ๊ทผ ๋ก์ง์ ํน์ ํด๋์ค์ ์ง์ค์์ผ, ๋น์ฆ๋์ค ๋ก์ง๊ณผ์ ์์กด์ฑ์ ์ต์ํํ๊ณ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ธฐ ์ํด ๊ณ ์๋์๋ค.
ํน์ง:
DAO ํจํด์ JDBC์ ๊ฐ์ ์ ์์ค API๋ฅผ ์ฌ์ฉํด ์ง์ SQL ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์คํํ๋ค.
์ฝ๋์์ ๋ง์ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋(์: Connection, PreparedStatement, ResultSet ์ฒ๋ฆฌ ๋ฑ)๊ฐ ํ์ํ๋ค.
๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋(boilerplate code)๋?
๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋(boilerplate code)๋ ๋ฐ๋ณต์ ์ด๊ณ ํ์คํ๋ ์ฝ๋๋ก, ์ค์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ๋ ์ง์ ์ ์ธ ๊ด๋ จ์ด ์์ง๋ง ์ฝ๋ ์์ฑ ์ ํ์์ ์ผ๋ก ํฌํจ๋์ด์ผ ํ๋ ๋ถ๋ถ์ ๋งํ๋ค.
SQL ์ฟผ๋ฆฌ๋ฅผ Java ์ฝ๋ ๋ด๋ถ์ ์์ฑํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ผ๋ฉฐ, ์ด๋ก ์ธํด ์ ์ง๋ณด์๊ฐ ์ด๋ ค์ ๋ค.
์ฝ๋ ์์:
๋ง์ฝ ๋น์ ์ด JDBC๋ฅผ ์ฌ์ฉํด์ BoardDAO ๋ผ๋ ๋ฐ์ดํฐ ์ ๊ทผ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด๋ณธ๋ค๊ณ ์๊ฐํด๋ณด์.
์ผ๋จ JDBC ๊ด๋ จ ๋ณ์๋ฅผ ์ด๊ธฐํํด์ฃผ๊ณ USERS ํ ์ด๋ธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์ฌ์ฉํ SQL ์ฟผ๋ฆฌ๋ค์ ์์ฑํ๋ค.
์ด์ CRUD๋ฅผ ๊ตฌํํ์.
์ข์ ์ฝ๋๋ ์๋๊ณ ์บก์ํํ ๋ด์ฉ๋ ๋ณด์ด๋ง ์ฌ๊ธฐ์ ์ค์ํ๊ฑด ๊ทธ๊ฒ์ด ์๋๋ ๋์ด๊ฐ์.
stmt๋ก ์ด๋ฃจ์ด์ง ์ํ ๊ด๋ฆฌ์๊ฐ ๋ณด์ด๋๊ฐ?
๋ง์ฝ ๋น์ ์ด DAO๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ํด๋น ๊ฒ์ํ ๋ด์ฉ์ ๋ชจ๋ ์กฐํํ๋ค๊ฑฐ๋ ๊ฒ์๊ฐ์ ๊ธฐ๋ฅ ๊ตฌํํ ๋๋ง๋ค ํด๋น ์ปค๋ฅ์ ๊ณผ ์ํ๊ด๋ฆฌ๋ฅผ ํ๋ฒ์ฉ ํด์ค์ผํ๋ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋๋ค์ด ๋ฐ์ํ๋ค.
์ ์ฝ๋์์ ์ ์ ์๋ฏ์ด, DAO ํจํด์ ์ง์ SQL ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์คํํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
์ด๋ก ์ธํด ๋ง์ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๊ฐ ํ์ํ์ผ๋ฉฐ, SQL ์ฟผ๋ฆฌ๊ฐ Java ์ฝ๋ ๋ด๋ถ์ ํฌํจ๋๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ๋จ์ด์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
DAO ํจํด์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด MyBatis(๊ตฌ iBatis)์ ๊ฐ์ ํ๋ ์์ํฌ๊ฐ ๋ฑ์ฅํ๋ฉด์ Mapper ๊ฐ๋ ์ด ๋์ ๋์๋ค.
Mapper๋ XML ํ์ผ ๋๋ ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ SQL ์ฟผ๋ฆฌ๋ฅผ ์ ์ํ๊ณ , ์ด๋ฅผ ํตํด Java ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ์ฝ๋ ๊ฐ์ ๋งคํ์ ์ฒ๋ฆฌํ๊ฒ ๋์๋ค.
<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">
<select id="getUserList" resultType="User">
SELECT * FROM member
</select>
<select id="getUserInfo" parameterType="String" resultType="User">
SELECT * FROM member WHERE id = #{id}
</select>
<insert id="insertUser" parameterType="User">
INSERT INTO member (column1, column2, ...)
VALUES (#{field1}, #{field2}, ...)
</insert>
<update id="updateUser" parameterType="User">
UPDATE member SET tel = #{tel} WHERE id = #{id}
</update>
<delete id="deleteUser" parameterType="String">
DELETE FROM member WHERE id = #{id}
</delete>
</mapper>
// User Mapper
public interface UserMapper {
List<User> getUserList();
User getUserInfo(String id);
int insertUser(User user);
int updateUser(User user);
int deleteUser(String id);
}
๋ง์ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๋ค์ด ์ ๊ฑฐ๋๊ณ UserMapper ์ธํฐํ์ด์ค๊ฐ SQL์ ์คํ์ ๋ด๋นํ์ฌ ์คํ๋ง๊ณผ DB ์ฌ์ด์ ๊ฒฝ๊ณ๊ฐ ๋ช
ํํด์ง์ ์ ์ ์๋ค.Mapper๋ฅผ ์ฌ์ฉํ๋ฉด SQL๊ณผ Java ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ ์ง๋ณด์๋ฅผ ์ฝ๊ฒ ํ ์ ์์๊ณ , DAO์์ ๋ฐ์ํ๋ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๋ฅผ ์ค์ผ ์ ์์๋ค.
์ด๋ก ์ธํด ๋ณต์กํ SQL ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์์ผ๋ฉฐ, ์์ฐ์ฑ์ด ํฌ๊ฒ ํฅ์๋์๋ค.
์ฒ์์ ํด๋น ํจํด๊ณผ ๊ธฐ์ ๋ค์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์ตํ๋ ๊ฒ๋ ์ค์ํ์ง๋ง, ์ญ์ ๊ทธ ๊ธฐ์ ์ด ์ ์ฐ์ด๋์ง ์๋ ๊ฒ์ด ์ค์ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฐ ์ด์ ๋ฅผ ํด๋น ์ญ์ฌ์ ํจ๊ปํ ํ์ ์์๊ฒ ์ง์ ๋ฃ๊ณ ๋ฌธ์ ํด๊ฒฐ ์ฌ๋ก๋ฅผ ํตํด ๊น์ด ์๋ ์ดํด๋ฅผ ํ ์ ์์ด ์ข์๋ค.
ํผ์์ ๊ณต๋ถํ์ผ๋ฉด ์๋ง ์๊ฐ์ด ์์ฒญ ๋ค์์ ๊ฒ์ด๋ค. ์ค๋ฌด ๊ฒฝํ์ด ํ๋ถํ ๊ฐ์ฌ์ง์ด KB ITโs Your Life์ ํฐ ๊ฐ์ ์ด๋ผ๊ณ ๋๊ปด์ง๋ค.