Skip to content

Latest commit

ย 

History

History
319 lines (234 loc) ยท 13.1 KB

Spring.md

File metadata and controls

319 lines (234 loc) ยท 13.1 KB

Spring

๐Ÿƒ ์Šคํ”„๋ง์˜ ์ •์˜ ๐Ÿƒ

์—”ํ„ฐํ”„๋ผ์ด์ฆˆ์šฉ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ํŽธํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” 
์˜คํ”ˆ์†Œ์Šค ๊ฒฝ๋Ÿ‰๊ธ‰ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ



1๏ธโƒฃ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ์šฉ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ํŽธํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” 1๏ธโƒฃ

๊ธฐ์—…์—์„œ ์šด์˜ํ•˜๋Š” ์›น ์„œ๋น„์Šค์—๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด๋ผ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 
๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด๋ž€, ๊ธฐ์—…์ด ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ์œผ๋กœ, ์‚ฌ์šฉ์ž์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ 
์‹ค์งˆ์ ์ธ ์ฝ”๋“œ๋“ค์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.


์Šคํ”„๋ง์€ ์ด์ „ ๊ธฐ์ˆ ์— ๋น„ํ•ด ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋œ ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ, ๊ฐœ๋ฐœ ์ดˆ๊ธฐ์— ๊ธฐ๋ณธ์ ์ธ ์„ค์ •๊ณผ ์ ์šฉ์‹œํ‚ฌ ๊ธฐ์ˆ ๋“ค๋งŒ ์ž˜ ์„ ํƒ์„ ํ•ด์ค€๋‹ค๋ฉด, 
๊ธฐ์ˆ ๋ณด๋‹ค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กœ์ง ์ž์ฒด์— ๋” ์ง‘์ค‘ํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



2๏ธโƒฃ ์˜คํ”ˆ์†Œ์Šค 2๏ธโƒฃ

์Šคํ”„๋ง์€ ์˜คํ”ˆ์†Œ์Šค ํ”„๋ ˆ์ž„์›Œํฌ์ด์ง€๋งŒ, ์•ˆ์ •์ ์ธ ๊ฐœ๋ฐœ๊ณผ ๊ฐœ์„ ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค. 
ํ˜„์žฌ ์Šคํ”„๋ง์€ ์˜คํ”ˆ์†Œ์Šค๋กœ ๋ฐฐํฌ๋˜์–ด ๋ˆ„๊ตฌ๋‚˜ ์ด์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์Šคํ”„๋ง์†Œ์Šค(SpringSource)๋ผ๋Š” 
IT๊ธฐ์—…์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์œผ๋ฉฐ,
์Šคํ”„๋ง์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๊ฐœ์„ ํ•˜๋Š” ์ผ์—๋Š” ์Šคํ”„๋ง์†Œ์Šค์˜
ํ•œ์ •์ ์ธ ์ธ์›๋งŒ ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



3๏ธโƒฃ ๊ฒฝ๋Ÿ‰๊ธ‰ 3๏ธโƒฃ

์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๊ธฐ์กด ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•  ๋•Œ์— ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ์ž‘์„ฑํ•ด์•ผ๋งŒ ํ–ˆ๋˜ 
๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณต์žกํ•œ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.



4๏ธโƒฃ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ 4๏ธโƒฃ

ํ”„๋ ˆ์ž„์›Œํฌ๋ž€, ์–ด๋– ํ•œ ๋ชฉ์ ์„ ์‰ฝ๊ฒŒ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋‹น ๋ชฉ์ ๊ณผ ๊ด€๋ จ๋œ ์ฝ”๋“œ์˜ ๋ผˆ๋Œ€๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ํŠน์ • ์—…๋ฌด ๋ถ„์•ผ ๋ฐ ํŠน์ • ๊ธฐ์ˆ ์ด ์•„๋‹ˆ๋ผ,
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๋ชจ๋“  ๊ณผ์ •์— ์ง‘์ค‘ํ•ฉ๋‹ˆ๋‹ค. 
๋‹ค์‹œ ๋งํ•ด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ์— ์žˆ์–ด 
ํ•„์š”ํ•œ ๋ชจ๋“  ์—…๋ฌด ๋ถ„์•ผ ๋ฐ ๋ชจ๋“  ๊ธฐ์ˆ ๊ณผ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋“ค์˜ ๋ผˆ๋Œ€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.




์Šคํ”„๋ง์˜ ํŠน์ง•


โ— POJO ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€ํ–ฅ โ—

POJO -> Plain Old Java Object
์ˆœ์ˆ˜ Java๋งŒ์„ ํ†ตํ•ด์„œ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์ˆœ์ˆ˜ Java ๋งŒ์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ Java ๋ฐ Java์˜ ์ŠคํŽ™์— ์ •์˜๋œ ๊ธฐ์ˆ ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. 
์ฆ‰, ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ์™ธ๋ถ€์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ์™ธ๋ถ€์˜ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, 
๊ทธ ๊ฐ์ฒด๋Š” POJO๋ผ๊ณ  ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. POJO๋Š” ๋ง ๊ทธ๋Œ€๋กœ, ๋‹ค๋ฅธ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ˆœ์ˆ˜ํ•œ 
Java๋งŒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“  ๊ฐ์ฒด์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

โ“ POJO๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ  โ“

-> ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ importํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.
์ด ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ธฐ์ˆ ์ด Deprecated๋˜๊ฑฐ๋‚˜, ๊ฐœ์„ ๋œ ์‹  ๊ธฐ์ˆ ์ด ๋“ฑ์žฅํ•˜์—ฌ
๊ธฐ์กด ๊ธฐ์ˆ ๊ณผ ๊ด€๋ จ๋œ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ๊ณ ์ณ์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋“ค์˜
์ฝ”๋“œ๋ฅผ ์ „๋ถ€ ๋ฐ”๊ฟ”์ฃผ์–ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ์™ธ๋ถ€ ๋ชจ๋“ˆ์— ์ง์ ‘์ ์œผ๋กœ ์˜์กดํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.



๋ฐ˜๋ฉด, POJO๋Š” ์ˆœ์ˆ˜ Java๋งŒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“  ๊ฐ์ฒด์ด๋ฏ€๋กœ ํŠน์ • ๊ธฐ์ˆ ์ด๋‚˜ ํ™˜๊ฒฝ์— ์ข…์†๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ, ์™ธ๋ถ€ ๊ธฐ์ˆ ์ด๋‚˜ ๊ทœ์•ฝ์˜ ๋ณ€ํ™”์— ์–ฝ๋งค์ด์ง€ ์•Š์•„, ๋ณด๋‹ค ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€ํ™”์™€ ํ™•์žฅ์— ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ POJO๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋ฉด ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„๋ฅผ ์ œํ•œ์—†์ด ์ ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,
์ฝ”๋“œ๊ฐ€ ๋‹จ์ˆœํ•ด์ ธ ํ…Œ์ŠคํŠธ์™€ ๋””๋ฒ„๊น… ๋˜ํ•œ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ์—
POJO๋ฅผ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์„ POJO ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.



IoC/DI, AOP, PSA -> POJO ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•ด ์Šคํ”„๋ง์ด ์ง€์›ํ•˜๋Š” ๊ธฐ์ˆ 



1๏ธโƒฃ IoC / DI (Inversion of Control / Dependency Injection, ์ œ์–ด์˜ ์—ญ์ „ / ์˜์กด์„ฑ ์ฃผ์ž…)

Java๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์ด๋ฏ€๋กœ, ๊ฐ์ฒด๋“ค ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ ์ ˆํžˆ ๋งบ์–ด์ฃผ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ์š”์†Œ์ž…๋‹ˆ๋‹ค.
์•„๋ž˜์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ A ์ธ์Šคํ„ด์Šค๊ฐ€ B ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๋‹ค๋ฉด
A๋Š” B์™€ ์˜์กด ๊ด€๊ณ„๋ฅผ ๋งบ์€ ๊ฒƒ์ด ๋˜๋ฉฐ, ์ด ๋‘˜์˜ ๊ด€๊ณ„๋ฅผ โ€œA๊ฐ€ B์— ์˜์กดํ•˜๋Š” ๊ด€๊ณ„โ€๋ผ๊ณ  ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class A {
    public void methodOfA(){

        B b = new B();
        b.example();
    }
}

class B {
    public void example(){
        ...
    }
}

์œ„์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ์— ํ•„์—ฐ์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๋งŒ์•ฝ, A๊ฐ€ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ B๊ฐ€ ์•„๋‹ˆ๋ผ, ์ƒˆ๋กญ๊ฒŒ C๋ฅผ ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?
๋‹น์—ฐํ•˜๊ฒŒ๋„, A์˜ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•  ์ˆ˜๋ฐ–์— ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

class A {
    public void methodOfA(){

        //B b = new B();
        //b.example(); 

        C c = new C();
        c.example();
    }
}

class B {
    public void example(){
        ...
    }
}

// ํด๋ž˜์Šค C ์ •์˜
class C {
    public void example(){
        ...
    }
}

์œ„ ์˜ˆ์ œ์—์„œ๋Š” ๊ธฐ์กด์— B๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ๊ฐ์ฒด๊ฐ€ A ํ•˜๋‚˜๋ฟ์ด๋ฏ€๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋˜์ง€๋งŒ,
๋งŒ์•ฝ ๊ธฐ์กด์— B๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ๊ฐ์ฒด๊ฐ€ A ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์ˆ˜์‹ญ ๋˜๋Š” ์ˆ˜๋ฐฑ๊ฐœ๊ฐ€ ์žˆ๋‹ค๋ฉด
๋ชจ๋“  ๊ฐ์ฒด์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๋ฉด ์œ„์ฒ˜๋Ÿผ ๋ณ€ํ™”๊ฐ€ ๋ฐœ์ƒํ•œ ์ƒํ™ฉ์— ์ตœ์†Œํ•œ์˜ ์ˆ˜์ •๋งŒ์œผ๋กœ
๋ณ€ํ™”๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜์—ฌ ์ข€ ๋” ๋ณ€ํ™”์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋Š”
์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

// (1) A๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค I์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋กœ ์ •์˜ํ•œ ๋‹ค์Œ, (์ถ”์ƒํ™”)
interface I{
    void example();
}

class A {
    
    // (3) ๊ทธ ๋‹ค์Œ, ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์˜ ํ•„๋“œ๋ฅผ ์„ ์–ธํ•˜๊ณ ,
    private I i;

    // (4) ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ›์•„์™€ i๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์ค๋‹ˆ๋‹ค. (๋‹คํ˜•์„ฑ)
    public A(I i){
        this.i = i;
    }
    
    public void methodOfA(){
        // (5) ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์˜จ ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
        i.example();
    }
}

// (2) A๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋“ค์ด I๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
class B implements I {
    public void example(){
        ...
    }
}

class C  implements I{
    public void example(){
        ...
    }
}

์œ„์—์„œ A๋Š” ์ž์‹ ์ด ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์Šค์Šค๋กœ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์˜ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ฆ‰, A๋Š” ์ž์‹ ์ด ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋ฉฐ, ๊ทธ์ € i์— ํ• ๋‹น๋œ ์ธ์Šคํ„ด์Šค์— example()์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€
์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ๋งŒ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋ˆ„๊ตฐ๊ฐ€ A๊ฐ€ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  ์ƒ์„ฑํ•ด์„œ A๊ฐ€ ์ธ์Šคํ„ด์Šคํ™”๋  ๋•Œ ์ธ์ž๋กœ
์ „๋‹ฌํ•ด์ฃผ์–ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์•ผ A๋Š” B์˜ ๊ฒƒ์ด๋“ , C์˜ ๊ฒƒ์ด๋“ 
example() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

--> ๊ทธ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ฐ”๋กœ ์Šคํ”„๋ง์ž…๋‹ˆ๋‹ค.

์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กœ์ง ์™ธ๋ถ€์—์„œ A๊ฐ€ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ๋ณ„๋„๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ์ž๊ฐ€ ์„ค์ • ํด๋ž˜์Šค ํŒŒ์ผ์— A๊ฐ€ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ C๋กœ ์„ค์ •ํ•ด๋‘๋ฉด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด
๋™์ž‘ํ•˜๋ฉด์„œ ์Šคํ”„๋ง์ด ์„ค์ • ํด๋ž˜์Šค ํŒŒ์ผ์„ ํ•ด์„ํ•˜๊ณ , ๊ฐœ๋ฐœ์ž๊ฐ€ ์„ค์ •ํ•ด๋‘”๋Œ€๋กœ C ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ
A์˜ ์ƒ์„ฑ์ž์˜ ์ธ์ž๋กœ C๋ฅผ ์ „๋‹ฌํ•ด์ค๋‹ˆ๋‹ค.

--> ์ด์ฒ˜๋Ÿผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ์Šคํ”„๋ง์ด A๊ฐ€ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์˜์กด ๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ฃผ๋Š” ๊ฒƒ์„
IoC(Inversion of Control, ์ œ์–ด์˜ ์—ญ์ „)๋ผ๊ณ  ํ•˜๋ฉฐ,
๊ทธ ๊ณผ์ •์—์„œ C๋ฅผ A์˜ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ฃผ์ž…ํ•ด์ฃผ๋Š” ๊ฒƒ์„ DI(Dependency Injection, ์˜์กด์„ฑ ์ฃผ์ž…)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.



2๏ธโƒฃ AOP (Aspect Oriented Programming, ๊ด€์‹ฌ ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ์— ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์€ ํฌ๊ฒŒ
๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ๊ณผ ํ•ต์‹ฌ ๊ด€์‹ฌ ์‚ฌํ•ญ์œผ๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ €, ํ•ต์‹ฌ ๊ด€์‹ฌ ์‚ฌํ•ญ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จ๋œ ๊ด€์‹ฌ ์‚ฌํ•ญ์œผ๋กœ ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ์€ ๋ชจ๋“  ํ•ต์‹ฌ ๊ด€์‹ฌ ์‚ฌํ•ญ์— ๊ณตํ†ต์ ์œผ๋กœ ์ ์šฉ๋˜๋Š” ๊ด€์‹ฌ ์‚ฌํ•ญ๋“ค์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

ex) ์ปคํ”ผ์ฃผ๋ฌธ

ํ•ต์‹ฌ ๊ด€๋ฆฌ์‚ฌํ•ญ -> ๋ฉ”๋‰ด ๋“ฑ๋กํ•˜๊ธฐ, ์ฃผ๋ฌธํ•˜๊ธฐ, ์ฃผ๋ฌธ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋“ฑ

๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ -> ๋ฉ”๋‰ด ๋“ฑ๋กํ•˜๊ธฐ, ์ฃผ๋ฌธํ•˜๊ธฐ, ์ฃผ๋ฌธ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋“ฑ ๋ชจ๋“  ํ•ต์‹ฌ ๊ด€์‹ฌ ์‚ฌํ•ญ์—๋Š” 
๋กœ๊น…์ด๋‚˜ ๋ณด์•ˆ ๋“ฑ๊ณผ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ

AOP ์ฃผ์š” ๊ฐœ๋…

  • Aspect : ์œ„์—์„œ ์„ค๋ช…ํ•œ ํฉ์–ด์ง„ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ชจ๋“ˆํ™” ํ•œ ๊ฒƒ. ์ฃผ๋กœ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ๋ชจ๋“ˆํ™”ํ•จ.
  • Target : Aspect๋ฅผ ์ ์šฉํ•˜๋Š” ๊ณณ (ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ .. )
  • Advice : ์‹ค์งˆ์ ์œผ๋กœ ์–ด๋–ค ์ผ์„ ํ•ด์•ผํ•  ์ง€์— ๋Œ€ํ•œ ๊ฒƒ, ์‹ค์งˆ์ ์ธ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ๋‹ด์€ ๊ตฌํ˜„์ฒด
  • JointPoint : Advice๊ฐ€ ์ ์šฉ๋  ์œ„์น˜, ๋ผ์–ด๋“ค ์ˆ˜ ์žˆ๋Š” ์ง€์ . ๋ฉ”์„œ๋“œ ์ง„์ž… ์ง€์ , ์ƒ์„ฑ์ž ํ˜ธ์ถœ ์‹œ์ , ํ•„๋“œ์—์„œ ๊ฐ’์„ ๊บผ๋‚ด์˜ฌ ๋•Œ ๋“ฑ ๋‹ค์–‘ํ•œ ์‹œ์ ์— ์ ์šฉ๊ฐ€๋Šฅ
  • PointCut : JointPoint์˜ ์ƒ์„ธํ•œ ์ŠคํŽ™์„ ์ •์˜ํ•œ ๊ฒƒ. 'A๋ž€ ๋ฉ”์„œ๋“œ์˜ ์ง„์ž… ์‹œ์ ์— ํ˜ธ์ถœํ•  ๊ฒƒ'๊ณผ ๊ฐ™์ด ๋”์šฑ ๊ตฌ์ฒด์ ์œผ๋กœ Advice๊ฐ€ ์‹คํ–‰๋  ์ง€์ ์„ ์ •ํ•  ์ˆ˜ ์žˆ์Œ



์ด ๋•Œ, ํ•ต์‹ฌ ๊ด€์‹ฌ ์‚ฌํ•ญ๊ณผ ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ์ด ์ฝ”๋“œ์— ์•„๋ž˜์™€ ๊ฐ™์ด ํ•จ๊ป˜ ๋ชจ์—ฌ ์žˆ์œผ๋ฉด ํ•„์—ฐ์ ์œผ๋กœ ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ๊ณผ ๊ด€๋ จ๋œ ์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋  ์ˆ˜๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋˜์–ด์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ, ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋กœ์ง์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ชจ๋“  ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ฐพ์•„์„œ ์ผ์ผ์ด ์ˆ˜์ •ํ•ด์ฃผ์–ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.

class Order{
    
    ...

    public void ์ฃผ๋ฌธํ•˜๊ธฐ() {

        // ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ
        ๋กœ๊น… ๊ด€๋ จ ์ฝ”๋“œ
        ๋ณด์•ˆ ๊ด€๋ จ ์ฝ”๋“œ

        // ํ•ต์‹ฌ ๊ด€์‹ฌ ์‚ฌํ•ญ
        ์ฃผ๋ฌธ ๊ด€๋ จ ๋กœ์ง
    }

    public void ์ฃผ๋ฌธ_๋ณ€๊ฒฝํ•˜๊ธฐ() {

        // ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ
        ๋กœ๊น… ๊ด€๋ จ ์ฝ”๋“œ
        ๋ณด์•ˆ ๊ด€๋ จ ์ฝ”๋“œ

        // ํ•ต์‹ฌ ๊ด€์‹ฌ ์‚ฌํ•ญ
        ์ฃผ๋ฌธ ๋ณ€๊ฒฝ ๊ด€๋ จ ๋กœ์ง
    }

    public void ๋ฉ”๋‰ด_๋“ฑ๋กํ•˜๊ธฐ() {

        // ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ
        ๋กœ๊น… ๊ด€๋ จ ์ฝ”๋“œ
        ๋ณด์•ˆ ๊ด€๋ จ ์ฝ”๋“œ

        // ํ•ต์‹ฌ ๊ด€์‹ฌ ์‚ฌํ•ญ
        ๋ฉ”๋‰ด ๋“ฑ๋ก ๊ด€๋ จ ๋กœ์ง
    }
}

์œ„์˜ ์˜ˆ์ œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ฝ”๋“œ์˜ ์ค‘๋ณต์ด๋ผ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”
๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ๊ณผ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ๋“ค์„ ๋ณ„๋„์˜ ๊ฐ์ฒด๋กœ ๋ถ„๋ฆฌํ•ด๋‚ธ ๋‹ค์Œ,
๋ถ„๋ฆฌํ•ด๋‚ธ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ์„ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด์ฒ˜๋Ÿผ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์— ๊ฑธ์ณ ์ ์šฉ๋˜๋Š” ๊ณตํ†ต ๊ธฐ๋Šฅ์„
๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์œผ๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌํ•ด๋‚ด๋Š” ๊ฒƒ์„ AOP(Aspect Oriented Programming, ๊ด€์‹ฌ ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.



3๏ธโƒฃ PSA (Portable Service Abstraction, ์ผ๊ด€๋œ ์„œ๋น„์Šค ์ถ”์ƒํ™”)


MySQL์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์„ ์™„๋ฃŒํ–ˆ๋Š”๋ฐ, Maria DB๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ฐ”๊ฟ”์•ผ ํ•˜๋Š” ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค. 
์ด ๋•Œ, ๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งˆ๋‹ค ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅด๋‹ค๋ฉด
์•„๋งˆ ๊ธฐ์กด์— ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์ „๋ถ€ ์ง€์šฐ๊ณ  ์ƒˆ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜,
๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„์— ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์ฐพ์•„์„œ 
์ผ์ผ์ด ์ˆ˜์ •ํ•ด์ฃผ์–ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜, ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๋ฉด ๋™์ผํ•œ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์„ ์œ ์ง€ํ•œ ์ฑ„๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
์ด๋Š” ์Šคํ”„๋ง์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋น„์Šค๋ฅผ ์ถ”์ƒํ™”ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 
์ฆ‰, ์Šคํ”„๋ง์€ Java๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ทœ์ •ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์œผ๋ฉฐ,
์ด๋ฅผ JDBC(Java DataBase Connectivity)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“  ํšŒ์‚ฌ๋“ค์€ ์ž์‹ ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๋Š” ๋“œ๋ผ์ด๋ฒ„๋ฅผ Java ์ฝ”๋“œ์˜ 
ํ˜•ํƒœ๋กœ ๋ฐฐํฌํ•˜๋Š”๋ฐ, ์ด ๋“œ๋ผ์ด๋ฒ„์— ํ•ด๋‹นํ•˜๋Š” Java ์ฝ”๋“œ์˜ ํด๋ž˜์Šค๊ฐ€ JDBC๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. 
๋”ฐ๋ผ์„œ, JDBC๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋‘๋ฉด, 
์ดํ›„์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ฐ”๊พธ์–ด๋„ ๊ธฐ์กด์— ์ž‘์„ฑํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ ๋กœ์ง์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

--> ์ด๋Ÿฌํ•œ JDBC์ฒ˜๋Ÿผ ํŠน์ • ๊ธฐ์ˆ ๊ณผ ๊ด€๋ จ๋œ ์„œ๋น„์Šค๋ฅผ ์ถ”์ƒํ™”ํ•˜์—ฌ ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•œ ๊ฒƒ์„ PSA(Portable Service Abstraction, ์ผ๊ด€๋œ ์„œ๋น„์Šค ์ถ”์ƒํ™”)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.




ref - [https://www.codestates.com/blog/content/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8]