티스토리 뷰

Java

구글 주스 사용기[1]

Jodu 2017. 8. 27. 11:29
반응형

[서론]

이번 프로젝트 개발 중 모듈 별로 나눠져있는 API(Application Programming Interface)에 사용자의 접근을 권한별로 처리 해달라는 요구사항을 받았다. 처음에는 스프링 시큐리티를 사용하여 API에 보안을 적용하려고 하였지만 모듈 별로 스프링 시큐리티의 설정을 하면서 개발 하기에는 비효율적이라고 판단하였다. 그래서 나는 기존 스프링 설정에 구애를 받지 않고 단일 모듈로 동작 할 수 있는 필터를 만들어서 배포하고자 하였다. 이 때 의존 주입을 구글 주스를 사용하여 스프링으로 만들어져 있는 API의 설정과 혼동되지 않도록 하였다. 이번 포스팅에서는 먼저 간단하게 구글 주스를 사용하는 방법에 대해서 설명한다.


[구글 주스란?]

구글 주스는 스프링이 해주는 역할 중에 하나인 의존성 주입을 해주는 프레임 워크이다. 


[구글 주스 사용법]

구글 주스를 사용하기 위해서는 AbstractModule를 구현한 설정 클래스를 만들어서 주입하고자 하는 클래스의 정보를 등록해주어야 한다. AbstractModuel 클래스를 상속하면 config라는 메소드를 오버라이드 하게 되는데 이 config메소드에서 bind메소드를 사용하여 의존성 주입을 받아야 하는 클래스를 등록하게 된다. 
정확한 설명은 아래의 소스파일을 보고 확인한다. 


 
package com.jodu.guice.usemethod.config;

import com.google.inject.AbstractModule;
import com.jodu.guice.usemethod.service.OrderService;
import com.jodu.guice.usemethod.service.impl.PizzaOrderService;

public class InjectConfig extends AbstractModule {

	@Override
	protected void configure() {
		bind(OrderService.class).to(PizzaOrderService.class);
	}

}


위 소스에서는 OrderService라는 인터페이스에 PizzaOrderService를 bind 하도록 하고 있다. 


이렇게 bind된 element들을 사용하기 위해서는 아래와 같이 @iject라는 어노테이션을 사용하여 주입되도록 하기만 하면 된다. 

 
package com.jodu.guice.usemethod.app;

import javax.inject.Inject;

import com.jodu.guice.usemethod.service.OrderService;

public class UserApplication {
	@Inject private OrderService os;
	
	public void use() {
		int totalPrice = os.order(10);
		System.out.println(os.getClass().getName() + ", price : " + totalPrice);
	}
}

이제 UserApplication을 사용하여 OderService에 의존성 주입이 성공적으로 되었는지 확인 해보도록 하겠다. 


 
package com.jodu.guice.usemethod;

import com.jodu.guice.usemethod.app.UserApplication;

public class UserMethodMain {
	
	public static void main(String[] args) {
		UserApplication ua = new UserApplication();
		ua.use();
	}
}
-- 결과
Exception in thread "main" java.lang.NullPointerException
	at com.jodu.guice.usemethod.app.UserApplication.use(UserApplication.java:11)
	at com.jodu.guice.usemethod.UserMethodMain.main(UserMethodMain.java:16)

분명 @Inject를 사용하여 UserApplication이 OderService의 instance를 주입받도록 하였는데 널포인트 익셉션이 발생한다. 그 이유는 UserApplication의 instance를 직접 생성하였기 때문이다. 
구글 주스를 사용하여 의존성 주입과 관련된 클래스의 인스턴스를 만들 때는 구글 주스에게 인스턴스 생성을 부탁하여야 설정했던 의존성이 제대로 주입된 상태의 클래스의 인스턴스를 만들어 준다.


 
package com.jodu.guice.usemethod;

import com.google.inject.Guice;
import com.google.inject.Injector;
import com.jodu.guice.usemethod.app.UserApplication;
import com.jodu.guice.usemethod.config.InjectConfig;

public class UserMethodMain {
	
	public static void main(String[] args) {
		Injector ij = Guice.createInjector(new InjectConfig());
		UserApplication ua = ij.getInstance(UserApplication.class);
		
		ua.use();
		/** We must not use under case*/
//		UserApplication ua = new UserApplication();
//		ua.use();
	}
}
-- 결과 
com.jodu.guice.usemethod.service.impl.PizzaOrderService, price : 10000

우리가 Inject 설정에서 설정한대로 PizzaOrderService의 의존성이 주입되어 동작하는 것을 확인 할 수 있다.

그렇다면 만약 OrderService를 구현하는 두개의 클래스의 의존성을 주입하고 싶다면 어떻게 할까?? 스프링에서는 @Qulifier라는 어노테이션을 사용하여 구분을 하게 된다. 구글 주스에서도 @Named이라는 어노테이션을 사용하여 구분을 할 수 있지만 AbstractModule구현체에서 추가적인 설정이 필요하다. 


 
package com.jodu.guice.usemethod.config;

import com.google.inject.AbstractModule;
import com.google.inject.name.Names;
import com.jodu.guice.usemethod.service.OrderService;
import com.jodu.guice.usemethod.service.impl.CoffieOrderService;
import com.jodu.guice.usemethod.service.impl.PizzaOrderService;

public class InjectConfig extends AbstractModule {

	@Override
	protected void configure() {
		bind(OrderService.class).annotatedWith(Names.named("pizza")).to(PizzaOrderService.class);
		bind(OrderService.class).annotatedWith(Names.named("coffie")).to(CoffieOrderService.class);
	}

}

설정을 보게 되면 annotatedWith메소드에 Names의 named메소드에서 스트링으로 pizza와 coffie를 설정해주었다. 이렇게 설정된 이름이 의존 주입시 구분하여 사용할 이름표 같은 역할을 하게 된다. 
그럼 UserApplication을 수정하여 결과를 확인하자. 


 
package com.jodu.guice.usemethod.app;

import javax.inject.Inject;
import javax.inject.Named;

import com.jodu.guice.usemethod.service.OrderService;

public class UserApplication {
	@Inject @Named("pizza") private OrderService pOs;
	@Inject @Named("coffie") private OrderService cOs;
	
	public void use() {
		int totalPrice = pOs.order(10);
		int coffiePrice = cOs.order(10);
		System.out.print(pOs.getClass().getName() + ", price : " + totalPrice + "  ");
		System.out.println(cOs.getClass().getName() + ", price : " + coffiePrice);
	}
}
-- 결과
com.jodu.guice.usemethod.service.impl.PizzaOrderService, price : 10000  com.jodu.guice.usemethod.service.impl.CoffieOrderService, price : 1000


결과를 보게 되면 정상적으로 동작하는 것을 볼 수 있다. 


[결론]

지금까지 구글 주스를 사용하여 의존성을 주입하는 법을 알아 보았다. 간단한 설정으로 의존성을 주입할 수 있는 것은 편리한거 같다. 


반응형

'Java' 카테고리의 다른 글

MapStruct란?  (0) 2021.08.01
HttpServletRequest의 getInputStream 사용시 주의 사항  (0) 2019.03.28
FFMPEG Wrapper Library 사용법  (4) 2018.05.04
구글 주스와 MyBatis의 연동  (0) 2017.09.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함