이전 방송/신문업계 그룹의 IT회사에서 인턴으로 있으면서 웹 프로그래밍을 처음 접했고, 그때 좋은 개발 습관들을 꽤 많이 배웠다. 그런데 몇몇은 그냥 이유도 모르고 관행?같은거에 따르면서 프로그래밍을 했는데 참 바보같은 행동이었구나 싶었다. 모르면 찾아라도 보던가..
그리고 이러한 잘못된 습관을 깨닫게 된 계기는 바로 카카오면접에서 개소리로 대답한 경험이 있기 때문이다.ㅋㅋㅋ
그때 질문을 대충 떠올려보면
"프로젝트보니깐 Service에 대해서 모두 인터페이스를 만들고 이에 대해 ServiceImpl을 구현했던데, 이렇게 만든 이유가 있나요?"
였고 매우 당황한 나는
"다른분들의 코드를 참고했는데 선배 개발자분들께서 그렇게 만들길래 따랐습니다. 대신 자바에서 인터페이스를 쓰는 이유는 ~ 라고 알고있습니다. 그러한 이유때문에 쓰는 것 같습니다."
라는 개소리를 했다. 인터페이스 기능만 말할것이지 저 앞의 말을 왜 했는지 모르겠다. 아직도 저렇게 답했던 내 자신을 생각할 때마다 이불킥을한다.
그래서 이에 대해 좀 정리하고자 한다.
Interface는 객체의 사용 방법을 정의한 타입이다. 객체의 교환성을 높여주기 때문에 다형성을 구현하는 매우 중요한 역할을 한다. 즉, 개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있도록 해준다.
인터페이스 타입에 어떤 구현 객체를 대입하는지에 따라 실행결과가 달라지도록 만드는 기술이므로 기존 구현 객체(ServiceImpl1)와 비즈니스 로직이 다른 기능을 추가해야할 경우 다른 구현 객체(ServiceImpl2)를 만들어 사용하면 된다. 따라서 유지보수 측면에서 매우 좋다.
그리고 객체지향 프로그래밍에서는 클래스를 작게 나누어 다른 클래스와 의존관계를 낮추는것이 중요하다. 즉, 결합도를 낮추는것인데 이 또한 유지보수가 쉽다는 장점을 갖는다.
AOP와 트랜잭션은 서비스 인터페이스에서 처리한다.
스프링에서 AOP를 구현할 때 JDK의 기본 프록시를 사용하는데, 이 프록시는 인터페이스 기반으로 동작하기 때문에 Service인터페이스를 만들어 사용한다.
사실 Spring의 AOP 개념이 아직도 어렵게 느껴진다. 그래서 이에 대한 설명은 AOP공부를 하고 다시 수정할 예정이다.
안녕하세요 궁금한게있어 구글링하다가 이 게시글을보고 다른 포스트들도 봤는데 정리가 잘되어있어서 도움많이됐습니다! 혹시 기본 개념공부하실때 어떤식으로 공부하셨는지 알수있을까요??