개요
시스템에서 클라이언트의 환경 ( Desktop, Mobile, Tablet 등) 을 구분하여 환경별로 별도의 처리를 하거나 다른 화면을 보여줘야 할 때가 있습니다.
이를 위해 보통 클라이언트의 userAgent 등의 정보를 기반으로 프로그램내에서 별도의 처리를 해야하나 ,
Spring ( SpringBoot ) 환경에서는 Spring Mobile Device 모듈을 이용하여 조금 더 간편하게 처리하는 방법을 포스팅합니다.
1. Spring Mobile Device 의존성 추가
먼저 Maven (혹은 gradle) 에 Spring Mobile Device dependency를 추가해줍니다.
<dependency>
<groupId>org.springframework.mobile</groupId>
<artifactId>spring-mobile-device</artifactId>
<version>${org.springframework.mobile-version}</version>
</dependency>
2. DeviceResolverHandlerInterceptor 추가
<interceptors>
<!-- On pre-handle, resolve the device that originated the web request -->
<bean class="org.springframework.mobile.device.DeviceResolverHandlerInterceptor" />
</interceptors>
2) Java 기반 컨테이너를 통한 설정
@Bean
public DeviceResolverHandlerInterceptor deviceResolverHandlerInterceptor() {
return new DeviceResolverHandlerInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(deviceResolverHandlerInterceptor());
}
3. Device 오브젝트 사용
설정을 마쳤으면 servletRequest 를 이용하여 디바이스 정보를 가진 참조객체를 생성하여 사용하시면 됩니다.
@RequestMapping("/")
public void deviceCheck(HttpServletRequest request, HttpServletResponse response) {
Device device = DeviceUtils.getCurrentDevice(request);
if (device.isMobile()) {
logger.info("Hello mobile user!");
} else if (device.isTablet()) {
logger.info("Hello tablet user!");
} else {
logger.info("Hello desktop user!");
}
}
4. Controller argument inject
만약 @Controller 클래스내 메서드에서 Device 클래스를 인자로 주입받아 사용하고 싶다면 DeviceWebArgumentResolver 에 대한 설정을 추가해 주시면 됩니다.
SpringBoot에서는 DeviceWebArgumentResolver 에 대한 설정 역시 의존성을 주입받는 순간 자동으로 해주기 때문에 따로 추가해 줄 필요가 없습니다! ( 갓부트 -_-bb )
1) XML 설정 파일을 통한 추가
<annotation-driven>
<argument-resolvers>
<bean class="org.springframework.mobile.device.DeviceWebArgumentResolver" />
</argument-resolvers>
</annotation-driven>
2) Java 기반 컨테이너를 통한 설정
@Bean
public DeviceHandlerMethodArgumentResolver deviceHandlerMethodArgumentResolver() {
return new DeviceHandlerMethodArgumentResolver();
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(deviceHandlerMethodArgumentResolver());
}
>> Controller 내 메서드에서 Device 주입 받아 argument 로 사용
@RequestMapping("/")
public void deviceCheck(Device device) {
if (device.isMobile()) {
logger.info("Hello mobile user!");
} else if (device.isTablet()) {
logger.info("Hello tablet user!");
} else {
logger.info("Hello desktop user!");
}
}
Reference
https://docs.spring.io/spring-mobile/docs/current/reference/html/device.html
'Program > Spring' 카테고리의 다른 글
[Spring] @Cacheable 동일 클래스 내부 메서드 호출시 미동작 원인 및 해결 (1) | 2019.12.03 |
---|---|
[Spring] Redirect 관련 내용 ( RedirectAttributes / FlashMap ) (0) | 2016.11.16 |