์คํ๋ง์ ์ดํดํ๋ ค๋ฉด POJO๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์คํ๋ง ์ผ๊ฐํ์ด๋ผ๋ ์ ์นญ์ ๊ฐ์ง IoC/DI, AOP, PSA๋ผ๊ณ ํ๋ ์คํ๋ง์ 3๋ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ ๋ํด ์ดํด๊ฐ ํ์๋ค.
์คํ๋ง ์ผ๊ฐํ์ ์ดํดํ๋ฉด ๊ทธ ์กฐํฉ์ผ๋ก ์ด๋ฃจ์ด์ง ์๋ง์ ๋ณต์กํ ๋ถ๊ฐ ํ๋ ์์ํฌ๋ฅผ ์ดํดํ ์ ์๋ค.
์คํ๋ง ์ผ๊ฐํ์ ๋ํด์ ํ๋ฒ ์์๋ณด์.
IoC/DI - ์ ์ด์ ์ญ์ /์์กด์ฑ ์ฃผ์
ํ๋ก๊ทธ๋๋ฐ์์ ์์กด์ฑ์ด๋ ๋ฌด์์ผ๊น?
ex) ์ด์ ์๊ฐ ์๋์ฐจ๋ฅผ ์์ฐํ๋ค. -> ์๋์ฐจ๊ฐ ๋ด๋ถ์ ์ผ๋ก ํ์ด์ด๋ฅผ ์์ฐํ๋ค. (์ด์ ์ -> ์๋์ฐจ -> ํ์ด์ด) ์์กด
-> ์ ์ฒด(์์กดํ๋ ๊ฐ์ฒด)๊ฐ ๋ถ๋ถ(์์กด๋๋ ๊ฐ์ฒด)์ ์์กดํ๋ค.
์งํฉ(Aggregation) ๊ด๊ณ: ๋ถ๋ถ์ด ์ ์ฒด์ ๋ค๋ฅธ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง ์ ์๋ค.
๊ตฌ์ฑ(Compostion) ๊ด๊ณ: ๋ถ๋ถ์ ์ ์ฒด์ ๊ฐ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ๋๋ค.
์ํ๋ ํด๋์ค ๋ค์ด์ด ๊ทธ๋จ
์๋ฐ๋ง์ผ๋ก ์์กด๊ด๊ณ๋ฅผ ์ง์ ํด๊ฒฐํ๋ ์ฝ๋
* Car ๊ฐ์ฒด ์์ฑ์์์ new Car()
interface Tire {
String getBrand();
}
public class KoreaTire implements Tire {
public String getBrand() {
return "์ฝ๋ฆฌ์ ํ์ด์ด";
}
}
public class AmericaTire implements Tire {
public String getBrand() {
return "๋ฏธ๊ตญ ํ์ด์ด";
}
}
Carํด๋์ค์์ tire์ ์์กด์ฑ์ ์ง์ ์์ฑ ํ ์ฐ๊ฒฐ ์คํ
public class Car {
Tire tire;
public Car() {
tire = new KoreaTire();
// tire = new AmericaTire();
}
public String getTireBrand() {
return "์ฅ์ฐฉ๋ ํ์ด์ด: " + tire.getBrand();
}
}
์๋์ฐจ์ ์์ฑ์ ์ฝ๋์์ ์ง์ ํ์ด์ด๋ฅผ ์์ฑํด ์ฐธ์กฐ๋ณ์์ ์ฐ๊ฒฐํ๋ค.
-> Car ํด๋์ค๋ ์ธํฐํ์ด์ค ๋ฟ๋ง ์๋๋ผ ๊ตฌ์ฒดํ๋ KoreadTire์๋ ์์กดํ๊ฒ ๋๋ค.
์คํ๋ง ์์ด ์์กด์ฑ ์ฃผ์ ํ๊ธฐ 1 - ์์ฑ์๋ฅผ ํตํ ์ฃผ์
** ๋ง๋ก ํ์ด์ ํํ **
์ด์ ์๊ฐ ํ์ด์ด๋ฅผ ์์ฐํ๋ค.
์ด์ ์๊ฐ ์๋์ฐจ๋ฅผ ์์ฐํ๋ฉด์ ํ์ด์ด๋ฅผ ์ฅ์ฐฉ์ํจ๋ค.
** ์๋ฐ ํํ **
Tire tire = new KoreaTire();
Car car = new Car(tire); --> ์ธ๋ถ์์ ์ฃผ์ ๋๋ tire ์์กด์ฑ
์๋ฐ ์ฝ๋
public class Car {
Tire tire;
public Car(Tire tire) { // ์์ฑ์ ์ฃผ์
this.tire = tire;
}
public String getTireBrand() {
return "์ฅ์ฐฉ๋ ํ์ด์ด: " + tire.getBrand();
}
}
public class Driver {
public static void main(String[] args) {
Tire tire = new KoreaTire();
//Tire tire = new AmericaTire();
Car car = new Car(tire);
System.out.println(car.getTireBrand());
}
}
๋ฌด์์ด ๊ฐ์ ๋์๊น?
๊ธฐ์กด์ ์ง์ Car๊ฐ tire๋ฅผ ์์ฐํ๊ณ ์ฐ๊ฒฐํ๋ ๊ฒ์ tire๊ต์ฒด ์ Car์ ์์ ์ด ๋ถ๊ฐํผํ๋ฏ๋ก ์ฝ๋์ ์ ์ฐ์ฑ์ด ๋จ์ด์ง๊ณ ํ์ฅ์ฑ๋ ๋จ์ด์ก๋ค.
์์กด์ฑ ์ฃผ์ ์ ์ด์ฉํจ์ผ๋ก์ ์๋์ฐจ๊ฐ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฐ๊ฒฐํ๋ ๊ฒ์ด ์๋๋ผ ์ด์ ์๊ฐ ๋์ ์ํ๋ ์์กด์ฑ์ ์์ฑํ๊ณ ์ฐ๊ฒฐํด์ค๋ค.
๋ฐ๋ผ์, Car๊ฐ์ฒด๋ ์์กด์ฑ ์ฃผ์ ์ ํตํด ์ถ์์ ์ธ ์ธํฐํ์ด์ค์ ์์กดํ๋ฉด์ ์คํ์ด ๊ฐ๋ฅํด์ง๋ค.
๊ทธ๋ฆฌ๊ณ Car๊ฐ์ฒด๋ ์์ ์์ด ํ์ฅ์ด ๊ฐ๋ฅํด์ง๋ค.
์์ฑ์ ์ฃผ์ ๋ฐฉ์์ ์๋์ ๊ฐ์ ์ฅ์ ์ ๊ฐ์ง๋ค (๋ค๋ฅธ ์ฃผ์ ๊ณผ ๋น๊ตํ์ ๋) [์ฐธ๊ณ ]
- ์์กด๊ด๊ณ ์ค์ ์ด ๋์ง ์์ผ๋ฉด ๊ฐ์ฒด์์ฑ ๋ถ๊ฐ -> ์ปดํ์ผ ํ์์ ์ธ์ง ๊ฐ๋ฅ, NPE ๋ฐฉ์ง
- ์์กด์ฑ ์ฃผ์ ์ด ํ์ํ ํ๋๋ฅผ final ๋ก ์ ์ธ๊ฐ๋ฅ -> Immutable
- (์คํ๋ง์์) ์ํ์ฐธ์กฐ ๊ฐ์ง๊ฐ๋ฅ -> ์ํ์ฐธ์กฐ์ ์ฑ๊ตฌ๋ ์คํจ
- ํ ์คํธ ์ฝ๋ ์์ฑ ์ฉ์ด ( DI์ ํต์ฌ์ ๊ด๋ฆฌ๋๋ ํด๋์ค๊ฐ DI ์ปจํ ์ด๋์ ์์กด์ฑ์ด ์์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ์ฆ, ๋ ๋ฆฝ์ ์ผ๋ก ์ธ์คํด์คํ๊ฐ ๊ฐ๋ฅํ POJO(Plain Old Java Ojbect) ์ฌ์ผ ํ๋ค๋ ๊ฒ์ด๋ค. DI ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์๋ ๋จ์ ํ ์คํธ์์ ์ธ์คํด์คํํ ์ ์์ด์ผ ํ๋ค)
[์ฃผ์ ๋ฐฉ์์ ๋ฐ๋ฅธ ์ฅ๋จ์ ์ฐธ๊ณ ๋งํฌ]
์คํ๋ง ์์ด ์์กด์ฑ ์ฃผ์ ํ๊ธฐ 2 - ์์ฑ์ ํตํ ์์กด์ฑ ์ฃผ์
ex) car.setTire(tire);
์์ฑ์ ์ฃผ์ ์ ํ๋ฉด ๋ ์ด์ ํ์ด์ด๋ฅผ ๊ต์ฒดํ ์ ์๋ค.
์ฌ์ฉ์๊ฐ ์ํ ๋ ํ์ด์ด๋ฅผ ๊ต์ฒดํ๋ ค๋ฉด ์์ฑ์ ์ฃผ์ ์ด ์๋ ์์ฑ์ ํตํ ์์กด์ฑ ์ฃผ์ ์ด ํ์ํ๋ค. (ํ์ด์ด ์์ ๊ต์ฒด๋ฅผ ์ํ ์์ฑ ์ฃผ์ )
์คํ๋ง์ ํตํ ์์กด์ฑ ์ฃผ์ - XML ํ์ผ ์ฌ์ฉ
** ๋ง๋ก ํ์ด์ ํํ **
์ด์ ์๊ฐ ์ข ํฉ ์ผํ๋ชฐ(์คํ๋ง ํ๋ ์์ํฌ)์์ ํ์ด์ด๋ฅผ ๊ตฌ๋งคํ๋ค.
์ด์ ์๊ฐ ์ข ํฉ ์ผํ๋ชฐ์์ ์๋์ฐจ๋ฅผ ๊ตฌ๋งคํ๋ค.
์ด์ ์๊ฐ ์๋์ฐจ์ ํ์ด์ด๋ฅผ ์ฅ์ฐฉํ๋ค.
public class Driver {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("expert002/expert002.xml");
// Car car = (Car)context.getBean("car");
Car car = context.getBean("car", Car.class);
// Tire tire = (Tire)context.getBean("tire");
Tire tire = context.getBean("tire", Tire.class);
car.setTire(tire);
System.out.println(car.getTireBrand());
}
}
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์คํ๋ง ์์ด ์์กด์ฑ ์ฃผ์ ํ ๋์ ๋น๊ตํด์ Driver์ฝ๋ ์ธ ๋๋จธ์ง ์ฝ๋๋ ๋ณ๊ฒฝ์ด ์์๋ค.
Driver ์ฝ๋์์๋ ์์ฒด ์์ฐํ๋ Car์ Driver๋ฅผ ์ข ํฉ์ผํ๋ชฐ(์คํ๋งํ๋ ์์ํฌ)์์ ๊ตฌ์ ํ๋ ํ์์ผ๋ก ์์ ๋์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ข ํฉ์ผํ๋ชฐ(์คํ๋งํ๋ ์์ํฌ)์ Car์ Driver์ ๋ณด๋ ์ด๋์ ์์๊น?
-> XML ํ์ผ
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="tire" class="expert002.KoreaTire"></bean>
<bean id="americaTire" class="expert002.AmericaTire"></bean>
<bean id="car" class="expert002.Car"></bean>
</beans>
Only ์๋ฐ์์ ์คํ๋ง์ ๋์ ํด์ ์ป๋ ์ฅ์ ์ด ๋ฌด์์ผ๊น?
์๋์ฐจ์ ํ์ด์ด ๋ธ๋๋๋ฅผ (ํ๊ตญ -> ๋ฏธ๊ตญ)์ผ๋ก ๋ณ๊ฒฝํ ๋ ๊ทธ ๋ฌด์๋ ์ฌ์ปดํ์ผ/์ฌ๋ฐฐํฌํ์ง ์์๋ XML ํ์ผ๋ง ์์ ํ๋ฉด ํ๋ก๊ทธ๋จ์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๊ฟ ์ ์๋ค.
์คํ๋ง์ ํตํ ์์กด์ฑ ์ฃผ์ - ์คํ๋ง ์ค์ ํ์ผ(XML)์์ ์์ฑ ์ฃผ์
public class Driver {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("expert003/expert003.xml");
//Car car = (Car)context.getBean("car");
Car car = context.getBean("car", Car.class);
System.out.println(car.getTireBrand());
}
}
์ ์ฝ๋๋ tire์ ๋ณด๋ฅผ ๊ฐ์ ธ์์ Car์ ์ฃผ์ ํ๋ ๋ถ๋ถ์ด ์ฌ๋ผ์ก๋ค.
๊ทธ๋ฌ๋ฉด ์ด๋ป๊ฒ tire๋ Car์ ์์กด์ฑ ์ฃผ์ ์ด ๋๋๊ฑธ๊น?
XML ํ์ผ
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="koreaTire" class="expert003.KoreaTire"></bean>
<bean id="americaTire" class="expert003.AmericaTire"></bean>
<bean id="car" class="expert003.Car">
<property name="tire" ref="koreaTire"></property>
<!--
<property name="tire" ref="americaTire"></property>
-->
</bean>
</beans>
XML ํ์ผ์์ tire์ koreaTire๋ฅผ ๊ฒฐํฉํด์ฃผ๊ณ ์๋ค. ๋ฐ๋ผ์ ์๋ฐ ์ฝ๋์์๋ ์ฌ๋ผ์ง ์ ์๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์ดํดํ๊ธด ์ด๋ ค์ธ ์ ์์ง๋ง 'ํ์ค์ ์ด๊ณ ' '์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด' ๋ฐฉ์์ด๋ค.
-> ref์ ๊ฐ์ americalTire๋ก ๋ฐ๊พธ๋ฉด ์ฅ์ฐฉ๋ ํ์ด์ด๊ฐ ๋ฏธ๊ตญ ํ์ด์ด๋ก ๋ฐ๋๋ค.
์คํ๋ง์ ํตํ ์์กด์ฑ ์ฃผ์ - @Autowired๋ฅผ ํตํ ์์กด์ฑ ์ฃผ์
ํ๋ก๊ทธ๋๋จธ์ 3๋ ์คํฌ์ด ์๋ค๊ณ ํ๋ค...
1. Copy & Paste
2. Divide & Conquer
3. Creative & Idleness (์ฐฝ์กฐ์ ๊ฒ์ผ๋ฆ)
3๋ฒ ์์) i++, for, for-each๋ ์ด๋ฏธ ์๋ ๊ธฐ๋ฅ์ ๋์ฑ ํธํ๊ฒ ์ฌ์ฉํ๋ ค๊ณ ๋ง๋ ๋ฐฉ๋ฒ๋ค์ด๋ค.
์คํ๋ง์ ์ฐฝ์กฐ์ ๊ฒ์ผ๋ฆ์? -> @Autowired
๋ฐ๋์ ์ค์ ์ ๋ฉ์๋๋ฅผ ํตํด tire๊ฐ์ ์ฃผ์ ํด์ผํ ๊น?
"@Autowired Tire tire"๋ฅผ ์ฌ์ฉํด๋ณด์.
์ด๋ฅผ ์ด์ฉํ๋ฉด ์ค์ ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ ์คํ๋งํ๋ ์์ํฌ๊ฐ ์ค์ ํ์ผ์ ํตํด ์ค์ ์ ๋ฉ์๋ ๋์ ์์ฑ์ ์ฃผ์ ํด์ค๋ค.
- ๊ธฐ์กด ์ค์ ํ์ผ
<bean id="car" class="expert003.Car">
<property name="tire" ref="koreaTire"></property>
</bean>
- @Autowired ํ ์๋ก์ด ์ค์ ํ์ผ
<bean id="car" class="expert003.Car"></bean>
property ํ๊ทธ๊ฐ ์ฌ๋ผ์ก๋ค! @Autowired๋ฅผ tire์ ์ค์ ํด์ค์ผ๋ก์ car์ property๋ฅผ ์๋์ผ๋ก ์ฎ์ ์ ์๊ฒ ๋์๋ค.
-> XML ํ์ผ ์ค์ ์ @Autowired ์ค์ ์ผ๋ก ๋์ฒดํจ
@Autowired๋ฅผ ํตํ ์์ฑ ๋งค์นญ ๊ท์น
@Autowired ์ค์ ๋ ์์ฑ๋ค์ ์์ ๊ท์น์ ํตํด์ ๋ฑ๋ก๋ ๋น์ ์ ํํ๊ฒ ๋๋ค.
์คํ๋ง์ ํตํ ์์กด์ฑ ์ฃผ์ - @Resource๋ฅผ ํตํ ์์ฑ ์ฃผ์
@Resource๋ @Autowired์ ๊ฐ์ด ์์ฑ์ ์๋์ผ๋ก ์ฎ์ด์ค๋ค.
ํ์ง๋ง @Autowired๋ ์คํ๋ง์ ์ด๋ ธํ ์ด์ ์ด๊ณ @Resource๋ ์๋ฐ ํ์ค ์ด๋ ธํ ์ด์ ์ด๋ค.
๋ํ ๋์ ๊ฒ์๋ฐฉ์์์ ์ฐจ์ด๋ฅผ ๋ณด์ธ๋ค. ๋ฆฌ์์ค๋ id๋จผ์ type ํ์์์ด๊ณ Autowired๋ ๋ฐ๋์ด๋ค.
AOP - Aspect? ๊ด์ ? ํต์ฌ ๊ด์ฌ์ฌ? ํก๋จ ๊ด์ฌ์ฌ?
AOP-๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ
์คํ๋ง DI๊ฐ ์์กด์ฑ์ ๋ํ ์ฃผ์ ์ด๋ผ๋ฉด ์คํ๋ง AOP๋ ๋ก์ง(code)์ ๋ํ ์ฃผ์ ์ด๋ค.
์ฌ๋ฌ ๋ชจ๋์์ ๋ฐ์ํ๋ ๊ณตํต์ ์ธ ๋ถ๋ถ
์ ๊ธ, ์ถ๊ธ, ์ด์ฒด ๋ชจ๋ ๋ชจ๋ <๋ก๊น , ๋ณด์, ํธ๋์ญ์ > ๊ธฐ๋ฅ์ด ๋ฐ๋ณต์ ์ผ๋ก ๋ํ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด์ฒ๋ผ ๋ค์์ ๋ชจ๋์ ๊ณตํต์ ์ผ๋ก ๋ํ๋๋ ๋ถ๋ถ์ด ์กด์ฌํ๋ ๊ฒ์ "ํก๋จ ๊ด์ฌ์ฌ"๋ผ๊ณ ํ๋ค.
DB ์ปค๋ฅ์ ์ ์๊ฐํด๋ณด์.
์ฟผ๋ฆฌ(ํต์ฌ๊ด์ฌ์ฌ)๋ฅผ ๋ ๋ฆฌ๊ธฐ ์ DB ์ปค๋ฅ์ ์ ์ฐ๊ฒฐ(ํก๋จ ๊ด์ฌ์ฌ)ํด์ผ๋ง ํ๋ค. (์ฝ๋ = ํต์ฌ๊ด์ฌ์ฌ + ํก๋จ ๊ด์ฌ์ฌ)
'ํต์ฌ ๊ด์ฌ์ฌ'๋ ๋ชจ๋๋ณ๋ก ๋ค๋ฅด์ง๋ง 'ํก๋จ ๊ด์ฌ์ฌ'๋ ๋ชจ๋๋ณ๋ก ๋ฐ๋ณต๋์ด ์ค๋ณตํด์ ๋ํ๋๋ค.
-> "๋ฐ๋ณต/์ค๋ณต์ ๋ถ๋ฆฌํด์ ํ ๊ณณ์์ ๊ด๋ฆฌํ๋ผ"
AOP๋ก์ง ์ฃผ์ ์ด ๊ฐ๋ฅํ ๋ถ๋ถ
Around, Before, After, AfterReturning, AfterThrowing -> ์ด 5๊ฐ ์์น์ ์ฃผ์ ๋ก์ง(์ฝ๋) ์ฃผ์ ๊ฐ๋ฅ
** ๊ธฐ์กด์ฝ๋ **
public class Boy {
public void runSomething() {
System.out.println("์ด์ ๋ก ๋ฌธ์ ์ด๊ณ ์ง์ ๋ค์ด๊ฐ๋ค.");
try {
System.out.println("์ปดํจํฐ๋ก ๊ฒ์์ ํ๋ค.");
} catch (Exception ex) {
if (ex.getMessage().equals("์ง์ ๋ถ๋จ")) {
System.out.println("119 ์ ์ ๊ณ ํ๋ค.");
}
} finally {
System.out.println("์๋ฑํ๊ณ ์๋ค.");
}
System.out.println("์๋ฌผ์ ๋ฅผ ์ ๊ทธ๊ณ ์ง์ ๋์ ๋ค.");
}
}
ํต์ฌ ๊ด์ฌ์ฌ์ ํก๋จ ๊ด์ฌ์ฌ๊ฐ ํ ๋ฉ์๋์ ๊ฐ์ด ์ฌ์ฉ๋๊ณ ์๋ค.
** ๊ฐ์ ์ฝ๋ **
๋จผ์ Boy๋ฅผ Person์ธํฐํ์ด์ค๋ฅผ ์์ํ๋ ํ์์ผ๋ก ๋ง๋ค์
public interface Person {
void runSomething();
}
public class Boy implements Person {
public void runSomething() {
System.out.println("์ปดํจํฐ๋ก ๊ฒ์์ ํ๋ค.");
}
}
XMLํ์ผ์ ์์ ํ์
<?xml version="1.0" encoding="UTF-8"?>
<beans
์๋ต...>
<aop:aspectj-autoproxy />
<bean id="myAspect" class="aop002.MyAspect" />
<bean id="boy" class="aop002.Boy" />
<bean id="girl" class="aop002.Girl" />
</beans>
MyAspect์ฝ๋๋ฅผ ์์ฑํ์.
@Aspect
public class MyAspect {
@Before("execution(* runSomething())")
public void before(JoinPoint joinPoint) {
System.out.println("์ผ๊ตด ์ธ์ ํ์ธ: ๋ฌธ์ ๊ฐ๋ฐฉํ๋ผ");
// System.out.println("์ด์ ๋ก ๋ฌธ์ ์ด๊ณ ์ง์ ๋ค์ด๊ฐ๋ค.");
}
}
- @Aspect๋ ์ด ํด๋์ค๋ฅผ ์ด์ AOP์์ ์ฌ์ฉํ๊ฒ ๋ค๋ ์๋ฏธ
- @Before๋ ๋์ ๋ฉ์๋ ์คํ ์ ์ ์ด ๋ฉ์๋๋ฅผ ์คํํ๊ฒ ๋ค๋ ์๋ฏธ
๋ฉ์๋์ joinPoint๋ Boy.runSomething()์ ์๋ฏธํ๋ค. ์ด์ ์ฌ์ฉ์๊ฐ ์ผ๊ตด ์ธ์ํ๊ณ ๋ฌธ์ ์ฌ๋ ๊ฒ์ด ์๋๋ผ ์คํ๋ง ํ๋ ์์ํฌ๊ฐ ์ฌ์ฉ์๋ฅผ ์ธ์ํด ์๋์ผ๋ก ๋ฌธ์ ์ด์ด์ค๋ค.
์ฌ์ค Boy์ ํต์ฌ๊ด์ฌ์ฌ๋ง ๋จ๊ธฐ๊ธฐ ์ํด 4๊ฐ์ ํ์ผ(์ธํฐํ์ด์ค, Boy, XML, Aspectํ์ผ)์ ์์ ์ด ํ์ํ๋ค.
ํ์ง๋ง ์ด๋ก ์ธํด Boy๋ ํต์ฌ ๊ด์ฌ์ฌ๋ง ๊ฐ์ง๊ฒ ๋์๊ณ ์ถ๊ฐ ๊ฐ๋ฐ๊ณผ ์ ์ง๋ณด์๊ฐ ๊ต์ฅํ ํธ๋ฆฌํด์ก๋ค.
๋ํ, AOP๋ฅผ Boy.java์ ์ ์ฉํจ์ผ๋ก์จ ๋จ์ผ์ฑ ์์์น๋ ์์ฐ์ค๋ ์ ์ฉํ ์ ์๊ฒ ๋์๋ค.
- Boy๊ฐ Person์ด๋ผ๋ ์ธํฐํ์ด์ค๊ฐ ํ์ํ ์ด์
- ์คํ๋ง AOP๊ฐ ์ธํฐํ์ด์ค ๊ธฐ๋ฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
- MyAspect๊ฐ ์ถ๊ฐ๋ ์ด์
- ๊ณตํต์ ์ผ๋ก ๋ํ๋๋ ํก๋จ ๊ด์ฌ์ฌ๋ฅผ ๋๊ตฐ๊ฐ๋ ์ฒ๋ฆฌํด์ผ ํ๊ธฐ ๋๋ฌธ (MyAspect๊ฐ ํก๋จ ๊ด์ฌ์ฌ๋ฅผ ์ฒ๋ฆฌํจ)
- XML์์ ๋น์ ์ค์ ํด ๊ฐ์ฒด์ ์์ฑ๊ณผ ์์กด์ฑ ์ฃผ์ ์ ์คํ๋ง ํ๋ ์์ํฌ์ ์์ํ ์ ์๋ค.
ํ๋ก์ ํจํด์ ์ด์ฉํด ํก๋จ ๊ด์ฌ์ฌ๋ฅผ ํต์ฌ ๊ด์ฌ์ฌ์ ์ฃผ์ ํ๊ธฐ
ํ๋ก์๋ฅผ ์ด์ฉํ ๋ฉ์๋ ๊ฐ์ ํธ์ถ
๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด "ํ๋ก์"๊ฐ ๊ทธ ์์ฒญ์ ๋ฐ์์ ์ง์ง ๊ฐ์ฒด์๊ฒ ์ ๋ฌํ๋ค.
์ด๋ "ํ๋ก์"๋ ๊ทธ๋ฅ ์ ๋ฌ๋ง ํ์ง ์๊ณ ์ฃผ๊ณ ๋ฐ๋ ๋ด์ฉ์ ๊ฐ์ฌํ๊ฑฐ๋ ์กฐ์ํ ์ ์๋ค.
๋ฉ์๋ Caller์ Callee๋ ํ๋ก์์ ์กด์ฌ๋ฅผ ์์ง ๋ชปํ๋ค. ์ค์ง ์คํ๋ง ํ๋ ์์ํฌ๋ง์ด ํ๋ก์์ ์กด์ฌ๋ฅผ ์๊ณ ์๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฉ์๋ Caller, Callee ํ๋ก์๊ฐ ๋ฌด์จ ์ผ์ ํ๋ ์ ํ ์๊ด์์ด ์์ ์ ๋ก์ง์ ์ํํ ์ ์๋ค.
์คํ๋งํ๋ ์์ํฌ๋ XMLํ์ผ์ <aop:aspectj-autoproxy />์ง์์๋ก ํ๋ก์์ ์กด์ฌ๋ฅผ ์ ์ ์๋ค.
์คํ๋ง AOP์ ํต์ฌ
- ์คํ๋ง AOP๋ ์ธํฐํ์ด์ค ๊ธฐ๋ฐ
- ์คํ๋ง AOP๋ ํ๋ก์ ๊ธฐ๋ฐ
- ์คํ๋ง AOP๋ ๋ฐํ์ ๊ธฐ๋ฐ
PSA - ์ผ๊ด์ฑ ์๋ ์ถ์ํ
์๋น์ค ์ถ์ํ์ ์๋ก JDBC๋ฅผ ๋ค ์ ์๋ค. JDBC๋ผ๊ณ ํ๋ ํ์ค ์คํ์ด ์๊ธฐ์ ์ค๋ผํด์ ์ฌ์ฉํ๋ MySQL์ ์ฌ์ฉํ๋ MS-SQL์ ์ฌ์ฉํ๋ Connection, Statement, ResultSet์ ์ด์ฉํด ๊ณตํต๋ ๋ฐฉ์์ผ๋ก ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
์ด์ฒ๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ข ๋ฅ์ ๊ด๊ณ์์ด ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ ์ดํ ์ ์๋ ์ด์ ๋ ๋์์ธ ํจํด์์ ์ค๋ช ํ๋ ์ด๋ํฐ ํจํด์ ํ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ค์์ ๊ธฐ์ ์ ๊ณตํต์ ์ธํฐํ์ด์ค๋ก ์ ์ดํ ์ ์๊ฒ ํ ๊ฒ -> ์๋น์ค ์ถ์ํ
์คํ๋ง ํ๋ ์์ํฌ๋ ์๋น์ค ์ถ์ํ๋ฅผ ์ํด ๋ค์ํ ์ด๋ํฐ๋ฅผ ์ ๊ณต!!!!
์๋ฅผ ๋ค๋ฉด OXM(Object XML Mapping)๊ธฐ์ ์๋ Castor, XMLBeans ๋ฑ ๋ค์ํ ๊ธฐ์ ์ด ์๋๋ฐ ์ด ๊ธฐ์ ๋ค์ API๋ ๋ชจ๋ ์ ๊ฐ๊ฐ์ด๋ค.
์ด๋ ์ ๊ฐ๊ฐ์ธ API๋ฅผ ์ํ ์ด๋ํฐ๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ์ด๋ค ๊ธฐ์ ์ ์ฐ๋ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ฒ ํด์ค๋ค.
๋ค๋ฅธ ๊ธฐ์ ๋ก์ ๊ต์ฒด ๋ํ ์ฝ๊ฒ ํ ์ ์๋ค.
PSA ์) ORM, ์บ์, ํธ๋์ญ์ , OXM ๋ฑ
"์ด์ฒ๋ผ ์๋น์ค ์ถ์ํ๋ฅผ ํด์ฃผ๋ฉด์ ์ผ๊ด์ฑ ์๋ ๋ฐฉ์์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ PSA(์ผ๊ด์ฑ ์๋ ์ถ์ํ)๋ผ๊ณ ํ๋ค."