Service interface์ ServiceImpl class ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ?
๋๋ถ๋ถ์ ํ๋ก์ ํธ๋ Service๋ฅผ ๋ง๋ค ๋ MemberService์ ๊ฐ์ด ์๋น์ค๋ฅผ ์ธํฐํ์ด์ค๋ก ์ค๊ณํ๊ณ , MemberServiceImpl ๋ผ๋ ๊ตฌํ์ฒด์ธ ํด๋์ค๋ฅผ ์์ฑํด์ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ์ค๊ณ๋ฉ๋๋ค.
๊ทธ๋์ ํ๋ก์ ํธ๋ฅผ ํ๋ฉฐ ์ด์ ๋ ๋ชจ๋ฅธ์ฒด ๊ทธ๋ฅ ๊ตฌ์กฐ๊ฐ ๊ทธ๋ฐ๊ฐ ๋ณด๋ค ํ๋ฉด์ ๊ณ์ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ค๊ฐ ์ด๋ฒ์ ๊ทธ ์ด์ ์ ๋ํด ์๊ณ ์ถ์ด์ ์ ์ ๋ฆฌ๋ ๋ช๋ช ๋ถ๋ค์ ์๋ฃ๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ ๋ฆฌํ๊ฒ ๋์์ต๋๋ค.
๋ด์ฉ ์ค ์๋ชป๋ ๋ถ๋ถ์ ๋๊ธ์ ํตํด ๋ง์ํด์ฃผ์๋ฉด ์ฐพ์๋ณด๊ณ ์์ ํ๋ฉฐ ๊ณต๋ถํ๊ฒ ์ต๋๋ค.
์ด๋ก ์์ผ๋ก ์์ ๊ฐ์ Service, ServiceImpl ํจํด์ผ๋ก ์ค๊ณ๋ฅผ ํด์ผํ๋ ์ด์ ๋ ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ฅผ ๋ถ๋ฆฌํจ์ผ๋ก์จ ๊ตฌํ์ฒด๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ํ์ฅํ ์ ์์ผ๋ฉฐ, ๊ตฌํ์ฒด ํด๋์ค๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ํ์ฅํด๋ ์ด๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ์ ์ฝ๋์ ์ํฅ์ ์ฃผ์ง ์๋๋ก ํ๊ธฐ ์ํจ์ ๋๋ค.
์ด ๊ฐ์ ์ถ์ํ๋ฅผ ํตํ ๊ตฌํ ๋ฐฉ์์ ๊ฐ์ฒด์งํฅ์ ํน์ง ์ค ํ๋์ธ ๋คํ์ฑ๊ณผ ๊ฐ์ฒด์งํฅ์ ๋ค์ฏ ๊ฐ์ง ์์น ์ค ํ๋์ธ OCP ์์น์ ๊ฐ์ฅ ์ ์คํํด์ฃผ๋ ์ค๊ณ ๋ฐฉ์์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ค์ ๋ก ๋๋ถ๋ถ์ ํ๋ก์ ํธ์์๋ ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด ํด๋์ค ์ฌ์ด์ ๊ด๊ณ๊ฐ 1:1์ ๊ด๊ณ๋ก ๊ตฌ์ฑ๋์ด ์ค์ง์ ์ผ๋ก ์ธํฐํ์ด์ค, ํด๋์ค ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํ ์ด์ ์ ์ ํ ๊ฐ์ ธ๊ฐ์ง ๋ชปํจ์๋ ๋ถ๊ตฌํ๊ณ ๊ด์ต์ ์ผ๋ก ์ด๋ฌํ ์ถ์ ํจํด์ ์ ์ฉํ๊ณ ์์ต๋๋ค.
* OCP (Open Closed Principle)
๊ฐ๋ฐฉ, ํ์ ์์น์ด๋ผ๊ณ ํ๋ฉฐ '์ํํธ์จ์ด ๊ฐ์ฒด(ํด๋์ค, ๋ชจ๋, ํจ์ ๋ฑ)๋ ํ์ฅ์ ๋ํด ์ด๋ ค ์์ด์ผ ํ๊ณ , ์์ ์ ๋ํด์๋ ๋ซํ ์์ด์ผ ํ๋ค.'๋ ํ๋ก๊ทธ๋๋ฐ ์์น์ ๋๋ค.
* ์ ์ถ์ํ๋ฅผ ํตํ ๊ตฌํ ๋ฐฉ์์ ๋จ์
์ฝ๋ ๊ตฌ์กฐ๊ฐ ๋ณต์กํด์ง๊ณ , ๋ณต์กํด์ง ๊ตฌ์กฐ ๋งํผ ์ฝ๋๋ฅผ ๋ถ์ํ๊ณ ํ์ธํ๋ ๊ณผ์ ์์ ์ธํฐํ์ด์ค๋ฅผ ๊ฑฐ์ณ ๊ตฌํ์ฒด๋ค์ ํ์ธํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์๊ธธ ์ ์์ต๋๋ค.
์์๋ฅผ ํตํด ๋ค์ ํ๋ฒ ์ด์ผ๊ธฐํด๋ณด๋ฉด,
public interface MainService {
ResponseEntity<?> doAction();
}
doAction() ๊ธฐ๋ฅ์ ์ ์ํ๋ Service,
@Service
public class MainServiceImplA implements MainService {
@Override
public ResponseEntity<?> doAction() {
System.out.println("do Action A");
}
}
MainService์ doAction ๊ธฐ๋ฅ์ ๊ตฌํํ๋ MainServiceImplA,
@Service
public class MainServiceImplB implements MainService {
@Override
public ResponseEntity<?> doAction() {
System.out.println("do Action B");
}
}
MainService์ doAction ๊ธฐ๋ฅ์ ๊ตฌํํ๋ MainServiceImplB,
doAction() ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ ๊ตฌํ์ฒด MainServiceImplA, MainServiceImplB ๊ฐ ์์ ๋, ์ด ๋ ๊ตฌํ์ฒด๋ ๊ฐ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก doAction() ๋ฉ์๋๋ฅผ ๊ตฌํํฉ๋๋ค. ์ด๋ doAction() ๋ฉ์๋๋ฅผ ์ ์ํ๋ ๊ฒ์ interface ์ธ MainService์ ์ญํ ์ ๋๋ค.
์ด๋ฌํ ๊ตฌ์กฐ๋ก ํ๋ก์ ํธ๋ฅผ ์ค๊ณํ์ ๋, interface์์ ์ ์ํ ๊ธฐ๋ฅ์ ์๋ก์ด ๋ฐฉ์์ผ๋ก ๊ตฌํํด์ผ ํ๋ค๋ฉด ์ฌ์ฉํด์ผํ๋ ๊ณณ์์ ๊ตฌํ์ฒด๋ง ์์ฝ๊ฒ ๋ฐ๊ฟ ์ ์๊ธฐ ๋๋ฌธ์ Service๋ฅผ ์ธํฐํ์ด์ค๋ก ๋ง๋ค๊ณ , ํด๋น ๊ธฐ๋ฅ์ ServiceImpl ๋ผ๋ class๋ก ๊ตฌํํ๋ ๊ฒ์ ๋๋ค.
์ด์ฒ๋ผ Service๋ฅผ interface๋ก ๋ง๋๋ ๋ชฉ์ ์ ํ๋์ ์ญํ ์ ์ฌ๋ฌ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋๋ฐ ์์ต๋๋ค. ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์ ๋ถ๋ฆฌ๋ฅผ ํตํด ๋ ๋ฆฝ์ ์ผ๋ก ๋ณด๋ค ์์ ๋ก์ด ํ์ฅ์ ๋ณด์ฅํ๋ ๊ฒ์ ๋๋ค.
ํ์ง๋ง ์์์ ์ด์ผ๊ธฐํ๋ ๊ฒ์ฒ๋ผ ๋๋ถ๋ถ์ ํ๋ก์ ํธ๋ ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๊ฐ 1:1๋ก ๋ง๋ค์ด์ ธ ์ฌ์ฉ๋๊ณ ์์ต๋๋ค. ์ด๋ฌํ ์ํฉ์์ ์์ผ๋ก๋ ์ด๋ฌํ ๊ด์ต์ ์ธ ์ถ์ํ๋ฅผ ํตํ Service, ServiceImpl ์ค๊ณ ๋ฐฉ์์ ์ ์ฉํด์ผ ํ ๊น์?
์ค์ ๋ก ํจ๊ณผ๋ ๋ณด์ง ๋ชปํ๋ ์ด๋ฌํ ๊ด์ต์ ์ธ ์ถ์ํ๋ฅผ ํตํ ์ค๊ณ๋ฐฉ์์ ๊ณ์ ์ ์ฉํด์ผ ํ ๊น?
๊ฒฐ๊ตญ ์ ํ์ ํ๋ก์ ํธ๋ฅผ ์ค๊ณํ๋ ์ฌ๋์ ๋ชซ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํ์ง๋ง ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ฅผ ๋ถ๋ฆฌํ ์ค๊ณ๋ฅผ ํตํ ์ด์ ๋ค๊ณผ ํด๋น ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ํ์ง ์๋ ์ด์ ์ ๊ทผ๊ฑฐ์ ๋ํด์๋ ์๊ณ ์๊ณ , ๋งํ ์ ์์ด์ผ ํ๋ค๊ณ ๋๊ผ์ต๋๋ค.
(๊ณ์ ์ ์ฉํด์ผ ํ๋ค๋ ์ ์ฅ์์์ ์๊ฒฌ ๋ ๊ฐ์ง)
- ๊ฐ์ฒด์ ๋ํ ์ค๊ณ์ ์ด๋ฅผ ๊ตฌํํ ์ฝ๋๋ ์ธ์ ๋ ์ง ๋ณํ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๋ ์ด๋ฅผ ๋๋นํด์ผ ํฉ๋๋ค.
์ง๊ธ ๋ง๋ค์ด์ ์ฌ์ฉ์ค์ธ ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด ํด๋์ค๊ฐ 1:1 ๊ด๊ณ๋ฅผ ๋งบ๊ณ ์์์ง ๋ชจ๋ฅด์ง๋ง ์๋น์ค๊ฐ ์ปค์ง๊ณ ๋ณํํจ์ ๋ฐ๋ผ์ ์ผ๋ง๋ ์ง ๊ตฌํ์ฒด ํด๋์ค๋ ํ์ฅ๋ ๊ฐ๋ฅ์ฑ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ ํตํด ๋ฏธ๋์ ๋ณํ์ ์ ์ฐํ๊ฒ ๋์ฒํ ์ ์๋๋ก ๋๋นํด์ผ ํฉ๋๋ค. - ์ด๋ฌํ ๊ตฌ์กฐ๋ ํ์
์์ ์ด์ ์ผ๋ก ์์ฉ๋ ์ ์์ต๋๋ค.
ํ๋ก์ ํธ๋ฅผ ์์ํ ๋ ์ค๊ณ์๊ฐ ํ๋ก์ ํธ์ ํฐ ๋ผ๋๋ฅผ ๊ตฌ์ฑํ๊ณ , ๋๋จธ์ง ์์ ์๋ค์ ๊ทธ์ ๋ง๋ ์ค์ ๊ตฌํ์ ํ๊ฒ ๋๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ด๋ ํจ์๋ช , ๋ฆฌํด, ํ๋ผ๋ฏธํฐ ๋ฑ์ ์ค๊ณ์๊ฐ ๋ง๋ค์ด๋์ ์ธํฐํ์ด์ค์ ๋ง์ถฐ ์ฝ๋ฉํ ์ ์์ต๋๋ค. ์ด์ฒ๋ผ ์ธํฐํ์ด์ค๋ฅผ ๋๊ตฐ๊ฐ ์์ฑํ๊ณ ์ค์ ๊ตฌํ์ ๋ค๋ฅธ ์ฌ๋์ด ํ ์ ์๋ ๋ถํ ์ ๊ธฐ๋ฅ๋ ํ์ ์์์ ์ด์ ์ด ๋ ์ ์์ต๋๋ค.
ํจ๊ป ์๋ฉด ์ดํดํ๊ธฐ ์ข์ MVC ํจํด์์ Service Model์ ์ญํ
MVC ํจํด์์ view๋ ์์ ์ด ์์ฒญํ Controller๋ง ์๊ณ ์์ผ๋ฉด ๋๊ณ , Controller๋ ํ๋ฉด์์ ๋์ด์ค๋ ๋งค๊ฐ๋ณ์๋ค์ ์ด์ฉํด Service๊ฐ์ฒด๋ฅผ ํธ์ถํ๋ ์ญํ ์ ํฉ๋๋ค.
Service๋ ๋ถํ์ํ๊ฒ Http ํต์ ์ ์ํ HttpServlet์ ์์๋ฐ์ ํ์ ์๋ ์์ํ ์๋ฐ ๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Service๋ ์ด๋ค ์ปจํธ๋กค๋ฌ๊ฐ ํธ์ถํ๋ ์๊ด์์ด ํ์ํ ๋งค๊ฐ ๋ณ์๋ง ์ค๋ค๋ฉด ์์ ์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค. ์ฆ, ๋ชจ๋ํ๋ฅผ ํตํด ์ด๋์๋ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ ํด๋์ค ํ์ผ์ด๋ผ๋ ๋ป์ ๋๋ค.
(Service์์ request๋ response์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์์๋ ์๋ฉ๋๋ค. request, response๋ฅผ ์ฌ์ฉํด์ผํ๋ ์์ ์ ์ปจํธ๋กค๋ฌ ๋จ์์ ํด์ผ ํฉ๋๋ค.)
์ด๋ ๊ฒ ์ ๋๋ก ๊ตฌํ๋ Service๋ผ๋ฉด ๋จ์ Web ๊ธฐ๋ฐ์ด ์๋๋ผ ์ถํ native app์ผ๋ก view๋จ์ด ๋ณ๊ฒฝ๋๋๋ผ๋ Service๋ view์ ์ข ์์ ์ธ ์ฝ๋๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋๋ก ์ฌ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ถ๊ฐ์ ์ธ ์์ฒญ ์ฌํญ์ด ๋ค์ด์ค๋ฉด ๊ธฐ์กด์ ์์ค๋ฅผ ์์ ํ๋ ๊ฒ ์๋๋ผ ๊ธฐ์กด Service ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๋ค๋ฅธ ํด๋์ค๋ฅผ ํตํด ๊ทธ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ฒ ํ๋ ๊ฒ์ ๋๋ค.
(์์์ ์ด์ผ๊ธฐํ OCP์ ๋ฐ๋ฅธ ๋ณํ์๋ ๋ซํ์๊ณ , ํ์ฅ์๋ ์ด๋ ค์๋ ๊ตฌ์กฐ)