DAY 23
๐ย ์ค๋ ์ฝ์ ๋ฒ์ : 11. ์์คํ
(194~205p)
๐คย ์ฑ
์์ ๊ธฐ์ตํ๊ณ ์ถ์ ๋ด์ฉ
๋์๋ฅผ ์ธ์ด๋ค๋ฉด?
- ๋์์๋ ํฐ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ ์ฌ๋๋ค๋ ์๊ณ ์์ ์ฌํญ์ ์ง์คํ๋ ์ฌ๋๋ค๋ ์๋ค
- ์ ์ ํ ์ถ์ํ์ ๋ชจ๋ํ โ ํฐ ๊ทธ๋ฆผ์ ์ดํดํ์ง ๋ชปํด๋ ๊ฐ์ธ์ด ๊ด๋ฆฌํ๋ ๊ตฌ์ฑ์์๋ ํจ์จ์ ์ผ๋ก ๋์๊ฐ๋ค
- ๊นจ๋ํ ์ฝ๋ โ ๋ฎ์ ์ถ์ํ ์์ค์์ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ
- ๋์ ์ถ์ํ ์์ค โ ์์คํ
์์ค ์์๋ ๊นจ๋ํจ์ ์ ์งํ์
์์คํ
์ ์๊ณผ ์์คํ
์ฌ์ฉ์ ๋ถ๋ฆฌํ๋ผ
์ ์ ๊ณผ ์ฌ์ฉ์ ์์ฃผ ๋ค๋ฅด๋ค
- ์ ์(์ค๋น๊ณผ์ )
- APP ๊ฐ์ฒด๋ฅผ ์ ์ํ๊ณ ์์กด์ฑ์ ์๋ก ์ฐ๊ฒฐ
- ์ฌ์ฉ(๋ฐํ์ ๋ก์ง)
- ์ค๋น ๊ณผ์ ์ดํ์ ์ด์ด์ง๋ ๋ก์ง
์ด๊ธฐํ ์ง์ฐ(๊ณ์ฐ ์ง์ฐ) ๊ธฐ๋ฒ
public Service getService() {
if (service == null)
service = new MyServiceImpl(...);
return service;
}
- ์ฅ์
- ์ค์ ๋ก ํ์ํ ๋๊น์ง ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์์ผ๋ฏ๋ก ๋ถํ ๊ฐ์ โ APP ๊ธฐ๋ ์๊ฐ ๋นจ๋ผ์ง
- ์ด๋ค ๊ฒฝ์ฐ์๋ null ํฌ์ธํฐ๋ฅผ ๋ฐํํ์ง ์์
- ๋ฌธ์ ์
- getService ๋ฉ์๋๊ฐ MyServiceImpl ๊ณผ ์์ฑ์ ์ธ์์ ๋ช
์์ ์ผ๋ก ์์กด
- ์์กด์ฑ ํด๊ฒฐํ์ง ์์ผ๋ฉด ์ปดํ์ผ์ด ์๋
- MyServiceImpl์ด ๋ฌด์์ด ๊ฐ์ฒด๋ผ๋ฉด ํธ์ถ์ ์ ํ
์คํธ ์ ์ฉ ๊ฐ์ฒด๋ฅผ service ํ๋์ ํ ๋น ํ์
- ๊ฐ์ฒด ์์ฑ ๋ก์ง์ด ์์ฌ์์ผ๋ฏ๋ก ๋จ์ผ ์ฑ
์ ์์น ์๋ฐ
- MyServiceImpl์ด ๋ชจ๋ ์ํฉ์ ์ ํฉํ ๊ฐ์ฒด์ธ์ง ํ์ธ ๋ถ๊ฐ
- ์์ฃผ ์ฌ์ฉํ๋ฉด ๋ชจ๋์ฑ ์ ํ, ์ค๋ณต๋ ์ฌ๋ผ๊ฐ
Main ๋ถ๋ฆฌ ๊ธฐ๋ฒ
- ์์ฑ๊ณผ ๊ด๋ จํ ์ฝ๋๋ main ํน์ main์ด ํธ์ถํ๋ ๋ชจ๋๋ก
- ๋๋จธ์ง ์์คํ
์ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋์๊ณ ์์กด์ฑ ์ฐ๊ฒฐ ๋์๋ค๊ณ ๊ฐ์
ํฉํ ๋ฆฌ
- ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ์์ ์ APP์ด ๊ฒฐ์ ํ ํ์ ์๊น
- OrderProcessing APP์ LineItem ์ด ์์ฑ๋๋ ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด์ง๋ง ์ธ์คํด์ค ์์ฑ ์์ ์ ํต์ ๊ฐ๋ฅ
- ์์ฑ ๋ฐฉ๋ฒ์ main์ LineItemFactoryImplementation ์ ๊ธฐ์
์์กด์ฑ ์ฃผ์
ํ์ฅ
- ์์คํ
์ํคํ
์ฒ๋ ์ฌ์ ๊ณํ์ด ํ์ํ๋ค
- ์๋ช
์ด ์งง๋ค ๋ ๋ณธ์ง๋ก ์ธํด ์ํคํ
์ฒ์ ์ ์ง์ ์ธ ๋ฐ์ ๊ฐ๋ฅ
- ๊ด์ฌ์ฌ๋ฅผ ์ ์ ํ ๋ถ๋ฆฌํด ๊ด๋ฆฌ
ํก๋จ(cross-cutting) ๊ด์ฌ์ฌ
- ์์์ฑ๊ณผ ๊ฐ์ ๊ด์ฌ์ฌ๋ APP์ ์์ฐ์ค๋ฌ์ด ๊ฐ์ฒด ๊ฒฝ๊ณ๋ฅผ ๋๋๋ ๋ค
- ๋ชจ๋ ๊ฐ์ฒด๊ฐ ์ ๋ฐ์ ์ผ๋ก ๋์ผํ ๋ฐฉ์์ ์ด์ฉํ๊ฒ ํด์ผํ๋ค.
- ํน์ DBMS, ๋
์์ ์ด ํ์ผ ์ฌ์ฉ, ํ
์ด๋ธ๊ณผ ์ด์ ๊ฐ์ ๋ค์ด๋ฐ๋ฃฐ, ํธ๋์ญ์
์๋ฏธ๊ฐ ์ผ๊ด์
- AOP(Aspect-Oriented Programming): ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ
- ํน์ ๊ด์ฌ์ฌ ์ง์ํ๋ ค๋ฉด ์์คํ
์์ ํน์ ์ง์ ๋ค์ด ๋์ํ๋ ๋ฐฉ์์ ์ผ๊ด์ฑ ์๊ฒ ๋ฐ๊ฟ์ผํจ
- ์์์ ์ผ๋ก ์ ์ฅํ ๊ฐ์ฒด์ ์์ฑ์ ์ ์ธ
- ์์์ฑ ์ฑ
์์ ์์์ฑ ํ๋ ์์ํฌ์ ์์
- AOP ํ๋ ์์ํฌ ๋์์ฝ๋์ ์ํฅ์ ๋ฏธ์น์ง ์๋ ์ํ๋ก ๋์ ๋ฐฉ์ ๋ณ๊ฒฝ
์๋ฐ ํ๋ก์
- ๋ฉ์๋ ํธ์ถ์ ๊ฐ์ธ๋ ๋จ์ํ ์ํฉ์ ์ ํฉ
- ํด๋์ค ํ๋ก์ ์ฌ์ฉํ๋ ค๋ฉด CGLIB, ASM, Javassist ๊ฐ์ ๋ฐ์ดํธ ์ฝ๋ ์ฒ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์
import java.util.*;
public interface Bank {
Collection < Account > getAccounts();
void setAccounts(Collection < Account > accounts);
}
import java.util.*;
public class BankImpl implements Bank {
private List < Account > accounts;
public Collection < Account > getAccounts() {
return accounts;
}
public void setAccounts(Collection < Account > accounts) {
this.accounts = new ArrayList < Account > ();
for (Account account: accounts) {
this.accounts.add(account);
}
}
}
import java.lang.reflect.*;
import java.util.*;
public class BankProxyHandler implements InvocationHandler {
private Bank bank;
public BankProxyHandler(Bank bank) {
this.bank = bank;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
String methodName = method.getName();
if (methodName.equals("getAccounts")) {
bank.setAccounts(getAccountsFromDatabase());
return bank.getAccounts();
} else if (methodName.equals("setAccounts")) {
bank.setAccounts((Collection < Account > ) args[0]);
setAccountsToDatabase(bank.getAccounts());
return null;
} else { ...
}
}
protected Collection < Account > getAccountsFromDatabase() { ...
}
protected void setAccountsToDatabase(Collection < Account > accounts) { ...
}
}
Bank bank = (Bank) Proxy.newProxyInstance(Bank.class.getClassLoader(),
new Class[] {
Bank.class
},
new BankProxyHandler(new BankImpl()));
- ํ๋ก์๋ก ๊ฐ์ ์ธํฐํ์ด์ค Bank์ ๋น์ฆ๋์ค ๋
ผ๋ฆฌ ๊ตฌํํ๋ POJO BankImpl์ ์ ์
- ํ๋ก์ API์๋ InvocationHandler๋ฅผ ๋๊น โ ํ๋ก์์ ํธ์ถ๋๋ Bank ๋ฉ์๋ ๊ตฌํ์ ์ฌ์ฉ
- BankProxyHandler๋ ์๋ฐ ๋ฆฌํ๋ ์
API๋ฅผ ์ฌ์ฉํด ์ ๋๋ฆญ ๋ฉ์๋์ ์์ํ๋ BankImpl ๋งค์๋๋ก ๋งคํ
- ํ๋ก์๋ ์ฝ๋ ์์ด ๋ง๊ณ ์์คํ
๋จ์๋ก ์คํ ์ง์ ์ ๋ช
์ํ๋ ๋ฉ์ปค๋์ฆ ์ ๊ณตํ์ง ์์
๐คย ๋ ์ค๋ฅด๋ ์๊ฐ
- ๋์ ์ผ๋ก ์
๋ ฅ ๋ฐ์ ์ ์ ์ ๋ณด๋ก DB ์ปค๋ฅ์
์ ๋งบ๊ณ ๊ทธ ํ์ ์์กด์ฑ ์ฃผ์
ํ๋ ์์คํ
์ ๊ตฌํ ์ค์ ์์๋ค. ์ฑ
์ ์ฝ๊ธฐ ์ ์๋ ์ด๋ ค์ ๋ณด์์ผ๋ ์ ์๊ณผ ์ฌ์ฉ์ ๋ถ๋ฆฌ๋ฅผ ์ํด ๋ฐ๋์ ํ์ํ๋ค๋๊ฑธ ์์๊ณ ํฉํ ๋ฆฌ ๋ฐฉ์์ผ๋ก ์งํํด๋ณด๋ฉด ํด๊ฒฐ์ด ๋ ๊ฒ๋ ๊ฐ๋ค.
๐ย ์ง๋ฌธ
๐ย ์๊ฐ 3์ค ์์ฝ
- ์์คํ
์ ์๊ณผ ์์คํ
์ฌ์ฉ์ ๋ถ๋ฆฌํ๋ผ(main๋ถ๋ฆฌ, ํฉํ ๋ฆฌ, ์์กด์ฑ ์ฃผ์
๊ธฐ๋ฒ)
- ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ(AOP): ํน์ ๊ด์ฌ์ฌ์ ๋ํด์๋ ํน์ ์ง์ ์ ๋์ ๋ฐฉ์์ด ์ผ๊ด๋์ด์ผ ํจ
- ์๋ฐ ํ๋ก์: ํน์ ๊ด์ ์ ๋ํ ๋ถ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ ์ฝ๋์ ์์ด ๋ง์์ง๊ณ ์คํ ์ง์ ๋ช
์ ๋ชปํจ