티스토리 뷰
[서론]
이번 프로젝트 개발 중 모듈 별로 나눠져있는 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); } }
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)
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
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); } }
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 |