์์ฆ์ ์ฝ๋ฉํ ๋ ์ฒ์๋ถํฐ AIํํ ๋ฌผ์ด๋ณด๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๊ณ ์ธ ์ ์๋ ์ฝ๋ ์์ด์ ํธ๋ ์์ฒญ ๋ง์์ก๋ค. ์๊ฐํด๋ณด๋ ๋ด๊ฐ AI๋ฅผ ์ฒ์ ์จ๋ดค์ ๋๋ ์ข ์กฐ์ฌ์ค๋ฝ๊ณ ์ ํ์ ์ผ๋ก ์ผ๋ ๊ฒ ๊ฐ๋ค. ์ฝ๋๋ฅผ ๋ฐ๋ก ์ง๋ฌ๋ผ๊ณ ํ๊ธฐ๋ณด๋จ ์ด๋ฏธ ์ง ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋ง ํด๋ฌ๋ผ๋ ์์ฒญ์ด ํจ์ฌ ๋ง์๋ค. ๊ทธ๋์ AI์ ํจ์จ์ฑ๋ณด๋ค๋ ๊ฐ๋ ํ์ต ๋๊ตฌ์ ์ฉ๋๋ก ํ์ฉํ๋๋ฌ๋ค. ๊ณต๋ถํ๋ ๊ทธ ๊ณผ์ ์ด ๊ฝค ์ฌ๋ฐ์ด์ ๊ทธ๋ ๋ฐ์๋ ๋ต๋ณ๋ค์ ๊ธ๋ก ์ ๋ฆฌํด๋ดค๋ค.
๊ธฐ๋ฅ ๋ฐ ์ฝ๋์ ๋ฌธ์ ์
์ ๊ธฐ๋ฅ์ id์ ๋ํ Vo ๋๋ TypeCode์ ๊ฐ๊ฐ ๋ฆฌํดํ๋ ํจ์์ด๋ค. id์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ฅผ ์์์ผ ํ๋ฏ๋ก DB ์กฐํ๋ ๋ ๋ค ๊ฐ์ ์ํ์ค๋ฅผ ๊ฑฐ์น๋ค. ๊ทธ๋์ Type์ ๊ตฌํ๋ ํจ์๋ Vo๋ฅผ ๊ตฌํ๋ ํจ์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค. ๊ทธ๋ผ์๋ ๋ ๊ฐ๊ฐ ์๋ก ๋ถ๋ฆฌ๋์ด ์์ด์ ์ข ๋ฅ๊ฐ ์ถ๊ฐ๋ ๋๋ง๋ค ์ ์ฌํ ์์ ์ ๊ฐ ํจ์๋ง๋ค ํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์๋ค.
์ง๊ธ ์๊ฐํด๋ณด๋ฉด ์กฐํ ๊ตฌ๋ฌธ์ ์์ ๋ฐ๋ก ๋ง๋ค๊ฑฐ๋, getType… ํจ์๋ฅผ ์์ ๋ ๋ฐฉํฅ์ผ๋ก ํด๋ด๋ ๋ ๊ฒ ๊ฐ๋ค.
private getVoById(int id) {
MyVo vo = mapper.selectTypeA(id);
if(vo != null) { doSomething(vo); return vo;}
vo = mapper.selectTypeB(id);
if(vo != null) { doSomething(vo); return vo;}
// ....๋ฐ๋ณต
throw new Exception(..., ...);
}
private TypeCode getTypeById(int id) {
MyVo vo = getVoById(id);
if(vo instanceof MyVoA) return TypeCode.A;
if(vo instanceof MyVoB) return TypeCode.B;
// .. ๋ฐ๋ณต
throw new Exception(..., ...);
}
๋ฆฌํฉํ ๋ง ๋ฐฉํฅ
- ์ ๋ต ํจํด๊ณผ ๋งคํ ํ ์ด๋ธ ํ์ฉ: TypeCode๋ฅผ ๋ณํํ๋ ๋ถ๋ถ๊น์ง ํ๋์ ์ ๋ต์ผ๋ก ๊ตฌ์ฑํ๋ค.
- ๋๋ค/ํจ์ํ ์ธํฐํ์ด์ค ํ์ฉ: ๋ง์ด ๋ฐ๋ณต๋๋ if-return ๋ถ๊ธฐ์ ๊ฐ๋ ์ฑ์ ๊ฐ์ ํ๋ค. ๋๋คํ์ผ๋ก ๋ฐ๋ก ์ง๋ ๊ฒ ์ต์์ง ์์๋ฐ ๊ฐ์ ๋ ์ฝ๋ ๋๋ถ์ ๊ณต๋ถ๊ฐ ๋ง์ด ๋์๋ค.
// 1. Type๋ณ ์กฐํ ์ ๋ต ์ ์
private static class MyStrategy{
final Function<Integer, MyVo> finder;
final Function<MyVo, MyVo> postProcess;
final TypeCode typeCode;
TypeStrategy(Function<Integer, MyVo> finder, Function<MyVo , MyVo > postProcess, TypeCode typeCode) {
this.finder = finder;
this.postProcess = postProcess;
this.typeCode = typeCode;
}
}
// 2. ์ ๋ต ๋ฆฌ์คํธ ์ด๊ธฐํ (์์ฑ์๋ static ๋ธ๋ก์์)
private final List<MyStrategy> myStrategies = Arrays.asList(
new MyStrategy(
mapper::selectTypeA
vo -> { ((MyVoA)vo).doSomething; return vo; },
TypeCode.A
),
new MyStrategy(
mapper::selectTypeB,
vo -> { ((MyVoB)vo).doSomething; return vo; },
TypeCode.B
)
// ... ๋๋จธ์ง ํ์
๋ ๋์ผํ๊ฒ ์ถ๊ฐ
);
// 3. refactoring
private MyVo getVoById(int id) {
for (MyStrategy strategy : myStrategies) {
MyVo vo = strategy.finder.apply(id);
if (vo != null) {
return strategy.postProcess.apply(vo);
}
}
throw new Exception(..., "์ฐ๊ฒฐ๋ Vo๊ฐ ์์", ...);
}
// 4. refactoring
private TypeCode getTypeById(int id) {
for (MyStrategy strategy : myStrategies) {
MyVo vo = strategy.finder.apply(id);
if (vo != null) {
return strategy.typeCode;
}
}
throw new Exception(..., "๊ฐ์ฒด๊ฐ ์์", ...);
}
๋ฆฌํฉํ ๋ง ํจ๊ณผ
- ๊ฐ๋ ์ฑ: Type๋ณ ์ฒ๋ฆฌ ๋ก์ง์ด ํ ๊ณณ์ ๋ชจ์ฌ ์์ด ํ๋์ ํ์ ๊ฐ๋ฅ. TypeCode๋ฅผ ๋ณํํ๋ ๋ถ๋ถ๊น์ง ํ๋์ ์ ๋ต์ผ๋ก ๊ตฌ์ฑํ ๋๋ถ์ด๋ค. ์ ์ฒ์ ๋ง๋ค ๋ ์ด ์๊ฐ์ ์ํ์๊น.
- ํ์ฅ์ฑ: ์๋ก์ด Type์ด ์ถ๊ฐ๋ ๋, if ๊ตฌ๋ฌธ ๋ฐ๋ณต์ด ์๋๋ผ ์ ๋ต ๋ฆฌ์คํธ์๋ง ์ถ๊ฐํ๋ฉด ๋จ
- ์ ์ง๋ณด์์ฑ: ์ค๋ณต ์ฝ๋ ์ต์ํ
- OCP ์ค์: ๊ธฐ์กด ์ฝ๋๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ์๋ก์ด ์ ๋ต๋ง ์ถ๊ฐ
- ์ด ์ธ์๋ AI๋ ์์ธ ์ฒ๋ฆฌ ์ผ์ํ ๊ฐ์ ๊ฒ์ด ์ฅ์ ์ด๋ผ๊ณ ๋ต๋ณ์ ํด์ฃผ์์ผ๋, ๊ทธ๊ฑด ์๋ ์ฝ๋์์ ์ด๋ฏธ ํ ๊ฑฐ์์…
'๐ ๊ธฐ๋ก > ๊ธฐํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ํ์ํฌ์ธํธ ๊ธ๊ผด ํ์ง๊ตฌ๋ฆฌ ๊ฐ์ ๋ฐฉ๋ฒ (0) | 2026.01.20 |
|---|---|
| Git Stash (0) | 2022.03.02 |
| MySQL Workbench์์ Server Status๋ฅผ ํ์ธํ ์ ์๋ ๊ฒฝ์ฐ (0) | 2022.01.16 |