강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

shrkwk5님의 프로필 이미지
shrkwk5

작성한 질문수

이펙티브 자바 완벽 공략 1부

아이템 1. 핵심 정리 - 정적 팩터리 메서드의 장점3, 4, 5

JAR파일 dependency 관련하여 질문드립니다.

작성

·

149

0

선생님 안녕하세요, 이펙티브 자바 강의 수강 중 궁금한 것이 있어 질문드립니다.

 

아래 사진과 같이 chinese-hello-service 프로젝트에 resources파일에 HelloService를 풀패키지 경로까지 적어 등록을 해주셨는데요.

image

 

등록을 해주신 다음에는

image.png

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 기법 소개 같은 자료를 참고하시기 바랍니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

shrkwk5님의 프로필 이미지
shrkwk5

작성한 질문수

질문하기