Spring Framework
Spring Framework
Spring Framework ํต์ฌ ๊ธฐ๋ฅ
- ์์กด์ฑ ์ฃผ์ (dependency injection) - ๋ชจ๋ ๊ฒฐํฉ ์ฉ์ด(Maven : build ํ ๋ ์ฌ์ฉ๋๋ ํด)
- ํธ๋์ญ์ ๊ด๋ฆฌ(transaction management) - JAVA EE์์๋ ์ ๊ณต
์น์ ์ํ Spring Framework ๋ชจ๋
Spring์ ์ด์ฉํ ์น๊ฐ๋ฐ ์ ์ฃผ์ ๋ชจ๋์ ์๋ 3๊ฐ์ง์ผ ๊ฒ์ด๋ค.
MVC
-
Model, View, Controller ๋ฐฉ์์ ์น ๊ฐ๋ฐ ํจํด๋ค ์ค ํ๋
- DI(Dependency Injection)
- ๋์จํ ๊ฒฐํฉ๋ ฅ
ํธ๋์ญ์
-
๊ฐ์ข ์๋น์ค ๊ณ์ธต์ ๋๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค ๊ฒฝ์ฐ, ๊ทธ๋ค๊ฐ์ ํจ์ ํธ์ถ๊ด๊ณ์ ๋จ์ผ ํธ๋์ญ์ ์ ์ ๊ณต
-
AOP(Aspect Oriented Programming)
์ธ์ฆ๊ณผ ๊ถํ
-
์น์์ ์ฌ์ฉ์ ์ธ์ฆ๊ณผ ๊ถํ
-
Servlet Filter
๊ทธ๋ ๋ค๋ฉด Spring Framework์์ ์ค์ํ ๊ฐ๋ ๋ค์ ๋ํด ์ ๋ฆฌํ๊ณ ์์ํ์.
๋์จํ ๊ฒฐํฉ๋ ฅ๊ณผ ์ธํฐํ์ด์ค
Spring์ ์ธํฐํ์ด์ค ๊ธฐ๋ฐ ํ๋ก๊ทธ๋๋ฐ์ ํตํ์ฌ ๋์จํ ๊ฒฐํฉ๋ ฅ์ ์ ๊ณตํ๋ค.
์์ ์ฝ๋๋ฅผ ๋ณด๋ฉฐ Interface์ ๋์จํ ๊ฒฐํฉ๋ ฅ์ ๋ํ์ฌ ์ดํดํด ๋ณด์.
์ฐ์ Interfaceํด๋์ค๋ฅผ ์๊ธฐ ์ ์ ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํน์ง ์ค ์์์ ๊ฐ๋ ๋ถํฐ ์ดํดํ๊ณ ์ค๊ธธ ๋ฐ๋๋ค.
Interface์์ ๋ฉ์๋๋ฅผ ์ ์๋ง ํด๋๊ณ , ์ด Interface๋ฅผ implements๋ก ์์๋ฐ์ Class์์ Interface์ ๋ฉ์๋๋ค์ ๊ตฌํํ ์ ์๋ค.
Class๋ง ์ฌ์ฉํ ๊ฒฝ์ฐ
์๋ก ํ๊ตญ์ธ์ ์ํ ๋ฒ์ญ๊ธฐ๋ฅผ ๋ง๋ค์ด ๋ณธ๋ค. ์ฌ๋ฌ ์ธ์ด๋ค์ ๋ํ ๋ฒ์ญ ํด๋์ค๊ฐ ์๋์ ๊ฐ์ด ํ์ํ ๊ฒ์ด๋ค.
// ํ๊ตญ์ด - ์์ด
public class EnglishTrans {
public String koreanToEnglish(String str) {
//TODO: ํ๊ตญ์ด๋ฅผ ์์ด๋ก ๋ฒ์ญ
}
public String englishToKorean(String str) {
//TODO: ์์ด๋ฅผ ํ๊ตญ์ด๋ก ๋ฒ์ญ
}
}
// ํ๊ตญ์ด - ์ค๊ตญ์ด
public class ChineseTrans {
public String koreanToChinese(String str) {
//TODO: ํ๊ตญ์ด๋ฅผ ์ค๊ตญ์ด๋ก ๋ฒ์ญ
}
public String chineseToKorean(String str) {
//TODO: ์ค๊ตญ์ด๋ฅผ ํ๊ตญ์ด๋ก ๋ฒ์ญ
}
}
์์ด์ ์ค๊ตญ์ด์ ๋ํ 2๊ฐ์ ํด๋์ค๊ฐ ๋ง๋ค์ด ์ก๋ค.
์ด์ ์ ํด๋์ค๋ค์ ์ฌ์ฉํด ๋ณด์. ๋จผ์ ์์ด ๋ฒ์ญ์ด๋ค.
// ์์ด ๋ฒ์ญ
EnglishTrans trans = new EnglishTrans();
String str = trans.koreanToEnglish(str);
์ด๋ฒ์ ์ค๊ตญ์ด๋ก ๊ณ ์ณ์ฃผ๊ณ ์ถ๋ค
// ์ค๊ตญ์ด ๋ฒ์ญ
ChineseTrans trans = new ChineseTrans();
String str = trans.koreanToChinese(str);
์์ ๋ ๊ฐ์ฒด ์ ์ธ ์ฝ๋์ ๊ฐ์ด ๊ฐ ๊ธฐ๋ฅ์ ๋ํ ํด๋์ค๋ฅผ ์ฌ์ฉํ ๋, ๊ฐ์ฒด์ ํ์ ๋ ๋ฐ๋์ด ์ง๋ค. ๋ฌผ๋ก ์ฌ๊ธฐ์ ๊ธฐ๋ฅ์ ๋ฌธ์ ๋ ์๋ค. ํ์ง๋ง ์ธ์ ๋ ๊ฐ๋ฐ์ ๋ง๋ ๋ค๊ณ ๋ค๊ฐ ์๋๋ค. ๋ง๋ค ๋์ ํจ์จ์ฑ, ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ดํ์ ์ ์ง๋ณด์ ์์ ์ ์๊ฐํ๋ฉฐ ๊ฐ๋ฐ์ ํด์ผํ๋ค.
๋ง์ฝ ์ฌ๋ฌ ์ฌ๋์ด ํ์ ์ ํ์ฌ ๊ฐ์ ๋ค๋ฅธ ํด๋์ค๋ฅผ ๊ฐ๋ฐํ๋ค๋ฉด ๋ฌธ์ ๋ ๋ ์ฌ๊ฐํด์ง๋ค. ๊ฐ์์ ์คํ์ผ๋๋ก ๊ฐ๋ฐ์ ํ์ฌ ํด๋์ค๋ช , ๋ฉ์๋๋ช , ๊ฐ์ฒด๋ช ์ด ๋ชจ๋ ์ ๊ฐ๊ฐ์ธ ๋ฑ ํต์ผ์ฑ์ด ์์ด์ ธ ๊ฐ๋ ์ฑ, ์ ์ง๋ณด์์ฑ ๋ฑ์ด ๋จ์ด์ง ๊ฒ์ด๋ค.
์ด๋ฌํ ์ฝ๋์ ๊ณตํต์ ์ธ ๋ถ๋ถ์ ์ถ์ํํ์ฌ, ๊ฐ๋ฐ์ ํจ์จ์ฑ์ ๋์ด๋ ๋ฐฉ๋ฒ์ด ์๋ค. ๊ทธ๊ฒ์ด ๋ฐ๋ก ์ธํฐํ์ด์ค ๊ธฐ๋ฐ ํ๋ก๊ทธ๋๋ฐ์ด๋ค.
Interface๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
์ ์์ด๋ฒ์ญ, ์ค๊ตญ์ด ๋ฒ์ญ ๊ธฐ๋ฅ ์ค ๊ณตํต์ ์ธ ๋ถ๋ถ์ ํ๊ตญ์ด๋ฅผ ๋ฒ์ญ, ํ๊ตญ์ด๋ก ๋ฒ์ญ์ด๋ผ๋ ๊ฒ์ด๋ค. ์ด ๊ธฐ๋ฅ์ ์ถ์ํํ์ฌ Interface๋ฅผ ๋ง๋ค์ด ๋ณด์
public interface Translation {
// ํ๊ตญ์ด๋ฅผ ๋ฒ์ญ
public String translate(String str);
// ํ๊ตญ์ด๋ก ๋ฒ์ญ
public String translateInto(String str);
}
์ด์ ์ถ์ํํ ๋ฉ์๋๋ค์ ๊ฐ ํด๋์ค์์ ์์๋ฐ์ ์ธ๋ถ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.
// ํ๊ตญ์ด - ์์ด
public class EnglishTranslation implements Translation {
@Override
public String translate(String str) {
//TODO: ํ๊ตญ์ด๋ฅผ ๋ฒ์ญ
}
@Override
public String translateInto(String str) {
//TODO: ํ๊ตญ์ด๋ก ๋ฒ์ญ
}
}
// ํ๊ตญ์ด - ์ค๊ตญ์ด
public class ChineseTranslation implements Translation {
@Override
public String translate(String str) {
//TODO: ํ๊ตญ์ด๋ฅผ ๋ฒ์ญ
}
@Override
public String translateInto(String str) {
//TODO: ํ๊ตญ์ด๋ก ๋ฒ์ญ
}
}
ํด๋์ค๋ฅผ ํธ์ถํ๋ ๋ถ๋ถ์ ์๋์ ๊ฐ๋ค.
// ์์ด ๋ฒ์ญ
Translation trans = new EnglishTranslation();
String str = trans.translate(str);
// ์ค๊ตญ์ด ๋ฒ์ญ
Translation trans = new ChineseTranslation();
String str = trans.translate(str);
์ฝ๋๊ฐ ์ ๋ฆฌ๋๊ณ ํต์ผ์ฑ ์์ด์ก๋ค.
์ด์ ์ฌ์ฉํ ๋ ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํด์ ์ํ๋ ์ธ์ด์ ๋ฐ๋ผ ์ฌ์ฉํ ํด๋์ค๋ง ๊ณจ๋ผ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ๋๋ค. ๋ํ ์ฝ๋์ ์ฌํ์ฉ์ด ํจ์ฌ ์ฉ์ดํด์ก๋ค.
๋ฌผ๋ก ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค์ง ์์๋ ํ์ ์์ ์๋ก ์ฌ์ฉํ ์ด๋ฆ์ ๋ํด ์ฝ์ํ๊ณ , ์คํ ์กฐ์ฌํ๊ณ ํ๋ฉด ๋ฌธ์ ๋ ๊ฑด ์๋ค. ํ์ง๋ง ์ด๋ฐ ๊ฐ๋ฐ ์ ์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ๊ฐ๋ฉด ์ข๋ ํจ์จ์ ์ธ ๊ฐ๋ฐ์ ํ ์ ์์ง ์์๊น?
์ ๋ฆฌํ์๋ฉด, Interface์ ์ฌ์ฉ ์ด์ ๋ ์๋์ ๊ฐ๋ค.
- ํจ์จ์ฑ : ์ฝ๋์ ์ฌํ์ฉ์ด ๊ฐ๋ฅํ๊ฒ ๋๊ณ , ์คํ๊ฐ ์ค์ด ๊ฐ๋ฐ ์๊ฐ์ ๋จ์ถ ์ํฌ ์ ์๋ค.
- ํ์คํ : ํ์ ์์ ์ต์ํ์ ๊ท์ฝ๋ง์ผ๋ก ์ฝ๋์ ํต์ผ์ฑ์ ํ๋ณดํ ์ ์๋ค.
- ๋์จํ ๊ฒฐํฉ๋ ฅ : ํด๋์ค๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถฐ ์ฝ๋์ ์ข ์์ฑ์ ์ค์ผ ์ ์๋ค. ์ด๋ฅผ ํตํ์ฌ ์ ์ง๋ณด์์ฑ๋ ๋์ผ ์ ์๋ค.
IoC(Inversion of Control) ์ปจํ ์ด๋
์ฌ๋ฌ ๋ถํ๋ค์ ์ฃผ๋ฌธ์์ ์ ๋ ฅ์ ํด์ spring์ ์ ๊ณต์ ํ๊ฒ๋๋ฉด, spring์ ๊ทธ ์ฃผ๋ฌธ์๋ฅผ ๋ณด๊ณ ์กฐ๋ฆฝ์ ํ๋ค.
spring์์ ์ฃผ๋ฌธ์์ ์ ๋ ฅ๋ ๋ด์ฉ๋๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ๋ด์ ๊ทธ๋ฆ์ด ํ์ํ๋ค. ๊ทธ ๊ทธ๋ฆ์ด ์ปจํ ์ด๋์ด๋ค. ์์ ๋ด์ฉ๋ง๋ค ์ปจํ ์ด๋์ ์ข ๋ฅ๊ฐ ๋ฌ๋ผ์ง๋ค.
Spring์์ ์ฌ์ฉ๋๋ IoC๋ ๊ฐ์ฒด๊ฐ ๋ด๋ถ์ ์ผ๋ก ์กฐ์ํ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ์ง ์๊ณ ์ธ๋ถ๋ก๋ถํฐ ์ฃผ์ ๋ฐ๋ ๊ธฐ๋ฒ์ ์๋ฏธํ๋ค. ์ด๋ ๊ฐ์ฒด๋ฅผ ์ธ๋ถ๋ก๋ถํฐ ์ฃผ์ ํด์ฃผ๋ ์์ ์ DI(์์กด์ฑ ์ฃผ์ )์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ๊ทธ๋ฆผ์ ์๋์ ๊ฐ๋ค.
IoC Container๋ ์ค๋ธ์ ํธ์ ์์ฑ๊ณผ ๊ด๊ณ์ค์ , ์ฌ์ฉ, ์ ๊ฑฐ ๋ฑ์ ์์ ์ ๋์ ํด์ค๋คํ์ฌ ๋ถ์ฌ์ง ์ด๋ฆ์ด๋ค. ์ด๋, IoC Container์ ์ํด ๊ด๋ฆฌ๋๋ ์ค๋ธ์ ํธ๋ค์ Bean ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. IoC Container๋ Bean์ ์ ์ฅํ๋ค๊ณ ํ์ฌ, BeanFactory ๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค.
undefined
IoC Container์ ์ ๋ฆฌํ๋ฉด ์๋์ ๊ฐ๋ค.
- IoC ์ปจํ ์ด๋๋ spring์์ ์ฌ์ฉํ๋ Bean ๊ฐ์ฒด์ ์์ฑ์ ์ฑ ์์ง๊ณ , ์์กด์ฑ์ ๊ด๋ฆฌํ๋ค.
DI(Dependency Injection)
๋ถํ์ ์กฐ๋ฆฝํด์ค๋ค๊ณ ์์๋๋ฉด ๋๋ค.
Setter Injection
Setter ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ์ข ์์ฑ ์ฃผ์
B b = new B();
A a = new A();
a.setB(b);
Construnction Injection
์์ฑ์๋ฅผ ์ด์ฉํ์ฌ ์ข ์์ฑ ์ฃผ์
B b = new B();
A a = new A(b);
Method Injection
๋ฉ์๋๋ฅผ ๋ง๋ค์ด ์ข ์์ฑ ์ฃผ์
B b = new B();
A a = new A();
a.customSet(b);
AOP(Aspect Oriented Programming)๋?
๋ฐฉ๋ฒ๋ก ์ค ํ๋์ธ๋ฐ, spring์ด ๋์์ ์ค๋ค.
OOP(Object Oriented Programming)๊ฐ ์ฌ์ฉ์๊ฐ ์ํ๋ ์ฃผ์ ๋ฌด๋ผ๋ฉด, AOP๋ ์ฃผ์ ๋ฌด์ ํจ๊ป, ๊ฐ๋ฐ์ ๋๋ ์ด์์ ๊ด์ ์์์ ์ ๋ฌด๊น์ง ํฌํจํ๋ ๊ฐ๋ ์ด๋ค.
AOP๋ OOP๋ก ๋ ๋ฆฝ์ ์ผ๋ก ๋ถ๋ฆฌํ๊ธฐ ์ด๋ ค์ด ๋ถ๊ฐ ๊ธฐ๋ฅ์ ๋ชจ๋ํํ๋ ๋ฐฉ์์ด๋ค. ๋ก๊ทธ์ฒ๋ฆฌ, ๋ณด์์ฒ๋ฆฌ, ํธ๋์ญ์ ์ฒ๋ฆฌ์ ๊ฐ์ ๋ถ๋ถ์ด ๋ฐ๋ก ๋ถ๊ฐ ๊ธฐ๋ฅ ๋ชจ๋์ด๋ค. ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๊ณ ์์ง๋ ์์ง๋ง ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ถ๊ฐ๋จ์ผ๋ก์จ ์๋ฏธ๋ฅผ ๊ฐ๋ ํน๋ณํ ๋ชจ๋์ด๋ค. AOP๋ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ถ๊ฐ ๊ธฐ๋ฅ Aspect๋ฅผ ๋ถ๋ฆฌํ๋ ๋ฑ OOP๋ฅผ ๋ณด์ํ๋ ์ญํ ์ด๋ค.
AOP ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํ๋ ์์ํฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด, ํต์ฌ๊ธฐ๋ฅ์ ์ฝ๋๋ฅผ ๊ฑด๋๋ฆด ํ์ ์์ด, ๋ถ๊ฐ ๊ธฐ๋ฅ๋ค์ ๊ฐํธํ๊ฒ ๋ถ๋ฆฌํ ์ ์๋ค. ๋๋ถ์ด ๋ค์ํ ํด๋์ค๊ฐ Aspect๋ฅผ ์ฌํ์ฉํ๋ฉฐ ๊ณตํต ์ฌ์ฉํ ์ ์๋ค.
Leave a comment