[KB IT's Your Life] ๐Ÿ’ป ๐Ÿ” Spring์˜ DAO ํŒจํ„ด๊ณผ Mapper ์˜ ๋“ฑ์žฅ

JUNยท2024๋…„ 8์›” 18์ผ
1

KB IT's your life

๋ชฉ๋ก ๋ณด๊ธฐ
5/16

์„œ๋ก 

KB ITโ€™s Your Life ๊ต์œก๊ณผ์ •์€ ์˜ค์ „์—” ์ฃผ ๊ฐ•์‚ฌ๋‹˜์˜ ๊ฐ•์˜, ์˜คํ›„์—๋Š” ์‹ค์Šต ๊ฐ•์‚ฌ๋‹˜์˜ ์ง€๋„ ํ•˜์— ์ง„ํ–‰๋œ๋‹ค. ์˜ค๋žœ ์‹œ๊ฐ„ ๊ฐœ๋ฐœ์ž๋กœ ์ง€๋‚ด์…จ๋˜ ๊ฐ•์‚ฌ๋‹˜์—๊ฒŒ ์ง์ ‘ Spring์˜ ํŒจํ„ด ๋ณ€ํ™”์™€ ๊ทธ ์ด์œ ์— ๋Œ€ํ•ด ๋“ค์œผ๋‹ˆ ์ธ์ƒ ๊นŠ์—ˆ๋‹ค. ์˜ค๋Š˜ TIL์—์„œ๋Š” ํ•ด๋‹น ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

Spring์˜ DAO ํŒจํ„ด๊ณผ Mapper ์˜ ๋“ฑ์žฅ.

1. Spring์—์„œ DAO ํŒจํ„ด์˜ ์‚ฌ์šฉ

Spring ํ”„๋ ˆ์ž„์›Œํฌ ์ดˆ๊ธฐ์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ํ†ต์‹ ์„ ์œ„ํ•ด DAO(Data Access Object) ํŒจํ„ด์„ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ์—ˆ๋‹ค. DAO ํŒจํ„ด์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์บก์Šํ™”ํ•˜์—ฌ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. ์ด ๋ฐฉ์‹์€ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๋กœ์ง์„ ํŠน์ • ํด๋ž˜์Šค์— ์ง‘์ค‘์‹œ์ผœ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ์˜ ์˜์กด์„ฑ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋˜์—ˆ๋‹ค.

  • ํŠน์ง•:

    • DAO ํŒจํ„ด์€ JDBC์™€ ๊ฐ™์€ ์ €์ˆ˜์ค€ API๋ฅผ ์‚ฌ์šฉํ•ด ์ง์ ‘ SQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ–ˆ๋‹ค.

    • ์ฝ”๋“œ์—์„œ ๋งŽ์€ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ(์˜ˆ: Connection, PreparedStatement, ResultSet ์ฒ˜๋ฆฌ ๋“ฑ)๊ฐ€ ํ•„์š”ํ–ˆ๋‹ค.

      ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ(boilerplate code)๋ž€?

      ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ(boilerplate code)๋ž€ ๋ฐ˜๋ณต์ ์ด๊ณ  ํ‘œ์ค€ํ™”๋œ ์ฝ”๋“œ๋กœ, ์‹ค์ œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ๋Š” ์ง์ ‘์ ์ธ ๊ด€๋ จ์ด ์—†์ง€๋งŒ ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ ํ•„์ˆ˜์ ์œผ๋กœ ํฌํ•จ๋˜์–ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์„ ๋งํ•œ๋‹ค.

    • SQL ์ฟผ๋ฆฌ๋ฅผ Java ์ฝ”๋“œ ๋‚ด๋ถ€์— ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์œผ๋ฉฐ, ์ด๋กœ ์ธํ•ด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์› ๋‹ค.

  • ์ฝ”๋“œ ์˜ˆ์‹œ:

    ๋งŒ์•ฝ ๋‹น์‹ ์ด JDBC๋ฅผ ์‚ฌ์šฉํ•ด์„œ BoardDAO ๋ผ๋Š” ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด๋ณธ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.

    1. ์ผ๋‹จ JDBC ๊ด€๋ จ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๊ณ  USERS ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  SQL ์ฟผ๋ฆฌ๋“ค์„ ์ž‘์„ฑํ•œ๋‹ค.

    2. ์ด์ œ CRUD๋ฅผ ๊ตฌํ˜„ํ•˜์ž.

      ์ข‹์€ ์ฝ”๋“œ๋Š” ์•„๋‹ˆ๊ณ  ์บก์Šํ™”ํ•  ๋‚ด์šฉ๋„ ๋ณด์ด๋งŒ ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ๊ฑด ๊ทธ๊ฒƒ์ด ์•„๋‹ˆ๋‹ˆ ๋„˜์–ด๊ฐ€์ž.

      stmt๋กœ ์ด๋ฃจ์–ด์ง„ ์ƒํƒœ ๊ด€๋ฆฌ์ž๊ฐ€ ๋ณด์ด๋Š”๊ฐ€?

      ๋งŒ์•ฝ ๋‹น์‹ ์ด DAO๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํ•ด๋‹น ๊ฒŒ์‹œํŒ ๋‚ด์šฉ์„ ๋ชจ๋‘ ์กฐํšŒํ•œ๋‹ค๊ฑฐ๋‚˜ ๊ฒ€์ƒ‰๊ฐ™์€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ• ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ์ปค๋„ฅ์…˜๊ณผ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ•œ๋ฒˆ์”ฉ ํ•ด์ค˜์•ผํ•˜๋Š” ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋“ค์ด ๋ฐœ์ƒํ•œ๋‹ค.

์œ„ ์ฝ”๋“œ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, DAO ํŒจํ„ด์€ ์ง์ ‘ SQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

์ด๋กœ ์ธํ•ด ๋งŽ์€ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ–ˆ์œผ๋ฉฐ, SQL ์ฟผ๋ฆฌ๊ฐ€ Java ์ฝ”๋“œ ๋‚ด๋ถ€์— ํฌํ•จ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋–จ์–ด์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

2. MyBatis์™€ Mapper์˜ ๋“ฑ์žฅ

DAO ํŒจํ„ด์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด MyBatis(๊ตฌ iBatis)์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋“ฑ์žฅํ•˜๋ฉด์„œ Mapper ๊ฐœ๋…์ด ๋„์ž…๋˜์—ˆ๋‹ค.

Mapper๋Š” XML ํŒŒ์ผ ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ SQL ์ฟผ๋ฆฌ๋ฅผ ์ •์˜ํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด Java ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ ˆ์ฝ”๋“œ ๊ฐ„์˜ ๋งคํ•‘์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

  • ํŠน์ง•:
    • SQL์„ XML์ด๋‚˜ ์–ด๋…ธํ…Œ์ด์…˜์— ์ •์˜ํ•จ์œผ๋กœ์จ SQL ์ฝ”๋“œ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ๋ถ„๋ฆฌ์„ฑ์„ ๊ฐ•ํ™”ํ–ˆ๋‹ค.
    • DAO์—์„œ ๋ฐœ์ƒํ•˜๋˜ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
    • ๊ฒฐ๊ณผ ๋งคํ•‘, ๋™์  SQL, ์บ์‹ฑ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜์—ฌ ์ƒ์‚ฐ์„ฑ์ด ๋†’์•„์กŒ๋‹ค.
    • MyBatis์™€ ๊ฐ™์€ Mapper ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋ณต์žกํ•œ SQL ์ฟผ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ฃผ๊ณ , ๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํ•‘(ORM) ํ”„๋ ˆ์ž„์›Œํฌ์ธ Hibernate์™€ ๋‹ฌ๋ฆฌ SQL ์ œ์–ด๊ถŒ์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.
  • ์ฝ”๋“œ ์˜ˆ์‹œ: ๊ฐ mybatis ํ”„๋กœ์ ํŠธ์˜ ์‹ค์Šต ํŒŒ์ผ์„ ๋ชจ๋‘ ๋ณด์ด๊ณ  ์‹ถ์œผ๋‚˜ ๋ฐฐ๋ณด๋‹ค ๋ฐฐ๊ผฝ์ด ๋” ํดํƒœ๋‹ˆ DAO ๊ฐ€ ์‚ฌ๋ผ์ง„ ์ž๋ฆฌ์— ๋„์ž…๋œ ์ฝ”๋“œ๋“ค๋งŒ ๋ณด์—ฌ์ฃผ๊ฒ ๋‹ค.
    <!-- 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์˜ ํฐ ๊ฐ•์ ์ด๋ผ๊ณ  ๋Š๊ปด์ง„๋‹ค.

profile
์ˆœ๊ฐ„์€ ๊ธฐ๋กํ•˜๊ณ  ๋ฐ˜๋ณต์€ ๋‹จ์ˆœํ™”ํ•˜์ž ๐Ÿš€

0๊ฐœ์˜ ๋Œ“๊ธ€