[spring boot+ gradle + intelliJ] aop를 이용한 jsp 모바일 뷰 페이지 분기

이번에 회사홈페이지가 반응형 홈페이지에서 pc와 mobile 2개로 나뉘게 되었다.
어떻게 제작을 해야 할지 고민이 되었다.
그러던 중 구글 검색을 통해 발견한 건 spring-movice-device 라이브러리.

스프링 부트 jsp 설정 방법은 아래 블로그에 있으니 참고.

 

[spring boot+ gradle + intelliJ] 스프링 부트 jsp 설정

오늘은 스프링부트 프로젝트에서 jsp 설정을 하는 방법을 알아보자. 스프링 부트 프로젝트 만드는 방법은 아래 블로그에 있으니 참고. [spring boot+ gradle + intelliJ]스프링 부트 initializr 프로젝트 만

letsplaycoding.tistory.com

 

spring-movice-device

 
spring-movice-device 라이브러리는 http request 안에 있는 사용자 브라우저 정보를 읽어오는 방식이다.
isMobile(), isTablet() 등으로 간편하게 장치구별을 할 수 있다.

많은 개발자들이 spring-movice-device를 사용하고 있었다.
하지만 이 모듈에는 생각보다 많은 웹 취약점이 등록되어 있었고 고민을 하던끝에 이 방식이 아닌 Aop방식으로 모바일 분기를 해보기로 했다.
 

스프링 AOP란?

프록시 패턴 기반의 aop 구현체 프록시객체로 접근 제어 및 부가기능을 추가한다.
스프링 ioc과 연동하여 중복코드와 클래스 작성의 번거로움 등에 대한 해결책을 제시한다.
 

build.gradle 설정

	implementation 'org.springframework.boot:spring-boot-starter-aop'

aop 사용을 위해 build.gradle 파일에 aop 라이브러리를 추가해 준다.

dependencies안에 의존성을 추가해 주면 되는데 오른쪽 상단에 코끼리모양의 그래들탭에서 리로드를 실행하면 자동으로 라이브러리가 추가된다.
 

AopWorker 만들기

 @Around("execution(public * com.boot.demo1.controller.*Controller.*(..))")

@Around 어노테이션은 타겟 메서드를 감싸서 특정 advice를 실행한다.
com.boot.demo1.controller 패키지 경로의 controller 객체의 모든 메서드에 aspect를 적용한다.
 
 

final ServletRequestAttributes attribute = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes());
final HttpServletRequest request = Optional.ofNullable(attribute).map(ServletRequestAttributes::getRequest).orElse(null);
String userAgent = request.getHeader("User-Agent").toUpperCase();

http 헤더에서 User-Agent 값을 가져온다.
 
 

agent 값 확인은 브라우저에서 f12를 누르고 개발자도구에 들어가 기기툴바전환을 누르면 간단하게 테스트 해볼수 있다.
 
 

Object proceed = point.proceed();
if(userAgent.contains("ANDROID") || userAgent.contains("TABLET") || userAgent.contains("IPAD") || userAgent.contains("MOBILE") || userAgent.contains("IPHONE")) {
    proceed = "mobile/"+proceed;
}

받아온 에이전트 값에서 모바일 환경인지를 문자열 포함 여부 함수인 contains로 조건을 걸어준다.
ANDROID 이거나 TABLET 이거나 IPAD 이거나 MOBILE 이거나 IPHONE 이거나...
하나라도 문자열이 존재한다면 뷰페이지 앞에 mobile이라는 폴더명을 붙여준다.
 

실전테스트

views폴더 아래에 해당되는 pc와 mobile 뷰 페이지들을 만들어주었다.

일반적으로 접근할 때는 views폴더 바로 아래에 있는 pcandmobile.jsp로 뷰페이지를 반환한다.

하지만 모바일 환경일 경우에는 views/mobile 폴더 아래에 있는 pcandmobile.jsp로 뷰페이지를 반환하게 된다.
실제환경과 코딩은 또 다르니 다른 문제가 있을지는 좀 더 지켜봐야 하겠다.