TIL

서비스 로더 (service loader)사용하기

Gisungcu 2021. 2. 7. 15:37

서비스 로더

백기선님 study에서 얻은 정보

 

 

 

내가 interface만 알고 있는데 구현체를 알고 싶을 때 사용 가능

 

단 라이브러리에 있어야 한다. jar파일이 있어야 가능

 

 

 

실습을 해보자

 

  1. 구조는 SampleInterFace라는 프로젝트가 있고 여기에는 Hello라는 인터페이스가 있다. 메소드는 hello가 있다.
  2. 다른 프로젝트 SampleController에서 위의 jar파일을 라이브러리로 가지고 있고 Hello의 구현체를 정의했다. 여기에 META-INF 디렉터리와 인터페이스가 있는 경로를 이름으로 가지는 파일을 만들고 그 파일 내용은 구현체의 경로를 적는다.
  3. 다른 프로젝트 SampleService에서 SampleController의 jar파일 라이브러리로 갖고 서비스 로더를 통해 Hello의 구현체를 찾으면 구현체가 나온다.

 

 

1.

SampleInterFace프로젝트

 

2.

SampleController 프로젝트

SampleController 프로젝트에서 SampleInterFace프로젝트의 jar파일을 라이브러리로 가지고 있다.

이 프로젝트에서는 Hello의 구현체를 정의한다.

 

서비스 로더에 이용을 당하려면 여기서 끝이 아니라 

META-INF/services 폴더를 만들고

그 아래에 Hello인터페이스의 FQNC를 이름으로 가지는 파일을 만들고

SampleController 프로젝트의 META-INF

그 안에 내용으로는 구현체의 FQNC를 적어줘야 한다.

 

 

3. 

이제 다른 프로젝트인 SampleService에서 SampleController의 jar파일을 라이브러리로 가지고 서비스 로더를 사용한다.

SampleService 프로젝트

서비스 로더에 interface만 넘겨줬는데 구현체를 찾아서 하나하나 실행시킬 수가 있다. 

 

 

이 서비스 로더는 스프링에서 자신만의 방식으로 쓰인다고 하는데 까먹었다..

또 롬복에서 어노테이션 프로세서를 찾을 때 사용한다. 파일을 뜯어보면 AbstractProcesser를 상속받는 어노테이션 프로세서가 있다.

 

컴파일타임에 @getter나 @setter등 롬복의 어노테이션을 발견하면 서비스로더를 사용해 구현체인 annotation processer를 찾아서 실행시키는 거 같다.  

 

 

 

자바 프로젝트 jar파일 만드는 법

www.hyoyoung.net/100

 

IntelliJ 에서 JAR 만들기

웹 어플리케이션이 아닌, 1회성 심플 자바 어플리케이션이 급히 필요하여 IntelliJ 에서 jar 파일 만들기에 도전해 봤습니다. 우선 샘플로 HelloWorld 프로젝트를 하나 만들었습니다. FIile -> Project Struc

www.hyoyoung.net

 

라이브러리 추가 법 (인텔리제이)
File -> Project Structure... -> Libraries -> '+' 누른 후 찾아서 add 하면 됨