웹사이트 검색

Google Guce 종속성 주입 예제 자습서


Google Guice는 애플리케이션에서 종속성 주입을 자동화하는 프레임워크입니다. 여기를 직접 방문했다면 기존의 개체 생성 접근 방식의 문제점과 종속성 주입의 구현 이점을 배운 종속성 주입 예제를 확인하는 것이 좋습니다. 지난 튜토리얼에서 우리는 애플리케이션에서 수동으로 종속성 주입을 구현하는 방법을 배웠습니다. 그러나 애플리케이션에서 클래스 수가 증가하면 이 작업을 자동화할 일부 프레임워크를 찾는 것이 좋습니다. Google Guice는 종속성 주입의 자동 구현을 제공하는 것이 주요 작업인 주요 프레임워크 중 하나입니다. 지난 게시물과 동일한 예제에서 작업하고 Google Guice를 사용하여 종속성 주입을 위한 구현 프로세스를 자동화하는 방법을 알아봅니다. Google Guice 종속성은 Maven Central에서 사용할 수 있으므로 Maven 프로젝트의 경우 종속성을 아래에 추가할 수 있습니다.

<dependency>
	<groupId>com.google.inject</groupId>
	<artifactId>guice</artifactId>
	<version>3.0</version>
</dependency>

서비스 등급

package com.journaldev.di.services;

public interface MessageService {

	boolean sendMessage(String msg, String receipient);
}

MessageService 인터페이스는 서비스에 대한 기본 계약을 제공합니다.

package com.journaldev.di.services;

import javax.inject.Singleton;

//import com.google.inject.Singleton;

@Singleton
public class EmailService implements MessageService {

	public boolean sendMessage(String msg, String receipient) {
		//some fancy code to send email
		System.out.println("Email Message sent to "+receipient+" with message="+msg);
		return true;
	}

}

EmailServiceMessageService 구현 중 하나입니다. 클래스에 @Singleton 주석이 추가되어 있음에 유의하십시오. 서비스 개체는 인젝터 클래스를 통해 생성되므로 서비스 클래스가 싱글톤 개체여야 함을 알리기 위해 이 주석이 제공됩니다. Google Guice 3.0은 JSR-330에 대한 지원을 추가했으며 com.google.inject 또는 javax.inject 패키지의 주석을 사용할 수 있습니다. Facebook 메시지를 보내는 또 다른 서비스 구현이 있다고 가정해 보겠습니다.

package com.journaldev.di.services;

import javax.inject.Singleton;

//import com.google.inject.Singleton;

@Singleton
public class FacebookService implements MessageService {

	public boolean sendMessage(String msg, String receipient) {
		//some complex code to send Facebook message
		System.out.println("Message sent to Facebook user "+receipient+" with message="+msg);
		return true;
	}

}

소비자 클래스

애플리케이션에서 종속성 주입을 구현하고 있으므로 애플리케이션에서 서비스 클래스를 초기화하지 않습니다. Google Guice는 세터 기반생성자 기반 종속성 주입을 모두 지원합니다. 서비스를 사용하는 애플리케이션 클래스는 다음과 같습니다.

package com.journaldev.di.consumer;

import javax.inject.Inject;

//import com.google.inject.Inject;
import com.journaldev.di.services.MessageService;

public class MyApplication {

	private MessageService service;
	
//	constructor based injector
//	@Inject
//	public MyApplication(MessageService svc){
//		this.service=svc;
//	}
	
	//setter method injector
	@Inject
	public void setService(MessageService svc){
		this.service=svc;
	}
	
	public boolean sendMessage(String msg, String rec){
		//some business logic here
		return service.sendMessage(msg, rec);
	}
}

생성자 기반 주입에 대한 코드에 주석을 달았음을 주목하십시오. 이는 애플리케이션이 서비스 클래스 객체가 필요하지 않은 다른 기능도 제공할 때 유용합니다. 또한 Java 주석 자습서를 확인하십시오.

바인딩 서비스 구현

분명히 google guice는 사용할 서비스를 알지 못하므로 AbstractModule 추상 클래스를 확장하여 구성하고 configure() 메서드에 대한 구현을 제공해야 합니다.

package com.journaldev.di.injector;

import com.google.inject.AbstractModule;
import com.journaldev.di.services.EmailService;
import com.journaldev.di.services.FacebookService;
import com.journaldev.di.services.MessageService;

public class AppInjector extends AbstractModule {

	@Override
	protected void configure() {
		//bind the service to implementation class
		//bind(MessageService.class).to(EmailService.class);
		
		//bind MessageService to Facebook Message implementation
		bind(MessageService.class).to(FacebookService.class);
		
	}

}

보시다시피 구현을 서비스 클래스에 바인딩할 수 있습니다. 예를 들어 EmailService로 변경하려는 경우 바인딩만 변경하면 됩니다.

클라이언트 애플리케이션

설정이 준비되었습니다. 간단한 자바 클래스와 함께 사용하는 방법을 살펴보겠습니다.

package com.journaldev.di.test;

import com.google.inject.Guice;
import com.google.inject.Injector;

import com.journaldev.di.consumer.MyApplication;
import com.journaldev.di.injector.AppInjector;

public class ClientApplication {

	public static void main(String[] args) {
		Injector injector = Guice.createInjector(new AppInjector());		
		
		MyApplication app = injector.getInstance(MyApplication.class);
		
		app.sendMessage("Hi Pankaj", "pankaj@abc.com");
	}

}

구현은 매우 이해하기 쉽습니다. 인젝터 클래스 구현 객체를 전달하는 Guice 클래스 createInjector() 메서드를 사용하여 Injector 객체를 생성해야 합니다. 그런 다음 인젝터를 사용하여 소비자 클래스를 초기화합니다. 위의 클래스를 실행하면 다음과 같은 출력이 생성됩니다.

Message sent to Facebook user pankaj@abc.com with message=Hi Pankaj

AppInjector 클래스에서 EmailService에 대한 바인딩을 변경하면 다음 출력이 생성됩니다.

Email Message sent to pankaj@abc.com with message=Hi Pankaj

JUnit 테스트 케이스

MyApplication 클래스를 테스트하고 싶기 때문에 실제 서비스 구현을 생성할 필요는 없습니다. 아래와 같은 간단한 Mock 서비스 구현 클래스를 가질 수 있습니다.

package com.journaldev.di.services;

public class MockMessageService implements MessageService{

	public boolean sendMessage(String msg, String receipient) {
		return true;
	}

}

내 JUnit 4 테스트 클래스는 다음과 같습니다.

package com.journaldev.di.test;


import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.journaldev.di.consumer.MyApplication;
import com.journaldev.di.services.MessageService;
import com.journaldev.di.services.MockMessageService;

public class MyApplicationTest {

	private Injector injector;
	
	@Before
	public void setUp() throws Exception {
		injector = Guice.createInjector(new AbstractModule() {
			
			@Override
			protected void configure() {
				bind(MessageService.class).to(MockMessageService.class);
			}
		});
	}

	@After
	public void tearDown() throws Exception {
		injector = null;
	}

	@Test
	public void test() {
		MyApplication appTest = injector.getInstance(MyApplication.class);
		Assert.assertEquals(true, appTest.sendMessage("Hi Pankaj", "pankaj@abc.com"));;
	}

}

MockMessageService 클래스를 AbstractModule의 익명 클래스 구현을 통해 MessageService에 바인딩하고 있음을 주목하십시오. 이것은 테스트 메서드 전에 실행되는 setUp() 메서드에서 수행됩니다.

Google Guice 프로젝트 다운로드

이것이 Google Guice 예제 튜토리얼의 전부입니다. 애플리케이션에서 종속성 주입을 구현하기 위해 Google Guice를 사용하는 것은 매우 쉽고 훌륭하게 수행됩니다. Google API에서 사용되므로 고도로 테스트되고 안정적인 코드라고 가정할 수 있습니다. 위에서 프로젝트를 다운로드하고 가지고 놀면서 자세히 알아보세요.