Search

Spring Framework ์†Œ๊ฐœ

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ์†Œ๊ฐœ

โ€ข
์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ž€?
โ€ข
์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ํ•ต์‹ฌ ๊ธฐ๋Šฅ
โ—ฆ
์˜์กด์„ฑ ์ฃผ์ž… (DI)
โ—ฆ
์ œ์–ด์˜ ์—ญ์ „ (IoC)
โ—ฆ
๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (AOP)
โ€ข
๋‹ค์–‘ํ•œ ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ ๋ฐ ๋ชจ๋“ˆ
โ—ฆ
Spring Framework
โ–ช
Spring Core
โ–ช
Spring Web
โ–ช
Spring Web MVC
โ–ช
Spring AOP
โ–ช
Spring JDBC
โ–ช
Spring ORM
โ—ฆ
Spring Boot
โ—ฆ
Spring Data
โ—ฆ
Spring Security

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ (Spring framework)

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋Š” Java ๊ธฐ๋ฐ˜์˜ ์˜คํ”ˆ ์†Œ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ์Šคํ”„๋ง์€ ๊ฐ„๋‹จํ•œ ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์Šคํ”„๋ง์€ ๋‹ค์–‘ํ•œ ๋ชจ๋“ˆ๊ณผ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋“ค์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋” ์‰ฝ๊ฒŒ ๊ตฌ์ถ•ํ•˜๊ณ  ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์€ ์ œ์–ด ์—ญ์ „(IoC) ์ปจํ…Œ์ด๋„ˆ์™€ ์˜์กด์„ฑ ์ฃผ์ž…(DI)์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๊ฐ์ฒด ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์œ ์—ฐํ•˜๊ณ  ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง์€ ๋˜ํ•œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•ก์„ธ์Šค, ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ, ๋ณด์•ˆ, ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๋“ฑ์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ๋งŽ์ด ์‚ฌ์šฉ๋˜๋ฉฐ, ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ๊ธฐ์—…์—์„œ ์‹ ๋ขฐํ•˜๊ณ  ์„ ํƒํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ

โ€ข
์˜์กด์„ฑ ์ฃผ์ž… (DI; Dependency Injection)
โ€ข
์ œ์–ด์˜ ์—ญ์ „ (IoC; Inversion of Control Container)
โ€ข
๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (AOP; Aspect Orented Programming)

์˜์กด์„ฑ ์ฃผ์ž… (Dependency Injection)

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

์˜์กด์„ฑ ์ฃผ์ž… ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์•Œ์•„์•ผ ํ•  ๊ฒƒ

โ€ข
์˜์กด ๋ฐ ์˜์กด์„ฑ
โ€ข
์˜์กด์˜ ์ข…๋ฅ˜
โ—ฆ
ํด๋ž˜์Šค ์˜์กด
โ—ฆ
์ธํ„ฐํŽ˜์ด์Šค ์˜์กด
โ€ข
IoC (์ œ์–ด์˜ ์—ญ์ „)
โ€ข
IoC ์ปจํ…Œ์ด๋„ˆ
โ€ข
๋นˆ (Bean)

์˜์กด?

๋‹ค๋ฅธ ๊ฒƒ์— ๋„์›€์„ ๋ฐ›์•„ ์กด์žฌํ•˜๋Š” ๊ฒƒ

์˜์กด์„ฑ

๋‹ค๋ฅธ ๊ฒƒ์— ๋„์›€์„ ๋ฐ›์•„ ์กด์žฌํ•˜๋Š” ์ƒํƒœ(์„ฑ์งˆ)

Java ์—์„œ์˜ ์˜์กด, ์˜์กด์„ฑ

์˜์กด

: ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์—์„œ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ
A ํด๋ž˜์Šค์—์„œ B ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ โ€œA ํด๋ž˜์Šค๊ฐ€ B ํด๋ž˜์Šค์˜ ์˜์กดํ•œ๋‹ค.โ€ ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
A ํด๋ž˜์Šค์—์„œ B ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, A ํด๋ž˜์Šค ๋‚ด์—์„œ B ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  B ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜ ๋ฐ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด ๋Œ€ B ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜ ๋ฐ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด B ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” A ํด๋ž˜์Šค๋„ ์˜ํ–ฅ์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ, B ํด๋ž˜์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด A ํด๋ž˜์Šค๋„ ๋ณ€๊ฒฝ์„ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—, A ํด๋ž˜์Šค๋Š” B ํด๋ž˜์Šค์— ๋„์›€์„ ๋ฐ›์•„ ์กด์žฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ โ€œA ํด๋ž˜์Šค๋Š” B ํด๋ž˜์Šค์— ์˜์กดํ•œ๋‹ค.โ€ ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜์กด์„ฑ

: ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ์ƒํƒœ
A ํด๋ž˜์Šค์—์„œ B ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, A ํด๋ž˜์Šค๊ฐ€ B ํด๋ž˜์Šค์— ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, A ํด๋ž˜์Šค๋Š” B ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์˜์กด์„ฑ์„ ๊ฐ€์ง„๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ์ƒํƒœ๋ฅผ ์˜์กด์„ฑ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
์•„๋ž˜ ์ฝ”๋“œ๋Š” A ํด๋ž˜์Šค๊ฐ€ B ํด๋ž˜์Šค์˜ ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ์˜ˆ์‹œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
// ํด๋ž˜์Šค B ์ •์˜ public class B { public void method() { System.out.println("ํด๋ž˜์Šค B์˜ ๋ฉ”์„œ๋“œ ์ˆ˜ํ–‰"); } } // ํด๋ž˜์Šค A ์ •์˜ public class A { private B b; // ํด๋ž˜์Šค B์— ๋Œ€ํ•œ ์˜์กด์„ฑ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. // ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค B์˜ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž… ๋ฐ›์Šต๋‹ˆ๋‹ค. public A(B b) { this.b = b; } public void execute() { System.out.println("ํด๋ž˜์Šค A์˜ ๊ธฐ๋Šฅ ์ˆ˜ํ–‰"); // ํด๋ž˜์Šค A๋Š” ํด๋ž˜์Šค B์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. b.method(); } public static void main(String[] args) { // ํด๋ž˜์Šค B์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. B b = new B(); // ํด๋ž˜์Šค A์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ ํด๋ž˜์Šค B์˜ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค. A a = new A(b); // ํด๋ž˜์Šค A์˜ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. a.execute(); } }
Java
๋ณต์‚ฌ

์˜์กด์˜ ์ข…๋ฅ˜

โ€ข
ํด๋ž˜์Šค ์˜์กด
โ€ข
์ธํ„ฐํŽ˜์ด์Šค ์˜์กด

ํด๋ž˜์Šค ์˜์กด

: ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ

์ธํ„ฐํŽ˜์ด์Šค ์˜์กด

: ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ

ํด๋ž˜์Šค ์˜์กด vs ์ธํ„ฐํŽ˜์ด์Šค ์˜์กด

์˜์กด
ํด๋ž˜์Šค ์˜์กด
์ธํ„ฐํŽ˜์ด์Šค ์˜์กด
๊ฒฐํ•ฉ๋„
๋†’์Œ
๋‚ฎ์Œ
์‘์ง‘๋„
๋‚ฎ์Œ
๋†’์Œ
๊ฒฐ๋ก  : ์ธํ„ฐํŽ˜์ด์Šค ์˜์กด์ด ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ๊ณ , ์‘์ง‘๋„๊ฐ€ ๋†’์•„ ํด๋ž˜์Šค ์˜์กด๋ณด๋‹ค ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฝ๋‹ค.
ํด๋ž˜์Šค ์˜์กด์„ฑ์€ ๊ฒฐํ•ฉ๋„์™€ ์‘์ง‘๋„ ์ธก๋ฉด์—์„œ ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ธํ„ฐํŽ˜์ด์Šค ์˜์กด์„ฑ์„ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ์œ ์—ฐ์„ฑ์„ ๋†’์ด๊ณ , ํด๋ž˜์Šค ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋ฉฐ, ํด๋ž˜์Šค์˜ ์‘์ง‘๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ž˜์Šค ์˜์กด ์ดํ•ดํ•˜๊ธฐ

A ํด๋ž˜์Šค๋Š” B ํด๋ž˜์Šค์˜ ์˜์กดํ•ฉ๋‹ˆ๋‹ค.
โ€ข
A ํด๋ž˜์Šค์—์„œ, B ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค) ์ƒ์„ฑ
โ€ข
A ํด๋ž˜์Šค์—์„œ, B ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ(methodA) ํ˜ธ์ถœ

์ฝ”๋“œ - (A โ† B)

// B ํด๋ž˜์Šค ์ •์˜ public class B { public void methodA() { System.out.println("B ํด๋ž˜์Šค์˜ methodA() ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ"); } } // A ํด๋ž˜์Šค ์ •์˜ public class A { public void execute() { B b = new B(); b.methodA(); } }
Java
๋ณต์‚ฌ
๋”์šฑ ํ™•์žฅ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ, B ํด๋ž˜์Šค๋ฅผ ๋” ๋งŽ์€ ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์— ํด๋ž˜์Šค A ํ•˜๋‚˜๋งŒ ์˜์กดํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๊ฐ€ ์ด์ œ๋Š” 50๊ฐœ, 100๊ฐœ ์ด์ƒ์˜ ํด๋ž˜์Šค์—์„œ B ํด๋ž˜์Šค์— ์˜์กดํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ - (X,Y,Z โ† B)

// B ํด๋ž˜์Šค ์ •์˜ public class B { public void methodA() { System.out.println("B ํด๋ž˜์Šค์˜ methodA() ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ"); } } // X ํด๋ž˜์Šค ์ •์˜ public class X { public void execute() { B b = new B(); b.methodA(); } } // Y ํด๋ž˜์Šค ์ •์˜ public class Y { public void execute() { B b = new B(); b.methodA(); } } // Z ํด๋ž˜์Šค ์ •์˜ public class Z { public void execute() { B b = new B(); b.methodA(); } } ...
Java
๋ณต์‚ฌ
๊ทธ๋Ÿฐ๋ฐ, ํ”„๋กœ๊ทธ๋žจ์˜ ์ „๋ฐ˜์ ์ธ ์„ค๊ณ„๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด ํด๋ž˜์Šค B ๋Œ€์‹  ํด๋ž˜์Šค C ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ํด๋ž˜์Šค B ์— ์˜์กดํ•˜๋˜ ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๋“ค์€ ๋ชจ๋‘ ํด๋ž˜์Šค C ๋กœ ์˜์กดํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
๊ธฐ์กด์— ํด๋ž˜์Šค B ์— ์˜์กดํ•˜๋˜, ํด๋ž˜์Šค 100๊ฐœ๋ฅผ ํด๋ž˜์Šค C ๋ฅผ ์˜์กดํ•˜๋„๋ก, ๊ฐ์ฒด B๋ฅผ ์ƒ์„ฑํ•˜๊ณ  methodA() ๋ฅผ ํ˜ธ์ถœํ•˜๋˜ ์ฝ”๋“œ๋“ค์„ ๊ฐ์ฒด C๋ฅผ ์ƒ์„ฑํ•˜๊ณ , methodB( ) ๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ํด๋ž˜์Šค ์˜์กด์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ํด๋ž˜์Šค ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์ ธ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.

์ฝ”๋“œ - (A โ† C)

// C ํด๋ž˜์Šค ์ •์˜ public class C { public void methodB() { System.out.println("C ํด๋ž˜์Šค์˜ methodB() ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ"); } } // A ํด๋ž˜์Šค ์ˆ˜์ • public class A { public void execute() { // โ˜…(์ˆ˜์ •) B b = new B(); // โ˜…C ๊ฐ์ฒด ์ƒ์„ฑ C c = new C(); // โ˜…(์ˆ˜์ •) b.methodA(); // โ˜…C ๊ฐ์ฒด์˜ methodB() ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ c.methodB(); } } // X ํด๋ž˜์Šค ์ˆ˜์ • // (์ƒ๋žต) // Y ํด๋ž˜์Šค ์ˆ˜์ • // (์ƒ๋žต) // Z ํด๋ž˜์Šค ์ˆ˜์ • // (์ƒ๋žต)
Java
๋ณต์‚ฌ

์ธํ„ฐํŽ˜์ด์Šค ์˜์กด ์ดํ•ดํ•˜๊ธฐ

์ธํ„ฐํŽ˜์ด์Šค I ๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค B, ํด๋ž˜์Šค C ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ํด๋ž˜์Šค ๋ชจ๋‘ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ •์˜ํ•œ ์ถ”์ƒ๋ฉ”์†Œ๋“œ methodA( ) ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
ํด๋ž˜์Šค A ๋Š” ์ธํ„ฐํŽ˜์ด์Šค I ์— ์˜์กดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ, ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์„ ์–ธํ•˜๋˜ ํ•„์š”์— ๋”ฐ๋ผ ํด๋ž˜์Šค B ์— ๋Œ€ํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ํด๋ž˜์Šค C์— ๋Œ€ํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ( A โ† I B )

// ์ธํ„ฐํŽ˜์ด์Šค I ์ •์˜ public interface I { void methodA(); } // ํด๋ž˜์Šค B: ์ธํ„ฐํŽ˜์ด์Šค I๋ฅผ ๊ตฌํ˜„ public class B implements I { @Override public void methodA() { System.out.println("B ํด๋ž˜์Šค์˜ methodA() ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ"); } } // ํด๋ž˜์Šค A: ์ธํ„ฐํŽ˜์ด์Šค I์— ์˜์กด public class A { public void execute() { I i = new B(); i.methodA(); } }
Java
๋ณต์‚ฌ
๋”์šฑ ํ™•์žฅ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ, ๊ตฌํ˜„ ํด๋ž˜์Šค B ๋ฅผ ๊ฐ€์ง€๋Š” ์ธํ„ฐํŽ˜์ด์Šค I ๋ฅผ ๋” ๋งŽ์€ ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์— ํด๋ž˜์Šค A ํ•˜๋‚˜๋งŒ ์˜์กดํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๊ฐ€ ์ด์ œ๋Š” 50๊ฐœ, 100๊ฐœ ์ด์ƒ์˜ ํด๋ž˜์Šค์—์„œ ์ธํ„ฐํŽ˜์ด์Šค I ์— ์˜์กดํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ - ( A โ† I X,Y,Z )

// ์ธํ„ฐํŽ˜์ด์Šค I ์ •์˜ public interface I { void methodA(); } // ํด๋ž˜์Šค B: ์ธํ„ฐํŽ˜์ด์Šค I๋ฅผ ๊ตฌํ˜„ public class B implements I { @Override public void methodA() { System.out.println("B ํด๋ž˜์Šค์˜ methodA() ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ"); } } // ํด๋ž˜์Šค X: ์ธํ„ฐํŽ˜์ด์Šค I์— ์˜์กด public class X { public void execute() { I i = new B(); i.methodA(); } } // ํด๋ž˜์Šค Y: ์ธํ„ฐํŽ˜์ด์Šค I์— ์˜์กด public class Y { public void execute() { I i = new B(); i.methodA(); } } // ํด๋ž˜์Šค Z: ์ธํ„ฐํŽ˜์ด์Šค I์— ์˜์กด public class Z { public void execute() { I i = new B(); i.methodA(); } } ...
Java
๋ณต์‚ฌ
๊ทธ๋Ÿฐ๋ฐ, ํ”„๋กœ๊ทธ๋žจ์˜ ์ „๋ฐ˜์ ์ธ ์„ค๊ณ„๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด ํด๋ž˜์Šค B ๋Œ€์‹  ํด๋ž˜์Šค C ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ํด๋ž˜์Šค B ์— ์˜์กดํ•˜๋˜ ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๋“ค์€ ๋ชจ๋‘ ํด๋ž˜์Šค C ๋กœ ์˜์กดํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ, ์ธํ„ฐํŽ˜์ด์Šค ์˜์กด์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค๊ณ„ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ์กด ์ธํ„ฐํŽ˜์ด์Šค I ์— ์˜์กดํ•˜๋Š” ํด๋ž˜์Šค C ๋ฅผ ์ƒˆ๋กœ ์ •์˜ํ•˜๊ณ  ์ธํ„ฐํŽ˜์ด์Šค I ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค๋“ค์—์„œ๋Š” ๊ฐ์ฒด ์ƒ์„ฑ์— ๋Œ€ํ•œ ๋ถ€๋ถ„๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
ํด๋ž˜์Šค ์˜์กด์—์„œ๋Š” ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ๋ณ€๊ฒฝํ•˜์˜€์ง€๋งŒ, ์ธํ„ฐํŽ˜์ด์Šค ์˜์กด์—์„œ๋Š” B ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ๋ฅผ C ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ์ธํ„ฐํŽ˜์ด์Šค ์˜์กด์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ํด๋ž˜์Šค ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฒ์•„์ ธ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

์ฝ”๋“œ ( A โ† I C )

// ์ธํ„ฐํŽ˜์ด์Šค I ์ •์˜ public interface I { void methodA(); } // ํด๋ž˜์Šค B: ์ธํ„ฐํŽ˜์ด์Šค I๋ฅผ ๊ตฌํ˜„ public class B implements I { @Override public void methodA() { System.out.println("B ํด๋ž˜์Šค์˜ methodA() ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ"); } } // โ˜…ํด๋ž˜์Šค C: ์ธํ„ฐํŽ˜์ด์Šค I๋ฅผ ๊ตฌํ˜„ public class C implements I { @Override public void methodA() { System.out.println("C ํด๋ž˜์Šค์˜ methodA() ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ"); } } // ํด๋ž˜์Šค A: ์ธํ„ฐํŽ˜์ด์Šค I์— ์˜์กด public class A { public void execute() { // โ˜…(์ˆ˜์ •) I i = new B(); I i = new C(); i.methodA(); } }
Java
๋ณต์‚ฌ

๊ฒฐ๋ก  - ํด๋ž˜์Šค ์˜์กด vs ์ธํ„ฐํŽ˜์ด์Šค ์˜์กด

โ€œ์ธํ„ฐํŽ˜์ด์Šค ์˜์กด์ด ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ๋” ์ข‹๋‹ค.โ€

์˜์กด์„ฑ ์ฃผ์ž…

: ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์™ธ๋ถ€์—์„œ ์ƒ์„ฑํ•˜์—ฌ ๋Œ€์ž…ํ•˜๋Š” ๊ฒƒ

์˜์กด์„ฑ ์ฃผ์ž… ์ข…๋ฅ˜

1.
์ƒ์„ฑ์ž ์ฃผ์ž… (Constructor Injection)
2.
์„ธํ„ฐ ์ฃผ์ž… (Setter Injection)

์ƒ์„ฑ์ž ์ฃผ์ž…

1.
ํŠน์ง•:
โ€ข
์ƒ์„ฑ์ž ์ฃผ์ž…์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ•ด๋‹น ๊ฐ์ฒด์˜ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
โ€ข
์ฃผ๋กœ ํ•„์ˆ˜์ ์ธ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
โ€ข
๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์‹œ์ ์— ์˜์กด์„ฑ์ด ๋ช…ํ™•ํ•˜๊ฒŒ ๊ฒฐ์ •๋˜๊ณ  ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„์•ผ ํ•  ๋•Œ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
2.
์‚ฌ์šฉ ๋ฐฉ๋ฒ•:
โ€ข
ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์— ์˜์กด์„ฑ์„ ์ „๋‹ฌ๋ฐ›๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
์ฃผ์ž…ํ•˜๋ ค๋Š” ์˜์กด์„ฑ์„ ์ƒ์„ฑ์ž ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ณ , ์ด๋ฅผ ํ•„๋“œ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ - ์ƒ์„ฑ์ž ์ฃผ์ž…

โ€ข
Main.java
โ€ข
Board.java
โ€ข
Comment.java
โ€ข
MyService.java
โ€ข
BoardDAO.java
โ€ข
CommentDAO.java

์ฝ”๋“œ - Main.java

import java.util.List; import DI.DAO.BoardDAO; import DI.DAO.CommentDAO; import DI.DTO.Board; import DI.DTO.Comment; import DI.Service.MyService; public class Main { public static void main(String[] args) { // BoardDAO ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ BoardDAO boardDAO = new BoardDAO(); // CommentDAO ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ CommentDAO commentDAO = new CommentDAO(); // โ˜… ์˜์กด์„ฑ ์ฃผ์ž… - ์ƒ์„ฑ์ž ์ฃผ์ž… // MyService ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  BoardDAO ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ฃผ์ž… MyService myService1 = new MyService(boardDAO); // โ˜… ์˜์กด์„ฑ ์ฃผ์ž… - ์ƒ์„ฑ์ž ์ฃผ์ž… // MyService ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  commentDAO ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ฃผ์ž… MyService myService2 = new MyService(commentDAO); // MyService๋ฅผ ์‚ฌ์šฉ List<Board> boardList = myService1.selectBoardAll(); List<Comment> commentList = myService2.selectCommentAll(); } }
Java
๋ณต์‚ฌ

์ฝ”๋“œ - Board.java

// Board ํด๋ž˜์Šค class Board { // ๊ฒŒ์‹œ๋ฌผ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ•„๋“œ๋“ค }
Java
๋ณต์‚ฌ

์ฝ”๋“œ - Comment.java

// Comment ํด๋ž˜์Šค class Comment { // ๋Œ“๊ธ€ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ•„๋“œ๋“ค }
Java
๋ณต์‚ฌ

์ฝ”๋“œ - MyService.java

import java.util.List; import DI.DAO.BoardDAO; import DI.DAO.CommentDAO; import DI.DTO.Board; import DI.DTO.Comment; //MyService ํด๋ž˜์Šค public class MyService { private final BoardDAO boardDAO; private final CommentDAO commentDAO; // ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž… public MyService(BoardDAO boardDAO) { this.boardDAO = boardDAO; this.commentDAO = null; // CommentDAO๋Š” null๋กœ ์ดˆ๊ธฐํ™” } // ๋˜ ๋‹ค๋ฅธ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž… public MyService(CommentDAO commentDAO) { this.boardDAO = null; // BoardDAO๋Š” null๋กœ ์ดˆ๊ธฐํ™” this.commentDAO = commentDAO; } // selectAll() ๋ฉ”์†Œ๋“œ ์ •์˜ public List<Board> selectBoardAll() { // BoardDAO๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒŒ์‹œ๋ฌผ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ด return boardDAO.getAllBoards(); } // ๋‹ค๋ฅธ selectAll() ๋ฉ”์†Œ๋“œ ์ •์˜ public List<Comment> selectCommentAll() { // CommentDAO๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ“๊ธ€ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ด return commentDAO.getAllComments(); } }
Java
๋ณต์‚ฌ

์ฝ”๋“œ - BoardDAO.java

import java.util.List; // BoardDAO ํด๋ž˜์Šค (์˜์กด์„ฑ ์ฃผ์ž… ๋Œ€์ƒ) public class BoardDAO { // getAllBoards() ๋ฉ”์†Œ๋“œ ์ •์˜ public List<Board> getAllBoards() { // ๊ฒŒ์‹œ๋ฌผ ๋ชฉ๋ก์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋กœ์ง return null; // ๊ฐ„๋žตํ•˜๊ฒŒ ํ‘œ์‹œ } }
Java
๋ณต์‚ฌ

์ฝ”๋“œ - CommentDAO.java

import java.util.List; // CommentDAO ํด๋ž˜์Šค (์˜์กด์„ฑ ์ฃผ์ž… ๋Œ€์ƒ) public class CommentDAO { // getAllComments() ๋ฉ”์†Œ๋“œ ์ •์˜ public List<Comment> getAllComments() { // ๋Œ“๊ธ€ ๋ชฉ๋ก์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋กœ์ง return null; // ๊ฐ„๋žตํ•˜๊ฒŒ ํ‘œ์‹œ } }
Java
๋ณต์‚ฌ

์„ธํ„ฐ ์ฃผ์ž…

1.
ํŠน์ง•:
โ€ข
์„ธํ„ฐ ์ฃผ์ž…์€ ๊ฐ์ฒด ์ƒ์„ฑ ํ›„์— ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
โ€ข
์ฃผ๋กœ ์„ ํƒ์ ์ธ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
โ€ข
์˜์กด์„ฑ์ด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•  ๋•Œ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
2.
์‚ฌ์šฉ ๋ฐฉ๋ฒ•:
โ€ข
ํด๋ž˜์Šค ๋‚ด์— Setter ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
์ฃผ์ž…ํ•˜๋ ค๋Š” ์˜์กด์„ฑ์„ Setter ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ณ , ์ด๋ฅผ ํ•„๋“œ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ - ์„ธํ„ฐ ์ฃผ์ž…

โ€ข
Main.java
โ€ข
Board.java
โ€ข
Comment.java
โ€ข
MyService.java
โ€ข
BoardDAO.java
โ€ข
CommentDAO.java

์ฝ”๋“œ - Main.java

import java.util.List; import DI.DAO.BoardDAO; import DI.DAO.CommentDAO; import DI.DTO.Board; import DI.DTO.Comment; import DI.Service.MyService; public class Main { public static void main(String[] args) { // BoardDAO ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ BoardDAO boardDAO = new BoardDAO(); // CommentDAO ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ CommentDAO commentDAO = new CommentDAO(); // MyService ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ MyService myService1 = new MyService(); // โ˜… ์˜์กด์„ฑ ์ฃผ์ž… - ์„ธํ„ฐ ์ฃผ์ž… // BoardDAO ๊ฐ์ฒด๋ฅผ ์„ธํ„ฐ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ฃผ์ž… myService1.setBoardDAO(boardDAO); // MyService ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ MyService myService2 = new MyService(); // โ˜… ์˜์กด์„ฑ ์ฃผ์ž… - ์„ธํ„ฐ ์ฃผ์ž… // CommentDAO ๊ฐ์ฒด๋ฅผ ์„ธํ„ฐ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ฃผ์ž… myService2.setCommentDAO(commentDAO); // MyService๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ selectAll() ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ List<Board> boardList = myService1.selectBoardAll(); List<Comment> commentList = myService2.selectCommentAll(); } }
Java
๋ณต์‚ฌ

์ฝ”๋“œ - Board.java

// Board ํด๋ž˜์Šค class Board { // ๊ฒŒ์‹œ๋ฌผ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ•„๋“œ๋“ค }
Java
๋ณต์‚ฌ

์ฝ”๋“œ - Comment.java

// Comment ํด๋ž˜์Šค class Comment { // ๋Œ“๊ธ€ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ•„๋“œ๋“ค }
Java
๋ณต์‚ฌ

์ฝ”๋“œ - MyService.java

import java.util.List; import DI.DAO.BoardDAO; import DI.DAO.CommentDAO; import DI.DTO.Board; import DI.DTO.Comment; //MyService ํด๋ž˜์Šค public class MyService { private BoardDAO boardDAO; private CommentDAO commentDAO; // Setter ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž… public void setBoardDAO(BoardDAO boardDAO) { this.boardDAO = boardDAO; } // Setter ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž… public void setCommentDAO(CommentDAO commentDAO) { this.commentDAO = commentDAO; } // selectAll() ๋ฉ”์†Œ๋“œ ์ •์˜ public List<Board> selectBoardAll() { // BoardDAO๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒŒ์‹œ๋ฌผ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ด return boardDAO.getAllBoards(); } // selectAll() ๋ฉ”์†Œ๋“œ ์ •์˜ public List<Comment> selectCommentAll() { // CommentDAO๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ“๊ธ€ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ด return commentDAO.getAllComments(); } }
Java
๋ณต์‚ฌ

์ฝ”๋“œ - BoardDAO.java

import java.util.List; // BoardDAO ํด๋ž˜์Šค (์˜์กด์„ฑ ์ฃผ์ž… ๋Œ€์ƒ) public class BoardDAO { // getAllBoards() ๋ฉ”์†Œ๋“œ ์ •์˜ public List<Board> getAllBoards() { // ๊ฒŒ์‹œ๋ฌผ ๋ชฉ๋ก์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋กœ์ง return null; // ๊ฐ„๋žตํ•˜๊ฒŒ ํ‘œ์‹œ } }
Java
๋ณต์‚ฌ

์ฝ”๋“œ - CommentDAO.java

import java.util.List; // CommentDAO ํด๋ž˜์Šค (์˜์กด์„ฑ ์ฃผ์ž… ๋Œ€์ƒ) public class CommentDAO { // getAllComments() ๋ฉ”์†Œ๋“œ ์ •์˜ public List<Comment> getAllComments() { // ๋Œ“๊ธ€ ๋ชฉ๋ก์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋กœ์ง return null; // ๊ฐ„๋žตํ•˜๊ฒŒ ํ‘œ์‹œ } }
Java
๋ณต์‚ฌ

์˜์กด์„ฑ ์ฃผ์ž…์˜ ํ•„์š”์„ฑ

ํด๋ž˜์Šค ์˜์กด๋ณด๋‹ค ์ธํ„ฐํŽ˜์ด์Šค ์˜์กด์ด ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ์— ์žˆ์–ด์„œ ๋ชจ๋“ˆ(ํด๋ž˜์Šค) ๊ฐ„ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์•„์„œ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฝ๋‹ค๋Š” ๊ฒฐ๋ก ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ํ”„๋กœ๊ทธ๋žจ์€ ํ•œ ๋ฒˆ์— ์™„๋ฒฝํ•˜๊ฒŒ ๊ฐœ๋ฐœํ•˜์—ฌ ์™„์„ฑํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋ณ„๋กœ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๊ธฐ์กด์˜ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ค๊ณ„์™€ ๋กœ์ง์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์žฌ๊ตฌ์ถ•ํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ์ž๋Š” ์ˆ˜์‹ญ ๊ฐœ, ์ˆ˜๋ฐฑ ๊ฐœ์˜ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค๋“ค์„ ๊ฐœ๋ฐœ ํ•œ ๋’ค, ์œ ์ง€๋ณด์ˆ˜ ๋ฐ ์žฌ๊ตฌ์ถ•์„ ์œ„ํ•˜์—ฌ ์„ค๊ณ„์™€ ๋กœ์ง์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ด๋ฏธ ๊ฐœ๋ฐœ๋œ ํ”„๋กœ๊ทธ๋žจ์€ ์ˆ˜ ๋งŽ์€ ํด๋ž˜์Šค๋“ค๋กœ ์„œ๋กœ ์ƒ๋‹นํžˆ ๋งŽ์€ ์ˆ˜์˜ ์˜์กด์„ฑ์œผ๋กœ ์–ฝํ˜€์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋งŒ ๋ณ€๊ฒฝํ•ด๋„ ์ด์— ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ๋งŽ์€ ํด๋ž˜์Šค๋“ค์— ๋Œ€ํ•˜์—ฌ ์•„์ฃผ ๋งŽ์€ ์ˆ˜์ •์„ ํ•ด์ฃผ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ์ž‘์—…์„ ์ผ๋ฐ˜์ ์œผ๋กœ โ€œ์˜์กด์„ฑ ๊ด€๋ฆฌโ€๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
์‚ฌ์‹ค โ€œ์˜์กด์„ฑ ๊ด€๋ฆฌโ€๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋“ฑ๊ณผ ๋‹ฌ๋ฆฌ ์‹ค์งˆ์ ์ธ ์—…๋ฌด ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์˜์กด์„ฑ ๊ด€๋ฆฌ ๋•Œ๋ฌธ์— ์‹ค์งˆ์ ์œผ๋กœ ๋” ์ค‘์š”ํ•œ ๋กœ์ง๋“ค์„ ๊ฐœ๋ฐœํ•˜๋Š”๋ฐ์— ์จ์•ผํ•˜๋Š” ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ์ƒ๊ฐ์„ ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
โ€œ์˜์กด์„ฑ ๊ด€๋ฆฌ๋ฅผ ๋ˆ„๊ฐ€ ๋Œ€์‹ ํ•ด์ค„ ์ˆ˜ ์—†์„๊นŒ?โ€
์˜์กด์„ฑ ๊ด€๋ฆฌํ•˜๋Š” ์‹œ๊ฐ„๋งŒ ์ค„์—ฌ๋„ ๋” ์ค‘์š”ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ž‘์„ฑํ•˜๋Š”๋ฐ์— ์ง‘์ค‘ํ•˜๊ณ  ์‹œ๊ฐ„์„ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ํ…Œ๋‹ˆ๊นŒ์š”.
์ธํ„ฐํŽ˜์ด์Šค ์˜์กด์„ฑ์„ ์‚ฌ์šฉํ•ด์„œ, ํ•ด๋‹น ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉํ•  ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์„ ์–ธํ•˜๊ณ  ์‹ค์ œ๋กœ ์ƒ์„ฑ๋  ์ธ์Šคํ„ด์Šค(๊ฐ์ฒด)๋Š” ๋ˆ„๊ฐ€ ์•Œ์•„์„œ ์ƒ์„ฑํ•ด์„œ ๋„ฃ์–ด์ฃผ๋ฉฐ ์ข‹์ง€ ์•Š์„๊นŒ?
๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด, ์˜์กด์„ฑ ๊ด€๋ฆฌ๋Š” ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ , ์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธ๋งŒ ํ•œ ๋’ค ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ฐœ๋ฐœ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ .
์ฆ‰, ์˜ˆ์‹œ์ฝ”๋“œ (A โ† I C) ์ฒ˜๋Ÿผ, ์„ค๊ณ„๊ฐ€ B ํด๋ž˜์Šค์—์„œ C ํด๋ž˜์Šค๋กœ ๋ณ€๊ฒฝ๋˜์–ด๋„, ๊ฐ์ฒด ์ƒ์„ฑ์„ B ์—์„œ C ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…์กฐ์ฐจ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค I ๋งŒ ์„ ์–ธํ•ด๋†“๊ณ  ์—ฌ๊ธฐ์— ๋Œ€์ž…๋  ์ธ์Šคํ„ด์Šค๋Š” ๋ˆ„๊ตฐ๊ฐ€ ์•Œ์•„์„œ ์ƒ์„ฑํ•ด์„œ ๋„ฃ์–ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ, ํŠน์ • ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉํ•  ๊ฐ์ฒด, ์ฆ‰ ์˜์กดํ•  ๊ฐ์ฒด๋ฅผ ์™ธ๋ถ€์—์„œ ์ƒ์„ฑํ•˜์—ฌ ๋Œ€์ž…ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection) ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์˜์กด์„ฑ ์ฃผ์ž…์˜ ์žฅ์ 

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

ํ”„๋ ˆ์ž„์›Œํฌ (Framework)

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

์ œ์–ด์˜ ์—ญ์ „ (IoC; Inversion of Control)

์ œ์–ด์˜ ์—ญ์ „(IoC; Inversion of Control)์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ์ฒด์˜ ์ƒ๋ช… ์ฃผ๊ธฐ ๋ฐ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋ฅผ ํ•˜๋˜ ๊ฒƒ์„ ์Šคํ”„๋ง์ด ๋Œ€์‹  ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

Ioc ์ปจํ…Œ์ด๋„ˆ (Inversion of Control Container)

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

๋นˆ (Bean)

: ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ, IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด

๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (AOP)

: ํ”„๋กœ๊ทธ๋žจ์˜ ํšก๋‹จ์  ๊ด€์‹ฌ์‚ฌ๋ฅผ ์ค‘์‹ฌ์  ๊ด€์‹ฌ์‚ฌ(๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง)๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌ์‹œ์ผœ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„

์ค‘์‹ฌ์  ๊ด€์‹ฌ์‚ฌ (Core Concern)

: ์†Œํ”„ํŠธ์›จ์–ด์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ๊ณผ ๋กœ์ง์— ์ง์ ‘์ ์œผ๋กœ ๊ด€๋ จ๋œ ๋ถ€๋ถ„, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง

ํšก๋‹จ์  ๊ด€์‹ฌ์‚ฌ (Cross-Cutting Concern)

: ์ค‘์‹ฌ์  ๊ด€์‹ฌ์‚ฌ๋ฅผ ์ง€์›ํ•˜๊ณ  ๋ณด์™„ํ•˜๋Š” ๋ถ€์ˆ˜์ ์ธ ๋ถ€๋ถ„, ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ณตํ†ต ๋กœ์ง
โ€ข
์˜ˆ์™ธ์ฒ˜๋ฆฌ
โ€ข
๋กœ๊น…
โ€ข
๋ณด์•ˆ
โ€ข
ํŠธ๋žœ์žญ์…˜

AOP ์˜ ํ•„์š”์„ฑ

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

AOP ์ฃผ์š” ์šฉ์–ด

์šฉ์–ด
์„ค๋ช…
์–ด๋“œ๋ฐ”์ด์Šค(Advice)
๊ด€์ ์—์„œ ์ˆ˜ํ–‰ํ•  ์ž‘์—…์„ ์ •์˜ํ•œ ์ฝ”๋“œ ๋ธ”๋ก์ž…๋‹ˆ๋‹ค.
๊ด€์  (Aspect)
๊ด€์‹ฌ์‚ฌ์˜ ๋ชจ๋“ˆํ™”๋œ ๋‹จ์œ„๋กœ, ์–ด๋“œ๋ฐ”์ด์Šค์™€ ํฌ์ธํŠธ์ปท์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.
์กฐ์ธํฌ์ธํŠธ (Join Point)
์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ์˜ ํŠน์ • ์ง€์ (๋ฉ”์„œ๋“œ ํ˜ธ์ถœ, ์˜ˆ์™ธ ๋ฐœ์ƒ ๋“ฑ)์ž…๋‹ˆ๋‹ค.
ํฌ์ธํŠธ์ปท (Pointcut)
์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ์ ์šฉ๋  Join Point๋ฅผ ์„ ํƒํ•˜๋Š” ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค.
ํƒ€๊ฒŸ (Target)
๊ด€์‹ฌ์‚ฌ๊ฐ€ ์ ์šฉ๋˜๋Š” ๋Œ€์ƒ ๊ฐ์ฒด ๋˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

์–ด๋“œ๋ฐ”์ด์Šค (Advice)

: ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ฅผ ์ž‘์„ฑํ•œ ๋ฉ”์†Œ๋“œ

๊ด€์  (Aspect)

: ์กฐ์ธ ํฌ์ธํŠธ์™€ ํฌ์ธํŠธ์ปท์„ ์ •์˜ํ•œ ์–ด๋“œ๋ฐ”์ด์Šค๋“ค์„ ๋ชจ์•„๋†“์€ ํด๋ž˜์Šค

์กฐ์ธ ํฌ์ธํŠธ (Join Point)

: ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ํƒ€๊ฒŸ์— ์ ์šฉํ•˜๋Š” ํƒ€์ด๋ฐ

ํฌ์ธํŠธ์ปท (Pointcut)

: ์–ด๋“œ๋ฐ”์ด์Šค ์ ์šฉ ์กฐ๊ฑด

ํƒ€์ผ“ (Target)

: ์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ ์ ์šฉ๋˜๋Š” ํด๋ž˜์Šค

์–ด๋“œ๋ฐ”์ด์Šค ์ข…๋ฅ˜

์ข…๋ฅ˜
์„ค๋ช…
Before (์ด์ „)
๋Œ€์ƒ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ „์— ์‹คํ–‰
After Returning (๋ฐ˜ํ™˜ ํ›„)
๋Œ€์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ์˜ˆ์™ธ ์—†์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๊ณ  ๋ฐ˜ํ™˜๋  ๋•Œ ์‹คํ–‰
After Throwing (์˜ˆ์™ธ ํ›„)
๋Œ€์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ์˜ˆ์™ธ๋ฅผ ๋˜์งˆ ๋•Œ ์‹คํ–‰. ์ฃผ๋กœ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰
After (์ดํ›„)
๋Œ€์ƒ ๋ฉ”์„œ๋“œ ์‹คํ–‰ ํ›„ ํ•ญ์ƒ ์‹คํ–‰
Around (์ฃผ๋ณ€)
๋Œ€์ƒ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ „๊ณผ ํ›„์— ์‹คํ–‰

ํฌ์ธํŠธ์ปท ์‹ ์™€์ผ๋“œ์นด๋“œ

์™€์ผ๋“œ ์นด๋“œ
์„ค๋ช…
*
์ž„์˜์˜ ๋ฌธ์ž์—ด์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ํŒจํ‚ค์ง€ ์ด๋ฆ„, ํด๋ž˜์Šค ์ด๋ฆ„, ๋ฉ”์„œ๋“œ ์ด๋ฆ„์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
..
์ž„์˜์˜ ๋ฌธ์ž์—ด์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ํŒจํ‚ค์ง€ ๋ ˆ๋ฒจ ๋˜๋Š” ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
+
ํด๋ž˜์Šค ๋ ˆ๋ฒจ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ํ•ด๋‹น ํด๋ž˜์Šค ๋ฐ ๊ทธ ์„œ๋ธŒํด๋ž˜์Šค๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
(..)
๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

ํฌ์ธํŠธ์ปท ์ง€์‹œ์ž

์ง€์‹œ์ž
์„ค๋ช…
execution()
๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ง€์ ์„ ์ง€์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ: execution(* com.example.service.*.*(..))๋Š” com.example.service ํŒจํ‚ค์ง€์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
within()
ํŠน์ • ํƒ€์ž… ๋˜๋Š” ํŒจํ‚ค์ง€ ๋‚ด์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: within(com.example.service.*)๋Š” com.example.service ํŒจํ‚ค์ง€ ๋‚ด์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
bean()
ํŠน์ • ๋นˆ ์ด๋ฆ„๊ณผ ๊ด€๋ จ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: bean(myService)๋Š” myService ๋นˆ๊ณผ ๊ด€๋ จ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
this()
ํŠน์ • ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: this(com.example.MyService)๋Š” MyService ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
target()
ํŠน์ • ํƒ€์ž… ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: target(com.example.MyService)๋Š” MyService ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
args()
ํŠน์ • ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: args(java.lang.String)๋Š” String ํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๋Š” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
@annotation()
ํŠน์ • ์–ด๋…ธํ…Œ์ด์…˜์ด ์ ์šฉ๋œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: @annotation(org.springframework.transaction.annotation.Transactional)๋Š” @Transactional ์–ด๋…ธํ…Œ์ด์…˜์ด ์ ์šฉ๋œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์š”์•ฝ

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ

: ์ž๋ฐ” ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋ ˆ์ž„์›Œํฌ

์˜์กด์„ฑ ์ฃผ์ž… (DI; Dependency Injection)

: ์˜์กด ๊ฐ์ฒด๋ฅผ ์™ธ๋ถ€์—์„œ ์ƒ์„ฑํ•˜์—ฌ ๋Œ€์ž…ํ•˜๋Š” ๊ฒƒ

์ œ์–ด์˜ ์—ญ์ „ (Inversion of Control)

: ํ”„๋กœ๊ทธ๋žจ ์ œ์–ด๊ถŒ์˜ ์œ„์น˜๊ฐ€ ๊ฐœ๋ฐœ์ž์—์„œ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ๋’ค์ง‘ํžˆ๋Š” ๊ฒƒ

IoC ์ปจํ…Œ์ด๋„ˆ (Inversion of Control Container)

: ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์˜์กด์„ฑ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฐ์ฒด๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ์˜์—ญ

๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (AOP; Aspect Oriented Programming)

: ์ค‘์‹ฌ์  ๊ด€์‹ฌ์‚ฌ์™€ ํšก๋‹จ์  ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌ์‹œ์ผœ ํŠน์ • ์กฐ๊ฑด๊ณผ ํƒ€์ด๋ฐ์— ๋งž๊ฒŒ ์ค‘์‹ฌ๋กœ์ง์— ํšก๋‹จ๋กœ์ง์„ ์ ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„