작성
·
149
0
선생님 안녕하세요, 이펙티브 자바 강의 수강 중 궁금한 것이 있어 질문드립니다.
아래 사진과 같이 chinese-hello-service 프로젝트에 resources파일에 HelloService를 풀패키지 경로까지 적어 등록을 해주셨는데요.
등록을 해주신 다음에는
effective-java-part1 프로젝트에서 참조하여 사용한다고 하셨습니다.
제가 궁금한 것은 HelloService를 resources에 굳이 등록을 하지 않아도 chinese-hello-service 프로젝트를 jar로 말아 effective-java-part1에서 참조하면 HelloService를 사용할 수 있다고 생각하는데요. resources에 등록하고 있는 이유가 있을까요?
혹시 제가 놓치고 있는 부분이나 잘못 이해한 내용이 있을까요?
답변 2
0
안녕하세요.
좋은 질문입니다. 일반적으로 말씀하신대로 jar 파일을 만들어서 의존성으로 추가하고 사용할 수 있습니다. 그런데 이 수업에는 ServiceProvider를 왜, 어떻게 사용하는지 설명하느라 보여드린 것입니다. 혹시 질문의 의도가 ServiceProvider를 왜 사용하느냐 또는 사용할 필요가 있느냐? 질문이라면 원하시는 수준의 결합도에 따라 다르다고 답할 수 있겠습니다. 스프링도 내부에서 의존성을 최대한 유연하고 느슨하게 유지하고자 서비스 프로바이더 패턴을 사용하기 때문에 용도와 사용법을 이해하고 계시면 도움이 될거라는 생각에 수업에 넣었습니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
shrkwk5님이 질문하신 내용은 Java 서비스를 개발할 때 META-INF/services
디렉토리에 *서비스 공급자(Provider)*를 등록하는 방식에 관한 것입니다. 이 방식은 Java의 서비스 로더(ServiceLoader) 메커니즘과 관련이 있습니다.
META-INF/services
에 등록하는가?META-INF/services
는 Java의 확장 가능성을 지원하는 표준적인 방식입니다. 여기에는 특정 인터페이스를 구현하는 클래스의 목록을 지정합니다. Java의 ServiceLoader
는 런타임에 이 정보를 읽어서 인터페이스의 인스턴스를 동적으로 생성할 수 있습니다. 이런 방식은 Java가 제공하는 서비스 프로바이더 인터페이스(SPI) 메커니즘의 일부입니다.
만약 HelloService
인터페이스를 여러 프로젝트에서 사용하고, 각각 다른 인사말 서비스를 사용하고 싶다면, 구현체를 META-INF/services
에 등록함으로써 어떤 구현체를 사용할지 런타임에 결정할 수 있습니다. 이 방식은 특히 오픈소스 라이브러리나 플러그인 아키텍처를 지원하는 애플리케이션에서 유용합니다.
관련된 개념들을 더 깊이 이해하고 싶으시다면, Java ServiceLoader 공식 문서 및 SPI 기법 소개 같은 자료를 참고하시기 바랍니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.