한발열중
700
2014-09-01 10:39:10
10
32191

왜 service 개발시 항상 impl 인터페이스를 만드나요?


안녕하세요.

MVC 패턴에서 Service를 개발할 때

항상 Interface를 생성하고 implements 해서 사용을 하는데

그래야 하는 이유가 있나요?

왜 그렇게 써야만 하는지, 그렇게 안쓰면 생기게 되는 문제는 무엇인지

지식인분들의 답변 부탁드립니다.
2
  • 답변 10

  • nowfly
    139
    2014-09-01 11:18:55
    음.. 일단 MVC 패턴하고는 상관이 없습니다. MVC에서는 Controller에서 Service를 호출하는 방법에 대해서는 상관하지 않는 것이라..

    아무튼.. 제가 생각할 때에 두가지 이유가 있는 것 같습니다.

    첫번째는 OOP에서 interface를 사용하는 이유와 같은 이유로 서비스 부분에 interface를 지정하는 것입니다.
    일반적으로 웹 프로그램에서는 서비스 + DAO까지 하나의 컴포넌트로 외부(Controller)에 제공되기 때문에 인터페이스를 사용하여 대체 가능성 등을 고려하는 것이지요..
    (구체적인 인터페이스의 장점에 대해서는 다음 분께 패스!!)

    두번째는 일반적으로 transaction이나 Exception 처리 등의 AOP 설정이 서비스 경계 부분에 지정되기 때문입니다.

    Spring의 경우도 이 부분의 인터페이스화 되어 있지 않으면 CGLIB같은 class를 변경하는 추가적인 설정과 library가 필요합니다.

    이는 추가 설정이 필요한 측면도 있고, 내부적으로 복잡하게 동작하기 때문인 것 같습니다.

    (물론 CGLIB과 같은 경우는 처리 속도가 더 좋다는 결과도 있습니다.)

  • charlatan
    4k
    2014-09-01 12:05:36
    단답형으로 말하면 loose coupling을 하려는 것이죠.
    사실 꼭 그렇게 해야 하는 법은 없지만 아무튼 자바 프레임워크기반의 개발표준에서는
    거의 기계적으로...
  • clean00007
    1k
    2014-09-01 13:25:26
    지나가다 저도 갑자기 궁금해지네요.
    인터페이스의 필요성이야 구구절절 배우고 듣고 하지만
    실제 웹 개발 하면서 controller, sevice, dao
    형식의 정형화된 개발을 진행하면서...
    loose coupling 이용해야만하는 프로젝트가 있던가요?
    궁금해지네요.
  • 한발열중
    700
    2014-09-01 14:32:52
    Interface의 정의 중에 여러 곳에서 implements 함으로써 얻는 장점들이 많다는걸 알 수 있는데

    프로젝트를 진행하다 보면 서비스 하나당 인터페이스를 하나씩 만들어서 쓰고 있습니다.

    즉 재사용성은 없는데

    왜? 항상 2벌씩 만들어야 하나 의문이 듭니다.

    샘플코드대로 복사해서 사용하곤 있찌만.. 이유가 와닿지 않네요..
  • j a e g e r
    4k
    2014-09-01 14:47:23
    딸기 아빠님 말씀이 정답!

    근데 솔직히 공공 SI에서는 회의적입니다 ㅋㅋㅋㅋㅋㅋㅋ
  • 국어사전
    277
    2014-09-01 17:24:13
    OOP와 AOP를 제대로 갖추기 위해 쓰는건 맞는데
    우리나라 IT 현실에서 이걸 쓰는건 사실 회의적일때가 많네요;;
    어차피 스파게티 소스도 넘쳐나게 섞어 쓰고, 정작 저렇게 구현해놓고선 제대로 쓰질 않으니
    유명무실한 경우가 참 많죠
    이걸 이따위로 쓰려면 왜 이걸 가져왔나...참 한탄스럴때가 있는데 어쩔수 없네요;;
  • 한발열중
    700
    2014-09-01 17:36:48
    점점 답을 찾아가는거 같습니다

    왜쓰는진 알고 쓰는게 맞는거 같아서 질문드렸습니다

    답변 감사합니다
  • tomatogun
    315
    2014-09-01 23:16:06
    service에서 쓰는건
    스프링에서 AOP구현시 사용하는게
    JDK의 기본 프록시인데
    프록시는 Inteface기반으로 동작해서
    그냥 저게 싫음 CGLib로 쓰면됨
    어짜피 스프링도 CGLib는 3버전이후로는 포함되어 있음

    인터페이스 자체의 사용 이유는 그냥 규약이 필요할때 쓰면됨
  • compsoite
    665
    2014-09-12 14:56:33
    코드가 간소화되고 성능이 빨라졌다고 해서 시니어 개발자들이 그걸 표준으로 쓸까요?
    아닙니다. 절대로 안씁니다. 설령 좋게 벤치마크 결과 보여줘도 안합니다.
    그게 편해서 그렇고 그걸 표준으로 잡아서 그렇습니다.
    결론적으로 기술적 문제가 아닌 회의적인 시각으로 옛날 프로그래밍을 유지하려는 관료적 문제입니다.
    제가 여태까지 "왜?" 를 "왜!" 로 경험한 결론이죠.

    CGLIB 성능 빨라진 거 입증됐습니다. 굳이 인터페이스 쓰고 구현체 쓰고 이 고생 안해도 됩니다.
    근데 해야 합니다. 위에서 표준 그렇게 잡아대니까. 여기 개발자가 그래요.
  • compsoite
    665
    2014-09-12 14:57:28
    저는 심지어 제네릭 썼다고 빠구당한 경험까지 했습니다. ㅋㅋ
  • 로그인을 하시면 답변을 등록할 수 있습니다.