Chapter 3 - KOO-YS/toby-spring GitHub Wiki


ํ…œํ”Œ๋ฆฟ


Goals

  • ํ…œํ”Œ๋ฆฟ์ด๋ž€ ๋ณ€๊ฒฝ์ด ๊ฑฐ์˜ ์ผ์–ด๋‚˜์ง€ ์•Š๊ณ  ์ผ์ •ํ•œ ํŒจํ„ด์œผ๋กœ ์œ ์ง€๋˜๋Š” ํŠน์„ฑ์„ ๊ฐ€์ง„ ๋ถ€๋ถ„๊ณผ ์ž์œ ๋กญ๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ํŠน์„ฑ์„ ๊ฐ€์ง„ ๋ถ€๋ถ„์„ ๋ถ„๋ฆฌ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ์™€ ๊ด€๊ณ„๋ฅผ ๋งบ๊ณ , ์‚ฌ์šฉ๋˜๊ณ , ์†Œ๋ฉธํ•˜๊ธฐ๊นŒ์ง€์˜ ๊ณผ์ •

๐ŸŒฑ Branch chapter03 folder ์‚ฌ์šฉ


3.1 ๋‹ค์‹œ ๋ณด๋Š” ์ดˆ๋‚œ๊ฐ DAO



๐ŸŒฑ Branch chapter03/setting์— ์‹ค์Šต์„ ์œ„ํ•œ ๊ธฐ๋ณธ ์„ธํŒ…



public void deleteAll() throws SQLException, ClassNotFoundException {
 
    Connection c = connectionMaker.makeNewConnection();
    PreparedStatement ps = c.prepareStatement("DELETE FROM users");

    ps.executeUpdate();

    // ์‚ฌ์šฉํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ฐ˜ํ™˜ํ•ด์•ผํ•œ๋‹ค
    ps.close();
    c.close();
}

์ƒ๋‹จ ์ฝ”๋“œ์—๋Š” ์˜ˆ์™ธ ์ƒํ™ฉ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ์—†๋‹ค

PreparedStatement๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ค‘์— ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ๋ฉ”์†Œ๋“œ๋ฅผ ๋๋‚ด์ง€ ๋ชปํ•˜๊ณ  ๋น ์ ธ๋‚˜๊ฐ€๊ธฐ ๋•Œ๋ฌธ์—, close() ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์•„ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋ฐ˜ํ™˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌ์†Œ์Šค ๋ฐ˜ํ™˜๊ณผ close()

Connection์ด๋‚˜ PreparedStatement์—๋Š” close() ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋‹ค.

**close()**๋Š” ์ข…๋ฃŒ์˜ ์˜๋ฏธ๋กœ๋„ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฆฌ์†Œ์Šค ๋ฐ˜ํ™˜์˜ ์˜๋ฏธ๊ฐ€ ๋” ์ ํ•ฉํ•˜๋‹ค

Connection์ด๋‚˜ PreparedStatement๋Š” ๋ณดํ†ต ํ’€(pool) ๋ฐฉ์‹์œผ๋กœ ์šด์˜์ด ๋˜๊ณ , ๋ฏธ๋ฆฌ ์ •ํ•ด์ง„ ํ’€ ์•ˆ์— ์ œํ•œ๋œ ์ˆ˜์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋‘๊ณ  ํ•„์š”ํ•  ๋•Œ ํ• ๋‹น, ๋ฐ˜ํ™˜ํ•˜๋ฉด ํ’€๋กœ ๋‹ค์‹œ ๋„ฃ๋Š” ๋ฐฉ์‹์œผ๋กœ ์šด์˜๋œ๋‹ค.

์‚ฌ์šฉํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋น ๋ฅด๊ฒŒ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฆฌ์†Œ์Šค ๊ณ ๊ฐˆ๋กœ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค

try/cath๋กœ ์˜ˆ์™ธ์ฒ˜๋ฆฌํ•˜๊ธฐ
public void deleteAll() throws SQLException, ClassNotFoundException {
    Connection c = null;
    PreparedStatement ps = null;
    try {
        c = connectionMaker.makeNewConnection();
        ps = c.prepareStatement("DELETE FROM users");

        ps.executeUpdate();

    } catch (SQLException e){
        throw e;

    } finally {
        if(ps != null){
            try {
                ps.close();
            } catch (SQLException e){
                throw e;
            }
        }
        if(c != null){
            try {
                c.close();
            } catch (SQLException e){
                throw e;
            }
        }
    }
}

์ฝ”๋“œ์˜ ์ค‘๋ณต์š”์†Œ๊ฐ€ ๋งŽ์œผ๋ฉฐ, ์‹ค์ˆ˜๊ฐ€ ์ผ์–ด๋‚˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ


3.2 ๋ณ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ



๐ŸŒฑ Branch chapter03/refactor3.2์— ์‹ค์Šต ์ ์šฉ



๋งค ์ฝ”๋“œ์— ๋ฐ˜๋ณต๋˜๋Š” ๋ณต์žกํ•œ try/catch/finally ์ฝ”๋“œ๋ฅผ ์“ฐ๊ธฐ์—” ๋ฌด๋ฆฌ๊ฐ€ ์žˆ๋‹ค

-> ๋ณ€ํ•˜์ง€ ์•Š๊ณ  ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ์™€ ์ž๊พธ ํ™•์žฅ๋˜๊ณ  ๋ณ€ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•ด์ฃผ๋Š” ์ž‘์—…์ด ํ•„์š”


deleteAll() ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„ ์˜ˆ์‹œ
public void deleteAll() throws SQLException, ClassNotFoundException {
        Connection c = null;
        PreparedStatement ps = null;
        try {
            // ์ฝ”๋“œ ๋ณ€ํ•˜๋Š” ๋ถ€๋ถ„
            // ๋ณ€ํ•˜๋Š” ์ฝ”๋“œ ์ „, ํ›„๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค
            
        } catch (SQLException e){
            throw e;

        } finally {
            if(ps != null){
                try {
                    ps.close();
                } catch (SQLException e){
                    throw e;
                }
            }
            if(c != null){
                try {
                    c.close();
                } catch (SQLException e){
                    throw e;
                }
            }
        }
    }
deleteAll() ๋ณ€ํ•˜๋Š” ๋ถ€๋ถ„ ์˜ˆ์‹œ
c = connectionMaker.makeNewConnection();
ps = c.prepareStatement("DELETE FROM users");

ps.executeUpdate();

๋ถ„๋ฆฌ ์ž‘์—…

  1. ๋ฉ”์†Œ๋“œ ์ถ”์ถœ
    • ์ž์ฃผ ๋ฐ”๋€Œ๋Š” ๋ถ€๋ถ„์„ ๋ฉ”์†Œ๋“œ๋กœ ๋…๋ฆฝ์‹œ์ผœ๋ดค์ง€๋งŒ, ์ด ๋ฉ”์†Œ๋“œ๊ฐ€ ์žฌ์‚ฌ์šฉ๋˜์ง€์•Š๊ณ  DAO ๋กœ์ง๋งˆ๋‹ค ๋งค๋ฒˆ ์ƒˆ๋กญ๊ฒŒ ๋ฉ”์†Œ๋“œ๋ฅผ ์ž‘์„ฑํ•ด ํ™•์žฅํ•ด์•ผํ•˜๋Š” ๋‹จ์ 
  2. ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด ์ ์šฉ
    • ์ƒ์†์„ ํ†ตํ•ด ๊ธฐ๋Šฅ์„ ํ™•์žฅ. ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์„ ์Šˆํผ ํด๋ž˜์Šค์— ๋‘๊ณ , ๋ณ€ํ•˜๋Š” ๋ถ€๋ถ„์€ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋กœ ์ •์˜
    • DAO ๋กœ์ง๋งˆ๋‹ค ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ด ํ™•์žฅ๊ตฌ์กฐ๊ฐ€ ํด๋ž˜์Šค ์„ค๊ณ„ ์‹œ์ ์— ๊ณ ์ •๋˜์–ด๋ฒ„๋ฆฐ๋‹ค -> ์„ค๊ณ„ ์‹œ์ ์ด ์•„๋‹Œ ์ปดํŒŒ์ผ ์‹œ์ ์—์„œ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค
  3. ์ „๋žต ํŒจํ„ด ์ ์šฉ

์ „๋žต ํŒจํ„ด

  • ๊ฐœ๋ฐฉ ํ์‡„ ์›์น™์„ ์ž˜ ์ง€ํ‚ค๋Š” ๊ตฌ์กฐ
  • ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด๋ณด๋‹ค ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚จ
  • ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์•„์˜ˆ ๋‘˜๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ํด๋ž˜์Šค ๋ ˆ๋ฒจ์—์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์˜์กดํ•˜๋„๋ก ๋งŒ๋“ฆ

๋งฅ๋ฝ context : ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„

์ „๋žต strategy : ๋ณ€ํ•˜๋Š” ๋ถ€๋ถ„. ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ ‘๊ทผํ•˜๋ฉฐ ํ•„์š”์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๋ถ€๋ถ„

DI ์ ์šฉ์„ ์œ„ํ•œ ํด๋ผ์ด์–ธํŠธ/์ปจํ…์ŠคํŠธ ๋ถ„๋ฆฌ

ํด๋ผ์ด์–ธํŠธ๊ฐ€,

๋งฅ๋ฝ Context์— ์–ด๋–ค ์ „๋žต Strategy๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€,

๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค

public void deleteAll() throws SQLException, ClassNotFoundException {
    StatementStrategy st = new DeleteAllStatement();        // ์ „๋žต ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ
    jdbcContextWithStatementStrategy(st);                   // ์ปจํ…์ŠคํŠธ๋Š” ์ „๋žต ์˜ค๋ธŒ์ ํŠธ ์ œ๊ณต๋ฐ›์Œ
    }

StatementStrategy ํƒ€์ž…์˜ ์ „๋žต ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ œ๊ณต๋ฐ›๊ณ  JDBC ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ตฌ์กฐ๋กœ ๋งŒ๋“ค์–ด์ง„ ์ปจํ…์ŠคํŠธ ์•ˆ์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค


3.3 JDBC ์ „๋žต ํŒจํ„ด์˜ ์ตœ์ ํ™”



๐ŸŒฑ Branch chapter03/refactor3.3์— ์‹ค์Šต ์ ์šฉ



ํ˜„์žฌ ์ฝ”๋“œ์˜ ๋ฌธ์ œ์ 
  • DAO ๋ฉ”์†Œ๋“œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด StatementStrategy ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค

  • ์ „๋‹ฌํ•  ๋ถ€๊ฐ€์ •๋ณด๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ์ด๋ฅผ ์œ„ํ•ด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š” ์ƒ์„ฑ์ž์™€ ์ด๋ฅผ ์ €์žฅํ•ด๋‘˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€๋กœ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค

    public void add(User user) throws ClassNotFoundException, SQLException {
        StatementStrategy st = new AddStatement(user);           // ์ „๋žต ์˜ค๋ธŒ์ ํŠธ์— ์ถ”๊ฐ€์ ์ธ User ์ •๋ณด ์ „๋‹ฌ !
        jdbcContextWithStatementStrategy(st);
    }
ํ•ด๊ฒฐ๋ฐฉ์•ˆ 1

ํด๋ž˜์Šค ํŒŒ์ผ์ด ๋งŽ์•„์ง€๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋ฐฉ๋ฒ• -> UserDao ํด๋ž˜์Šค ์•ˆ์— ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ์ •์˜

ํด๋ž˜์Šค๊ฐ€ ๋‚ด๋ถ€ ํด๋ž˜์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž์‹ ์ด ์„ ์–ธ๋œ ๊ณณ์˜ ์ •๋ณด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค

โ€‹ -> ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค

โ€‹ -> ๋‹จ, ์™ธ๋ถ€์˜ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ final๋กœ ์„ ์–ธํ•ด์ค˜์•ผํ•œ๋‹ค.

์ค‘์ฒฉ ํด๋ž˜์Šค
  • ๋‹ค๋ฅธ ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์ •์˜๋˜๋Š” ํด๋ž˜์Šค
  • ์ข…๋ฅ˜
    • ์Šคํƒœํ‹ฑ ํด๋ž˜์Šค : ๋…๋ฆฝ์ ์œผ๋กœ ์˜ค๋ธŒ์ ํŠธ๋กœ ๋งŒ๋“ค์–ด ์งˆ ์ˆ˜ ์žˆ์Œ
    • ๋‚ด๋ถ€ ํด๋ž˜์Šค : ์ž์‹ ์ด ์ •์˜๋œ ํด๋ž˜์Šค์˜ ์˜ค๋ธŒ์ ํŠธ ์•ˆ์—์„œ๋งŒ ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ๋‚ด๋ถ€ ํด๋ž˜์Šค
  • ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ์ข…๋ฅ˜ (๋ฒ”์œ„ ๊ธฐ์ค€)
    • ๋ฉค๋ฒ„ ๋‚ด๋ถ€ ํฌ๋ž˜์Šค : ๋ฉค๋ฒ„ ํ•„๋“œ์ฒ˜๋Ÿผ ์˜ค๋ธŒ์ ํŠธ ๋ ˆ๋ฒจ์—์„œ ์ •์˜
    • ๋กœ์ปฌ ํด๋ž˜์Šค : ๋ฉ”์†Œ๋“œ ๋ ˆ๋ฒจ์—์„œ ์ •์˜
    • ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค : ์ด๋ฆ„ ๊ฐ–์ง€ ์•Š๋Š” ํด๋ž˜์Šค. ์„ ์–ธ๋œ ์œ„์น˜์— ๋”ฐ๋ผ ๋ฒ”์œ„๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค

์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค
  • ์ด๋ฆ„์„ ๊ฐ–์ง€ ์•Š๋Š” ํด๋ž˜์Šค
  • ํด๋ž˜์Šค ์„ ์–ธ๊ณผ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ์ด ๊ฒฐํ•ฉ๋œ ์ƒํƒœ
  • ์ƒ์†ํ•  ํด๋ž˜์Šค๋‚˜ ๊ตฌํ˜„ํ•  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑ์ž ๋Œ€์‹  ์‚ฌ์šฉํ•ด ๋ฐ”๋กœ ์„ ์–ธ
  • ํด๋ž˜์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๊ณ  ๊ตฌํ˜„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์œ ์šฉ
ํ•ด๊ฒฐ๋ฐฉ์•ˆ 2

์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ์ „ํ™˜

public void deleteAll() throws SQLException, ClassNotFoundException {
//        StatementStrategy st = new DeleteAllStatement();        // ์ „๋žต ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ
    // ์ต๋ช… ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•œ ๋ฐ”๋กœ ๊ตฌํ˜„
    StatementStrategy st = new StatementStrategy() {
        @Override
        public PreparedStatement makePreparedStatement(Connection c) throws SQLException 		{
            PreparedStatement ps = c.prepareStatement("DELETE FROM users");
            return ps;
        }
    };
    jdbcContextWithStatementStrategy(st);               // ์ปจํ…์ŠคํŠธ๋Š” ์ „๋žต ์˜ค๋ธŒ์ ํŠธ ์ œ๊ณต๋ฐ›์Œ
}

3.4 ์ปจํ…์ŠคํŠธ์™€ DI



๐ŸŒฑ Branch chapter03/refactor3.4์— ์‹ค์Šต ์ ์šฉ



์ด์ „์˜ ์ฝ”๋“œ์˜ ๋ฌธ์ œ์ 

JDBC์˜ ์ผ๋ฐ˜์ ์ธ ํ๋ฆ„์„ ๋‹ด๊ณ  ์žˆ๋Š” jdbcContextWithStatementStrategy() ๋ฉ”์†Œ๋“œ๋Š” UserDao ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ DAO๋“ค๋„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„๋ฆฌ๊ฐ€ ํ•„์š”


JdbcContext ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ด UserDao์™€ ์˜์กด๊ด€๊ณ„ ์ƒ์„ฑ

BUT, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ์ฝ”๋“œ์—์„œ ๋ฐ”๋กœ JdbcContext ํด๋ž˜์Šค ์‚ฌ์šฉ

-> ํ™•์žฅ ๊ตฌ์กฐ๊ฐ€ ๋Ÿฐํƒ€์ž„ ์‹œ์ ์ด ์•„๋‹Œ ํด๋ž˜์Šค ์„ค๊ณ„ ์‹œ์ !

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„ ์˜จ์ „ํ•œ DI๋ผ๊ณ  ๋ณผ ์ˆ˜ ์—†๋‹ค

๊ทธ๋Ÿฌ๋‚˜ ์Šคํ”„๋ง์˜ DI๋Š” ๋„“๊ฒŒ ๋ณด์ž๋ฉด ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ๊ด€๊ณ„ ์„ค์ •์— ๋Œ€ํ•œ ์ œ์–ด ๊ถŒํ•œ์„ ์˜ค๋ธŒ์ ํŠธ์—์„œ ์ œ๊ฑฐํ•˜๊ณ  ์™ธ๋ถ€๋กœ ์œ„์ž„ํ–ˆ๋‹ค๋Š” IoC ๊ฐœ๋…์„ ํฌ๊ด„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— JdbcContext๋Š” DI์˜ ๊ธฐ๋ณธ์„ ๋”ฐ๋ฅด๊ณ  ์žˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค


์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, JdbcContext๋ฅผ UserDao์™€ DI ๊ตฌ์กฐ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ์ด์œ !
  1. JdbcContext๊ฐ€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ์‹ฑ๊ธ€ํ†ค ๋นˆ์ด๊ธฐ ๋•Œ๋ฌธ
  2. JdbcContext๊ฐ€ DI๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ๋นˆ์— ์˜์กดํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ

3.5 ํ…œํ”Œ๋ฆฟ๊ณผ ์ฝœ๋ฐฑ



๐ŸŒฑ Branch chapter03/refactor3.5์— ์‹ค์Šต ์ ์šฉ



ํ…œํ”Œ๋ฆฟ/์ฝœ๋ฐฑ ํŒจํ„ด

๋ฐ”๋€Œ์ง€ ์•Š๋Š” ์ผ์ •ํ•œ ํŒจํ„ด์„ ๊ฐ–๋Š” ์ž‘์—… ํ๋ฆ„์ด ์กด์žฌํ•˜๊ณ  ๊ทธ ์ค‘ ์ผ๋ถ€๋ถ„๋งŒ ์ž์ฃผ ๋ฐ”๊ฟ”์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์ ํ•ฉํ•œ ๊ตฌ์กฐ. ์ „๋žต ํŒจํ„ด์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ์— ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•œ ๋ฐฉ์‹

ํ…œํ”Œ๋ฆฟ

  • ์ „๋žต ํŒจํ„ด์˜ ์ปจํ…์ŠคํŠธ
  • ๊ณ ์ •๋œ ํ‹€ ์•ˆ์— ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์„ ๋„ฃ์–ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

์ฝœ๋ฐฑ

  • ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ์˜ค๋ธŒ์ ํŠธ
  • ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ์˜ ๋ฉ”์†Œ๋“œ์— ์ „๋‹ฌ๋˜๋Š” ์˜ค๋ธŒ์ ํŠธ
  • ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹Œ ํŠน์ • ๋กœ์ง์„ ๋‹ด์€ ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์œ„ํ•จ
ํ…œํ”Œ๋ฆฟ/์ฝœ๋ฐฑ์˜ ์ž‘์—… ํ๋ฆ„
  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ…œํ”Œ๋ฆฟ ์•ˆ์—์„œ ์‹คํ–‰๋  ๋กœ์ง์„ ๋‹ด์€ ์ฝœ๋ฐฑ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ
  2. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ…œํ”Œ๋ฆฟ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ฝœ๋ฐฑ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ
  3. ํ…œํ”Œ๋ฆฟ์€ ์ฝœ๋ฐฑ ์˜ค๋ธŒ์ ํŠธ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœ
  4. ์ฝœ๋ฐฑ์ด ํด๋ผ์ด์–ธํŠธ ๋ฉ”์†Œ๋“œ ๋‚ด ์ •๋ณด์™€ ํ…œํ”Œ๋ฆฟ์ด ์ œ๊ณตํ•œ ์ฐธ์กฐ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ์ž‘์—… ์ˆ˜ํ–‰ ํ›„ ๋ฐ˜ํ™˜
  5. ํ…œํ”Œ๋ฆฟ์€ ์ฝœ๋ฐฑ์ด ๋ฐ˜ํ™˜ํ•œ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•ด ์ž‘์—…์„ ๋งˆ์ € ์ˆ˜ํ–‰
  6. ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋‹ค์‹œ ๋ฐ˜ํ™˜
ํ…œํ”Œ๋ฆฟ/์ฝœ๋ฐฑ์˜ ํŠน์ง•
  • ์ผ๋ฐ˜์ ์ธ DI์˜ ํ…œํ”Œ๋ฆฟ์— ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋‘๊ณ  ์‚ฌ์šฉํ•  ์˜์กด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ˆ˜์ •์ž ๋ฉ”์†Œ๋“œ๋กœ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋งค๋ฒˆ ๋ฉ”์†Œ๋“œ ๋‹จ์œ„๋กœ ์‚ฌ์šฉํ•  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ „๋‹ฌ๋ฐ›์Œ
  • ์ฝœ๋ฐฑ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ์„œ ์ž์‹ ์„ ์ƒ์„ฑํ•œ ํด๋ผ์ด์–ธํŠธ ๋ฉ”์†Œ๋“œ ๋‚ด์˜ ์ •๋ณด๋ฅผ ์ง์ ‘ ์ฐธ์กฐ
ํ…œํ”Œ๋ฆฟ/์ฝœ๋ฐฑ ๋ฐฉ์‹์€ ์ „๋žต ํŒจํ„ด๊ณผ DI์˜ ์žฅ์ ์„ ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค ์‚ฌ์šฉ ์ „๋žต๊ณผ ๊ฒฐํ•ฉํ•œ ๋…ํŠนํ•œ ํ™œ์šฉ๋ฒ•

3.6 ์Šคํ”„๋ง์˜ JdbcTemplate



๐ŸŒฑ Branch chapter03/refactor3.6์— ์‹ค์Šต ์ ์šฉ



์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•˜๋Š” ํ…œํ”Œ๋ฆฟ/์ฝœ๋ฐฑ ๊ธฐ์ˆ 

  • ์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•˜๋Š” JDBC ์ฝ”๋“œ์šฉ ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ : JdbcTemplate ์‹ค์Šต
Update()

PreparedStatementCreator ํƒ€์ž…์˜ ์ฝœ๋ฐฑ์„ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜๋Š” JdbcTemplate ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ

public void deleteAll(){
    // Spring์—์„œ ์ง€์›ํ•ด์ฃผ๋Š” Jdbc Template ์‚ฌ์šฉ
    this.jdbcTemplate.update("DELETE FROM users");
}

// ์ฟผ๋ฆฌ์— ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•
public void add(User user){
    // Spring์—์„œ ์ง€์›ํ•ด์ฃผ๋Š” Jdbc Template ์‚ฌ์šฉ
    this.jdbcTemplate.update("INSERT INTO users(id, name, password) VALUES(?,?,?)",
                             							user.getId(), user.getName(), user.getPassword());
}
QueryForInt()

PreparedStatementCreator ํƒ€์ž…๊ณผ ResultSetExtractor ํƒ€์ž… 2๊ฐœ์˜ ์ฝœ๋ฐฑ์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š” ๋ฉ”์†Œ๋“œ

But, ๋”์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ queryForObject(String sql, Class requiredType) ๋ฐฉ์‹์œผ๋กœ ๋Œ€์ฒด

// 1 -> ์ผ๋ฐ˜ query ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ
public int getCount(){
    return this.jdbcTemplate.query(new PreparedStatementCreator() {
        @Override
        public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
            return con.prepareStatement("SELECT COUNT(*) FROM users");
        }
    }, new ResultSetExtractor<Integer>() {
        @Override
        public Integer extractData(ResultSet rs) throws SQLException, DataAccessException {
            rs.next();
            return rs.getInt(1);
        }
    });
}

// 2
public int getCount(){
    return this.jdbcTemplate.queryForObject("SELECT COUNT(*) FROM users", Integer.TYPE);
}
QueryForObject()

ResultSet์˜ ๋กœ์šฐ ํ•˜๋‚˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋Š” RowMapper๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

public User get(String id){
    return this.jdbcTemplate.queryForObject("SELECT * FROM users WHERE id = ?",
                                            new Object[]{id},
                                            new RowMapper<User>() {
                                                @Override
                                                public User mapRow(ResultSet rs, int rowNum) throws SQLException {
                                                    User user = new User();
                                                    user.setId(rs.getString("id"));
                                                    user.setName(rs.getString("name"));
                                                    user.setPassword(rs.getString("password"));
                                                    return user;
                                                }
                                            }
                                           );
    }
query()

ResultSet์˜ ๋กœ์šฐ ์ „์ฒด๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋Š” RowMapper๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

public List<User> getAll() {
    return this.jdbcTemplate.query("SELECT * FROM users ORDER BY id",
                                   new RowMapper<User>() {
                                       @Override
                                       public User mapRow(ResultSet rs, int rowNum) throws SQLException {
                                           User user = new User();
                                           user.setId(rs.getString("id"));
                                           user.setName(rs.getString("name"));
                                           user.setPassword(rs.getString("password"));
                                           return user;
                                       }
                                   });
}
โš ๏ธ **GitHub.com Fallback** โš ๏ธ