해결된 질문
작성
·
237
답변 3
1
좋은 질문해주셔서 감사합니다.
스프링의 스테레오 타입 애노테이션이 붙은 빈 클래스들은 계층형 아키텍처를 구성하는 컴포넌트들이죠. 서비스 빈은 서비스 계층 혹은 비즈니스 로직 계층의 전면에서 계층이 제공하는 서비스를 노출하는 일종의 API입니다.
계층간 결합도를 낮추고, 유지보수성과 확장성을 높이고, 테스트용이성을 극대화하고, 관심사의 분리를 명확하게 하기 위한 캡슐화를 한다면 계층형 아키텍처에서 상위 계층으로 노출되는 건, 제한된 API를 가진 인터페이스를 사용해야 하는 것이 바람직합니다.
서비스 계층 내부에서 프라이빗하게 사용되는 빈이라면 굳이 인터페이스를 쓰지 않을 수도 있겠지만, 프레젠테이션 계층으로 노출되는 서비스 빈이라면 인터페이스를 정의하는 게 자연스럽습니다.
프레젠테이션 계층을 고립해서 테스트 하려고 한다면 서비스 계층에 대한 연결을 목이나 스텁 같은 테스트 대역으로 만들어야겠죠. 그 경우만 고려하더라도 서비스 인터페이스의 구현은 하나 이상이 될 겁니다. 물론 그것도 목 프레임워크 등에서 지원하는 클래스를 목으로 만드는 방식을 쓸 수는 있으나, 근본적으로 자바 언어가 지원하는 방식을 넘어서는 제약사항이 있는 부자연스러운 방식입니다.
인터페이스 분리 원칙을 따라서 인터페이스를 사용 의도에 맞춰서 구분해두는 것이 좋습니다. 그런데 처음부터 인터페이스별로 구현 클래스를 다 만들어둘 필요는 굳이 없습니다. 그래서 하나의 서비스 빈이 여러개의 인터페이스를 구현할 수 있습니다. 그러다 코드가 성장하고 복잡해지면 적절한 분리를 할 수도 있죠.
시스템이 성장하면서 계속 발전하게 될 비즈니스 로직을 담당하는 서비스 계층이 그런 주요한 대상입니다. 이렇게 인터페이스를 두고 이를 구현하는 방식으로 서비스 계층을 작성하면 구현 부분이 캡슐화 되고, 리팩터링을 하게 되더라도 이를 사용하는 쪽에 노출되는 서비스 API는 변함없이 유지될 수 있습니다. 의도를 담은 인터페이스로 설계가 유지된다면 말이죠.
예전엔 인터페이스를 안 쓰려는 이유중 하나가 메소드를 추가하거나 변경할 때 양쪽(인터페이스, 클래스)을 다 고치는게 귀찮아서라는 것이었는데, 요즘은 IDE가 너무 좋아서 그런 건 그냥 한방에 다 되더라고요.
@Transactional과 같은 AOP도 일종의 인터페이스 구현으로 만들어집니다. 그것만 해도 구현이 하나라고 볼 수 없죠. 물론 요즘은 성능과 편의성 때문에 cglib 같은 상속을 이용한 프록시 방식을 주로 쓰지만, 그것도 결국 상위 클래스를 인터페이스로 강제하는 방식이라고 볼 수 있죠.
인터페이스를 클래스와 1:1로 기계적으로 만드는 대신, 상위 계층에 노출하는 API라는 관점에서 어떻게 효과적으로 활용할 수 있을지 생각해보면서 만들면 여러가지 장점을 많이 발견하실 수 있을 겁니다.
0
답변 감사합니다 토비님
작성해주신 답변을 읽어보니 제가 인터페이스의 사용 관점이 많이 협소했음을 느낍니다.
설명해주신 '메소드를 추가하거나 변경할 때 양쪽(인터페이스, 클래스)을 다 고치는게 귀찮아서' 딱 이관점으로 인터페이스를 사용해 왔던것 같습니다.
답변을 읽던중 한가지 더 궁금한것이 생겼습니다. 설계에 관련된 것인데요.
프로젝트 초기에 사용자의 요구사항을 잘 분석하여 인터페이스를 잘 설계하고 작업을 시작했는데, 사용자의 요구사항이 인터페이스를 수정해야할 정도로 변경이 일어난다면 토비님께서는 보통 어떤식으로 이러한 문제를 해결하시는지 궁금합니다.!
0
안녕하세요, 인프런 AI 인턴입니다.
이초다님께서 질문하신 인터페이스의 사용 이유에 대한 부분은 많은 개발자들이 궁금해 하는 주제입니다. 일반적으로 인터페이스를 사용하는 이유는 코드의 확장성과 유연성을 높이기 위해서입니다. 인터페이스를 사용함으로써 구현체에 대한 구체적인 정보를 몰라도 되고, 이를 통해 응집도를 높이고 결합도를 낮출 수 있습니다.
이와 관련하여 이미 토비님의 강의 및 토론에서 다룬 유사한 질문과 답변이 있어 추천해 드립니다. 더불어, 해당 내용을 통해 질문하신 주제에 대한 심층적인 이해를 도모할 수 있을 것입니다.
이 기회를 통해 인터페이스가 왜 중요한지, 그리고 무조건 사용해야 하는 이유에 대해 더 깊이 이해할 수 있으리라 생각합니다. 추가로 궁금한 점이나 명확히 이해 안 되는 부분이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
요구사항이 변경되면 설계가 변경될 수 밖에 없죠. 이 경우 인터페이스가 추가되거나, 수정될 수 있습니다. 이건 소프트웨어 개발에서 본질적으로 일어날 수 밖에 없는 일이니 그에 맞게 변경을 하면 됩니다.
다만 변경에 직접 영향을 받지 않는 기능이 새로운 설계 변경에 따라서 문제가 생기지 않는지, 혹은 불필요한 변경이 따라오지는 않는지를 보면서 설계를 개선할 필요도 있겠죠.
그래서 무엇보다 중요한 건, 인터페이스를 기준으로 테스트를 잘 작성하는 것입니다.