์คํ๋ง ํ๋ ์์ํฌ ์๊ฐ
โข
์คํ๋ง ํ๋ ์์ํฌ๋?
โข
์คํ๋ง ํ๋ ์์ํฌ ํต์ฌ ๊ธฐ๋ฅ
โฆ
์์กด์ฑ ์ฃผ์
(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)
: ์ค์ฌ์ ๊ด์ฌ์ฌ์ ํก๋จ์ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌ์์ผ ํน์ ์กฐ๊ฑด๊ณผ ํ์ด๋ฐ์ ๋ง๊ฒ ์ค์ฌ๋ก์ง์ ํก๋จ๋ก์ง์ ์ ์ฉํ๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์