본문으로 바로가기


 개요


시스템에서 클라이언트의 환경 ( 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 추가 


 의존성을 추가했으면 이후 DeviceResolver를 통해 currentDevice 라는 이름의 Device Class를 전역에서 사용하기 위하여 인터셉터 DeviceResolverHandlerInterceptor 를 DispatcherServlet 에 설정 해줍니다.

 참고로 스프링부트(SpringBoot) 환경일 경우 의존성만 추가하면 자동으로 해당 설정을 해주기 때문에 별도로 추가할 필요가 없습니다. 

1)  spring-servlet.xml 등 XML 설정 파일을 통한 추가
<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