๋ฐ์ํ
์คํ๋ง AOP ํน์ง
- ํ๋ก์ ๊ธฐ๋ฐ์ AOP ๊ตฌํ์ฒด
- ์คํ๋ง ๋น์๋ง AOP๋ฅผ ์ ์ฉํ ์ ์๋ค.
- ๋ชจ๋ AOP ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒ์ด ๋ชฉ์ ์ด ์๋๋ผ, ์คํ๋ง IoC์ ์ฐ๋ํ์ฌ ์ํฐํ๋ผ์ด์ฆ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฐ์ฅ ํํ ๋ฌธ์ (์ค๋ณต์ฝ๋, ํ๋ก์ ํด๋์ค๋ฅผ ๋ง๋๋ ๋น์ฉ๊ณผ ์๊ณ , ๊ฐ์ฒด๋ค ๊ฐ ๊ด๊ณ ๋ณต์ก ๋ฑ๋ฑ)์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ ๊ณตํ๋ ๊ฒ์ด ๋ชฉ์ .
ํ๋ก์ ํจํด
(๊ธฐ์กด ์ฝ๋ ๋ณ๊ฒฝ ์์ด) ์ ๊ทผ ์ ์ด ๋๋ ๋ถ๊ฐ ๊ธฐ๋ฅ ์ถ๊ฐ
ํ๋ก์ ํจํด์ ์ด์ฉํ์ฌ ๊ธฐ์กด ์ฝ๋๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ์ฑ๋ฅ์ ์ธก์ ํด๋ณด๊ฒ ๋ค.
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
EventService eventService; //interface๊ฐ ์๋ค๋ฉด interfaceํ์
์ผ๋ก ๋ฐ๋๊ฒ ๊ฐ์ฅ ์ข๋ค. ๊ตฌํ์ฒด๋ก ๋ฐ์ง๋ง๊ณ .
@Override
public void run(ApplicationArguments args) throws Exception {
eventService.createEvent();
eventService.publishEvent();
eventService.deleteEvent();
}
}
public interface EventService {
void createEvent();
void publishEvent();
void deleteEvent();
}
@Service
public class SimpleEventService implements EventService{
@Override
public void createEvent() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("create an Event");
}
@Override
public void publishEvent() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("publish an Event");
}
@Override
public void deleteEvent(){
System.out.println("Delete an Event");
}
}
Real Subject ํด๋์ค์ ์๋ ์ฝ๋๋ค์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
@Service
public class SimpleEventService implements EventService{
@Override
public void createEvent() {
long begin = System.currentTimeMillis();//์ด๋ฐ์์ผ๋ก ์์์๊ฐ์ ์ ์ฅํ๊ณ
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("create an Event");
System.out.println(System.currentTimeMillis() - begin);//์์์๊ฐ์ ๋บ ์๊ฐ์ ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ค.
}
@Override
public void publishEvent() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("publish an Event");
}
}
ํ์ง๋ง, ๊ธฐ์กด ์ฝ๋๋ค์ ๊ฑด๋ค์ด์ง ์๊ณ ์ฑ๋ฅ์ ์ธก์ ํ๊ณ ์ถ๋ค.
Proxyํจํด์ ์ด์ฉํด๋ณธ๋ค. ์๋ก์ด ํด๋์ค๋ค์ ๋ง๋ค์ด์ฃผ๊ณ ๋ฉ์๋๋ค ์คํ์ ๊ณผ ํ์ ์ฝ๋๋ค์ ๋ฃ์ด์ค๋ค.
@Primary //@Service ์ ๋
ธํ
์ด์
์ด ์ฌ๋ฌ๊ฐ ์์๊ฒฝ์ฐ ์ด ๋น์ ์ฐ์ ์ผ๋ก ์ฌ์ฉ.
@Service
public class ProxySimpleEventService implements EventService{
@Autowired
SimpleEventService simpleEventService;//์ด๋ฒ๋ง์ interfaceํ์์ผ๋ก ๋ง๊ณ , ์ฐ๋ฆฌ๊ฐ ๋ณ๊ฒฝํ๊ณ ์ ํ๋ ๊ตฌํ์ฒด๋ฅผ ์ฃผ์
๋ฐ๋๋ค.
@Override
public void createEvent() {
long begin = System.currentTimeMillis();
simpleEventService.createEvent();
System.out.println(System.currentTimeMillis() - begin);
}
@Override
public void publishEvent() {
long begin = System.currentTimeMillis();
simpleEventService.publishEvent();
System.out.println(System.currentTimeMillis() - begin);
}
@Override
public void deleteEvent() {
simpleEventService.deleteEvent();
}
}
๋ฌธ์ ์
- ๋งค๋ฒ ํ๋ก์ ํด๋์ค๋ฅผ ์์ฑํด์ผ ํ๋๊ฐ? (ํด๋์ค๋ฅผ ๋ง๋๋ ๋น์ฉ๊ณผ ์๊ณ )
- ์ฌ๋ฌ ํด๋์ค ์ฌ๋ฌ ๋ฉ์๋์ ์ ์ฉํ๋ ค๋ฉด..?
- ํ๋ก์ ํด๋์ค์๋ ์๊ธฐ๋ ์ค๋ณต ์ฝ๋
๊ทธ๋์ ๋ฑ์ฅํ ๊ฒ์ด ์คํ๋ง AOP
- ์คํ๋ง IoC ์ปจํ ์ด๋๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฐ ์์ค๊ณผ Dynamic ํ๋ก์๋ฅผ ์ฌ์ฉํ์ฌ *์ฌ๋ฌ ๋ณต์กํ ๋ฌธ์ ํด๊ฒฐ. *์ค๋ณต์ฝ๋, ๊ฐ์ฒด๊ฐ ๊ด๊ณ ๋ณต์กํจ ๋ฑ
- ๋์ ํ๋ก์ : ๋์ ์ผ๋ก ํ๋ก์ ๊ฐ์ฒด ์์ฑํ๋ ๋ฐฉ๋ฒ (๋์ ์ด๋? Runtime,์ฆ ์ ํ๋ฆฌ์ผ์ด์
์ด ๋์ํ๋ ์ค์ ๋์ ์ผ๋ก ์ด๋ค ๊ฐ์ฒด๋ฅผ Runtime์ ๋ง๋ ๋ค.
- ์๋ฐ๊ฐ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ์ธํฐํ์ด์ค ๊ธฐ๋ฐ ํ๋ก์ ์์ฑ
- CGlib์ ํด๋์ค ๊ธฐ๋ฐ ํ๋ก์๋ ์ง์
- ์คํ๋ง IoC: ๊ธฐ์กด ๋น์ ๋์ฒดํ๋ ๋์ ํ๋ก์ ๋น์ ๋ง๋ค์ด ๋ฑ๋ก ์์ผ์ค๋ค.
- ํด๋ผ์ด์ธํธ ์ฝ๋ ๋ณ๊ฒฝ ์์.
- AbstractAutoProxyCreator implements BeanPostProcessor
๋ฐ์ํ