๐Ÿ€ Knowledge/๊ฐ์ฒด์ง€ํ–ฅ์„ค๊ณ„

[๊ฐ์ฒด์ง€ํ–ฅ์„ค๊ณ„] jdbcTemplate์€ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์กŒ๋Š”๊ฐ€?

TIlearn 2024. 2. 16. 00:38

Spring์—์„œ DB์— ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ _jdbcTemplate_์„ ์‚ฌ์šฉํ•˜๊ณค ํ–ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ฟผ๋ฆฌ ํŽธํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋ผ๊ณ  ๋งŒ๋“ค์—ˆ๊ตฌ๋‚˜ ์ •๋„๋กœ ์ƒ๊ฐํ–ˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๊ณต๋ถ€๋ฅผ ํ•˜๋‹ค๋ณด๋‹ˆ ์ด ์ด๋ฆ„์—๋Š” ์ •๋ง ํฌ๋‚˜ํฐ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ  ๊ทธ ๊ตฌ์กฐ์— ๋˜ ํ•œ๋ฒˆ ๊ฐํƒ„ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 

 

์ด์ œ๋ถ€ํ„ฐ, _jdbcTemplate_๋ผ๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ DB์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” API๊ฐ€ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ๊ทธ์ „์— ์•Œ์•„์•ผ ํ•˜๋Š” ๊ฐœ๋…์ธ ์‘์ง‘๋„์™€ ๊ฒฐํ•ฉ๋„์— ๋Œ€ํ•ด ๋จผ์ € ์‚ดํŽด๋ณด์ž.

 

 

 

๋†’์€ ์‘์ง‘๋„(high cohesion)

 

๋†’์€ ์‘์ง‘๋„๋ž€ ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ, ํด๋ž˜์Šค๊ฐ€ ํ•˜๋‚˜์˜ ์ฑ…์ž„, ๊ด€์‹ฌ์‚ฌ์— ์ง‘์ค‘๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ ์™ธ์˜ ๊ด€๋ จ ์—†๋Š” ์ฑ…์ž„์€ ์–ฝํ˜€์žˆ์ง€ ์•Š๋‹ค. ์ด๋Š” ํด๋ž˜์Šค ๋ ˆ๋ฒจ ๋ฟ๋งŒ์ด ์•„๋‹ˆ๋ผ ํŒจํ‚ค์ง€๋‚˜ ์ปดํฌ๋„ŒํŠธ ๋“ฑ์˜ ์˜์—ญ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ ์šฉ๋œ๋‹ค.

 

 

๋˜ํ•œ ์‘์ง‘๋„๊ฐ€ ๋†’๋‹ค๋ฉด ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚  ๋•Œ ํ•ด๋‹น ๋ชจ๋“ˆ์—์„œ๋งŒ์˜ ๋ณ€ํ™”๊ฐ€ ์ œ์ผ ํฌ๋‹ค. ๋งŒ์•ฝ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋„ ๊ฐ™์ด ๋ณ€ํ•œ๋‹ค๋ฉด ์ด๋Š” ์‘์ง‘๋„๊ฐ€ ๋‚ฎ๋‹ค๋Š” ๊ฒƒ์ด ๋œ๋‹ค.

 

 

 

 

 

๋‚ฎ์€ ๊ฒฐํ•ฉ๋„(low Coupling)

 

๋‚ฎ์€ ๊ฒฐํ•ฉ๋„๋ž€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๊ณผ์˜ ์˜์กด์„ฑ ์ •๋„์ด๋ฉฐ, ์ด๋Š” ๋†’์€ ์‘์ง‘๋„๋ณด๋‹ค ๋” ๋ฏผ๊ฐํ•œ ์›์น™์ด๋‹ค. ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ๋‹ค๋Š” ๊ฒƒ์€ ์ฑ…์ž„์‚ฌ๊ฐ€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๊ฐ„์˜ ๋А์Šจํ•œ ์—ฐ๊ฒฐ ํ˜•ํƒœ๋ฅผ ์œ ์ง€ํ•œ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

 

 

์ฆ‰, ๊ด€๊ณ„๋ฅผ ์œ ์ง€ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ์ตœ์†Œํ•œ์˜ ์ •๋ณด๋งŒ์„ ์ฃผ๊ณ  ๋‚˜๋จธ์ง€ ์ •๋ณด๋Š” ์ฃผ๋ฉด ์•ˆ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„๋Š” ํ•˜๋‚˜์˜ ์˜ค๋ธŒ์ ํŠธ์—์„œ ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚  ๋•Œ ๊ด€๊ณ„๋ฅผ ๋งบ๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์š”๊ตฌ๊ฐ€ ์ „ํŒŒ๋˜์ง€ ์•Š๋Š” ์ƒํƒœ์ด๋‹ค.

 

 

 

 

 

 

 

 

์ „๋žต ํŒจํ„ด

 

์ „๋žต ํŒจํ„ด์€ ๋””์ž์ธ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜๋กœ ๋†’์€ ์‘์ง‘๋„์™€ ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„๋ฅผ ํ˜•์„ฑํ•˜๋Š”๋ฐ ๋„์›€์„ ์ฃผ๋Š” ํŒจํ„ด์ด๋‹ค. ๋ฌผ๋ก  ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด๋„ ์‘์ง‘๋„๋ฅผ ๋†’์ด๊ณ  ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„๋ฅผ ํ˜•์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ถ”์ƒ ํด๋ž˜์Šค์—์„œ ๋ณ€ํ™”๋ฅผ ์›ํ•˜๋Š” ๋ถ€๋ถ„์„ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“ค๊ณ , ์ผ์ผ์ด ์ƒ์†์„ ํ†ตํ•ด ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ด์„œ ๊ต‰์žฅํžˆ ๋ฒˆ๊ฑฐ๋กญ๋‹ค.

 

 

 

๋”ฐ๋ผ์„œ ๋”์šฑ ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ์„ฑ ๋†’๋„๋ก ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด ๋ฐ”๋กœ ์ „๋žต ํŒจํ„ด์ด๋‹ค. ์ „๋žต ํŒจํ„ด์„ ํ•œ ๋งˆ๋””๋กœ ์„ค๋ช…ํ•˜์ž๋ฉด "ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ „๋žต ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์„ ํƒํ•˜์—ฌ ์ปจํ…์ŠคํŠธ๊ฐ€ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ"์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ์ปจํ…์ŠคํŠธ์™€ ์ „๋žต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•œ๋‹ค.

 

  • ์ „๋žต(strategy) : ํ•„์š”์— ๋”ฐ๋ผ ๋ณ€ํ•˜๋Š” ๋ถ€๋ถ„
  • ์ปจํ…์ŠคํŠธ(context) : ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„

 

 

์ฆ‰, ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋‘˜๋กœ ๊ตฌ๋ถ„ํ•˜๊ณ  ํด๋ž˜์Šค ์ˆ˜์ค€์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์˜์กดํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

ํด๋ผ์ด์–ธํŠธ

public class Client{
    public void methodOfClient(){
    
        Context context = new Context();

        Strategy_Interface strategy = new Strategy_Implement();   

        context.contextWithStrategy(strategy);
    }
}

 

 

ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ปจํ…์ŠคํŠธ๋ฅผ ํ†ตํ•ด์„œ ์ „๋žต์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

 

์ปจํ…์ŠคํŠธ

public class Context {
    public void contextWithStrategy(Strategy_Interface st){
    
    }
}

 

 

์ปจํ…์ŠคํŠธ์—์„œ๋Š” ์ผ์ •ํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ํ–‰๋™ํ•˜๋Š”๋ฐ, ์ด๋•Œ ์ฃผ์ž… ๋ฐ›์€ ์ „๋žต์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ปจํ…์ŠคํŠธ๋Š” ์ „๋žต ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด์˜ ํ–‰์œ„๋ฅผ ๋™์ ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

 

 

์ „๋žต

public interface Strategy_Interface {
    public void action();
}

public class Strategy_Implement {
    @Override
    public void action(){

    }
}

 

 

 

์ „๋žต ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ด๋ฅผ ์ƒ์† ๋ฐ›์€ ๊ตฌ์ฒดํ™”๋œ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด์„œ ํ”„๋กœ๊ทธ๋žจ ์ƒ์˜ ๋กœ์ง์ด ๋ฐ”๋€Œ์–ด๋„ ์œ ์—ฐํ•˜๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ OCP ์›์น™์—๋„ ์œ„๋ฐ˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

<ํ† ๋น„์˜ ์Šคํ”„๋ง> ์„ ์‚ดํŽด๋ณด๋ฉด, JDBC์˜ ๋ณต์žกํ•œ ๋กœ์ง์„ ์ „๋žต ํŒจํ„ด์„ ํ†ตํ•ด์„œ ์ตœ์ ํ™” ๊ณผ์ •์„ ์ฐพ์•„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 

 

 

 

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

 

์ „๋žต ํŒจํ„ด์€ ์ถ”๊ฐ€ํ•ด์•ผํ•  ์ „๋žต์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๋งŽ์•„์ง„๋‹ค๋ฉด ๊ทธ๋งŒํผ ์ „๋žต ํด๋ž˜์Šค๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ์ •๋ณด๊ฐ€ ๋งŽ๋‹ค๋ฉด ์ธ์ž๋กœ ๋„˜๊ฒจ ์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ฝ”๋“œ๊ฐ€ ์ƒ๋‹นํžˆ ์ง€์ €๋ถ„ํ•ด์ง„๋‹ค.

 

 

์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ์•ˆ์œผ๋กœ ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋˜๊ฐ€ ์ต๋ช… ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ _context_์— ์ „๋‹ฌํ•˜๊ณค ํ•˜๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์˜ ํŒจํ„ด์„ ํ…œํ”Œ๋ฆฟ/์ฝœ๋ฐฑ ํŒจํ„ด์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

 

์ •ํ™•ํžˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ , ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•œ๋‹ค. ๋˜ํ•œ ์ „๋žต ํŒจํ„ด์˜ _context_์™€ _stretagy_๋ฅผ ํ…œํ”Œ๋ฆฟ๊ณผ ์ฝœ๋ฐฑ์ด๋ผ๋Š” ํ˜•์‹ ๋ฐ”๊พธ์–ด ์‚ฌ์šฉํ•œ๋‹ค.

 

 

ํ…œํ”Œ๋ฆฟ๊ณผ ์ฝœ๋ฐฑ์˜ ์ •ํ™•ํ•œ ์—ญํ• ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

 

  • ํ…œํ”Œ๋ฆฟ : ๊ณ ์ •๋œ ํ‹€ ์•ˆ์—์„œ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ธ ์ฝœ๋ฐฑ์„ ๋„ฃ์–ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ฝœ๋ฐฑ : ์ต๋ช… ๋‚ด๋ถ€ ํด๋ž˜์Šค๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ _ํŠน์ • ๋กœ์ง_์„ ๋‹ด์€ ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์˜ค๋ธŒ์ ํŠธ์ด๋‹ค.

 

 

 

ํด๋ผ์ด์–ธํŠธ

public class Client{
    public void methodOfClient(){		
    	Template template = new Template();
        
        Callback temp_Callback = new Callback(){
            @Override
            public int calculate(int A, int B){
            	return ...
            }
        };
    	
       	template.template_Method(temp_Callback, ๋‹ค๋ฅธ ์ •๋ณด ... etc);
    }
}

 

 

ํด๋ผ์ด์–ธํŠธ๋Š” _template_์— _callback_์„ ์ฃผ์ž…ํ•œ๋‹ค. ์ด์™€ ๊ฐ™์ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฝœ๋ฐฑ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ , ํ…œํ”Œ๋ฆฟ์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ๋ฉ”์†Œ๋“œ ๋ ˆ๋ฒจ DI์ด๋‹ค. ์ผ๋ฐ˜์ ์ธ DI๋Š” ํ…œํ”Œ๋ฆฟ์— ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ , ์‚ฌ์šฉํ•  ์˜์กด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ˆ˜์ •์ž ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

ํ…œํ”Œ๋ฆฟ

public class Template {
    
    public int template_Method(int Callback callback, T ๋‹ค๋ฅธ ์ •๋ณด){
        int A = &*%;
        int B = !@#$%;
        int result = callback.calculate(A, B);   
    }
}

 

์ด์ œ ํ…œํ”Œ๋ฆฟ์—์„œ ์ฝœ๋ฐฑ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์ผ์ •ํ•œ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

 

 

 

 

์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค

public interface Callback {
    public int calculate(int A, int B);
}

 

 

์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹จ์ผ ๋ฉ”์†Œ๋“œ๋งŒ์„ ๊ฐ€์ง„๋‹ค. ํ…œํ”Œ๋ฆฟ์˜ ์ž‘์—… ํ๋ฆ„ ์ค‘, ํŠน์ • ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋‹ค์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

ํ•ญ์ƒ ์ฝ”๋“œ ํ๋ฆ„์—์„œ ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ๋Š” ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•ด๋ณผ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•˜์—ฌ์•ผ ํ•œ๋‹ค. ๋ฉ”์†Œ๋“œ๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์ด์— ๋‘” ์ฑ„ ์ „๋žต ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด DI๋ฅผ ํ•ด์ค„ ์ˆ˜๋„ ์žˆ๋‹ค. ํ˜น์€ ๋ฐ”๋€Œ๋Š” ๋ถ€๋ถ„์ด ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋‚˜์˜จ๋‹ค๋ฉด ํ…œํ”Œ๋ฆฟ/์ฝœ๋ฐฑ ํŒจํ„ด์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ค‘๋ณต๋œ ์ฝ”๋“œ์— ๋Œ€ํ•ด์„œ ๊ทธ๋ƒฅ ๋ƒ…๋‘์ง€ ๋ง๊ณ  ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์„ ์ง€ ๊ณ ๋ฏผํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

 

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

 

 

 

 

 

 

 

 

 

Spring์˜ jdbcTemplate

 

Spring์˜ _jdbcTemplate_๋„ ํ…œํ”Œ๋ฆฟ/์ฝœ๋ฐฑ ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ผ๋ฐ˜์ ์ธ jdbc๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์—๋Š” ๊ณ ๋ คํ•ด์•ผ ํ•  ์ ์ด ๋„ˆ๋ฌด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๐Ÿค” jdbcTemplate๊ฐ€ ํ•˜๋Š” ์ผ?

1๏ธโƒฃ Connection์„ ์—ด๊ณ  ๋‹ซ๋Š”๋‹ค.

2๏ธโƒฃ Statement๋ฅผ ์ค€๋น„ํ•˜๊ณ  ๋‹ซ๋Š”๋‹ค.

3๏ธโƒฃ Statement๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

4๏ธโƒฃ ResultSet Loop๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

5๏ธโƒฃ Exception์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค.

6๏ธโƒฃ Transaction์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

_jdbcTemplate_๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ์ฟผ๋ฆฌ๋ฅผ ์งœ๋Š” ์ผ ์ด์™ธ์˜ ์ž‘์—…์— ๋Œ€ํ•ด์„œ๋Š” ์ƒ๊ด€ ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ๋˜ํ•œ DB Connection์„ ํ•˜๋Š”๋ฐ ์žˆ์–ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ผ๋„ ์ ์–ด์ง€๋‹ˆ ๊ทธ ์žฅ์ ์ด ๋งค์šฐ ํฌ๋‹ค.

 

 

_jdbcTemplate_๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ DI๋ฅผ ํ†ตํ•ด ์ฃผ์ž…์„ ์‹œ์ผœ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

public class UserDao {
    DataSource dataSource;
    JdbcTemplate jdbcTemplate;

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }
    ...

 

 

 

 

Object with Count

 

_jdbcTemplate_์˜ queryForObject_๋Š” ๋‹จ์ผ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

int rowCount = jdbcTemplate.queryForObject("select count(*) from customers", Integer.class);

 

 

 

 

 

Object with Parameter

 

_queryForObject_์˜ 3 ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

String lastName = jdbcTemplate.queryForObject("select last_name from customers where id = ?", String.class, id);

 

 

 

 

 

Object with RowMapper

 

 

_queryForObject_์˜ ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์— _RowMapper_๋ฅผ ์ „๋‹ฌํ•œ๋‹ค๋ฉด, ๊ฐ์ฒด๋กœ์จ ๊ฐ’์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

 

Customer customer = jdbcTemplate.queryForObject(
        "select id, first_name, last_name from customers where id = ?",
        (resultSet, rowNum) -> {
            Customer customer = new Customer(
                    resultSet.getLong("id"),
                    resultSet.getString("first_name"),
                    resultSet.getString("last_name")
            );
            return customer;
        }, id);

 

 

_query_๋ฌธ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, List๋กœ์จ๋„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

 

List<Customer> customers = jdbcTemplate.query(
        "select id, first_name, last_name from customers",
        (resultSet, rowNum) -> {
            Customer customer = new Customer(
                    resultSet.getLong("id"),
                    resultSet.getString("first_name"),
                    resultSet.getString("last_name")
            );
            return customer;
        });

 

 

 

update

 

INSERT, UPDATE, DELETE๋Š” ๋ชจ๋‘ _update_  ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

jdbcTemplate.update("insert into customers (first_name, last_name) values (?, ?)", customer.getFirstName(), customer.getLastName());

 

jdbcTemplate.update("delete from customers where id = ?", Long.valueOf(id));

 

 

 

 

KeyHolder

 

์ด๊ฑด ์ข€ ๊ท€์ฐฎ๊ธฐ๋Š” ํ•œ๋ฐ, ๊ฐ€์ ธ์˜จ ํ…Œ์ด๋ธ”์˜ PK๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด์„œ _KeyHolder_๋ผ๋Š” ๊ฒƒ์„ ํ†ตํ•ด ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค.

 

KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(connection -> {
    PreparedStatement ps = connection.prepareStatement(
            "insert into customers (first_name, last_name) values (?, ?)", 
            new String[]{"id"});
    ps.setString(1, customer.getFirstName());
    ps.setString(2, customer.getLastName());
    return ps;
}, keyHolder);

Long id = keyHolder.getKey().longValue();

 

 

 

 

 

 

References