# WebSquare5 연동하기


프로젝트에서 UI/UX 툴로 WebSquare5를 사용하게 되었다. 서버 사이드와 데이터 통신을 하기 위해

서버 사이드에 웹스퀘어 연동 모듈을 구현해 주어야 했다.  잘 확장하면 웹스퀘어 외에 다른 UI/UX 툴도 연동 시 활용할 수 있을 것 같다.

잘 정리해두어 다음 번에 또 참고해야지 ㅎㅎ


우선 websquare에서는 데이터 통신 객체로 'submission'이란 것을 사용하는데, 여기에 사용 가능 한 데이터는 XML, JSON, Plain Text, Request Parameter(K,V) 등이 있다. 요새는 JSON을 가장 많이 권장한다는데 왜 JSON이 가장 권장될까?  



1)  JSON vs XML 비교

    

     - XML과 JSON은 모두 구조화된 문서를 전송가능 하게 만드는 텍스트 포맷이다. 

     - XML과 JSON은 특정한 의미를 가진 데이터를 담는 포멧을 정의한다.


     [XML]

       - 텍스트로만 정보가 이루어져 어느 환경에서건 구애받지 않고 사용 가능한 포맷

       - 기존 SGML의 복잡성을 줄이고, HTML의 편의성을 지닌 XML은 강력한 통신수단으로 자주 사용된다

       - 태그 구조로 가독성이 좋다. 작성도 간편


     [JSON]

       - JSON 역시 텍스트 형식의 데이터 포맷을 의미하는데, XML 의 단점을 보완하여 나왔다.

       - 함축적인 내용으로 최소의 정보만 내포

       - XML 대비 용량이 적고, 속도가 빨라짐

       - 객체 구조와 배열의 구조를 모두 사용가능하여 효율적인 데이터 구성이 가능하다 

       - 파싱이 간편하고 빠름

       - JSON은 자바스크립트로 작성됐다. 본래 자바스크립트와의 손쉬운 상호운용성을 위해 자바스크립트에서 사용하는 문법을 그 자체의

          데이터 형식으로 뽑아내도록 정의됐다.

        - XML은 적절하게 파싱(Parsing)을 거쳐도 BL(Billion Laughs) 공격 또는 EE(External Entity) 공격 같은 보안 취약성을 일부 갖고 있다. XML은 이런 

          기능을 실수로 활성화하면 시스템이 상당한 위험에 처하게 되지만 JSON은 그렇지 않다. JSON을 이용해 이런 위험에 노출되는 툴을 개발하기는 

          어렵다. 반면 XML을 사용할 때는 반드시 개발자가 능동적으로 확인하고 피해야 한다



XML보다 간결하고 파싱 속도가 빠르다는 장점이 대부분인데, 실제로 몇십만 건, 몇백만건의 데이터로 테스트를 해봐야 

정확히 XML보다 얼마나 빠른지, 경량화된건지 알 수 있을 것 같다. 

우선 깊은 테스트는 뒤로 하고 ㅎㅎ  웹스퀘어 연동으로 다시 돌아가면 



2) WebSquare5 통신방식


 웹스퀘어와의 통신은 아래와 같이 이루어진다. 



  - 웹스퀘어에서 통신객체 Submission에 XML 또는 JSON 데이터를 담아 서버로 전송하면

  - 서버 사이드의 어댑터에서 이를 Java Object (Collection 객체 Map/ List, VO) 로 변환한다. 

  - 서버 사이드에서는 화면으로 리턴할 Java Object를 다시 어댑터를 통해 XML/JSON으로 변환하여 전달한다.


  - 간단하게 설명하면 위와 같은 프로세스를 거쳐 통신하게 되는 것! ㅎㅎ 

  - 주고 받는 데이터 포맷에 대해 자세히 살펴보면 아래와 같다.




3) 연동 방법


    - 위와 같은 프로세스로 이루어지는 연동을 실제로 하는 방법은 여러가지가 있을 수 있겠지만 

      이번엔 아래와 같이 연동했다.


   (1) websqaure 라이브러리 설정


       - pom.xml 에 (Maven 프로젝트임) websquare 라이브러리 설정

       - websquare 라이브러리 설정 이외에도 websquare가 사용하는 몇몇 라이브러리들을 별도로 설정해줘야 했다..(엑셀 관련 등..)

       - 참고로, WebSquare은 상용 툴이기 때문에 라이센스를 별도로 구매해야 한다. 이와 관련된 중요 정보는 본 포스팅에서 언급하지 않을게용



<!-- Websquare5 & Websquare5 & websquare chart 관련 라이브러리 -->

<dependency>

   <groupId>websquare</groupId>

   <artifactId>websquare5</artifactId>

   <version></version>

</dependency>

<dependency>

   <groupId>websquare</groupId>

   <artifactId>websquare5_adapter</artifactId>

   <version></version>

</dependency>

<dependency>

   <groupId>websquare</groupId>

   <artifactId>websquare5_hybrid</artifactId>

   <version></version>

</dependency>

<dependency>

   <groupId>websquare</groupId>

   <artifactId>websquare5_common</artifactId>

   <version></version>

</dependency>



(2) web.xml : servlet-mapping 설정


     - wq 확장자에 대한 요청을 처리할 servlet-mapping을 추가 

  

<!-- 4.servlet 선언 및 매핑: -->

<servlet>

<servlet-name>websquareDispatcher</servlet-name>

<servlet-class>websquare.http.DefaultRequestDispatcher</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>websquareDispatcher</servlet-name>

<url-pattern>*.wq</url-pattern>

</servlet-mapping> 



(3) dispatcher-servlet.xml : 웹스퀘어 view 및 resolver 선언

     - custom resolver 선언

     - 웹스퀘어 view 등록


<bean class="com.sample.project.ria.wsq5.CustomRequestMappingHandlerAdapter">

   <property name="customArgumentResolvers">

<list>

  <bean class="com.sample.project.ria.wsq5.CustomWqArgumentResolver" />

</list>

   </property>

</bean>


<!-- WebSquare View 등록 -->

<bean name="wqView" class="com.sample.project.ria.wsq5.WqAdapterView" /> 



(4) 각 클래스의 역할


  4.1 CutsomRequestMappingHandlerAdapter

       - RequestMappingHandlerAdapter 확장 

'UX' 카테고리의 다른 글

AJAX 통신 기초  (0) 2017.02.26
jQuery 기초  (0) 2017.02.26
Javascript 기초2  (0) 2017.02.26
Javascript 기초  (0) 2017.02.26
[Error] maven 프로젝트 checkout 후 JSP 파일 에러  (0) 2017.01.29

[에러] no matching editors or conversion strategy found


1. 환경                                                         

                         

 Spring 

 4.3.6 (SpringMVC 기준)

 Java 

 1.8.0_92

 Tomcat 

 8.0.42

 암호화 관련 라이브러리

 jasypt-spring31-1.9.2.jar

 jasypt-1.9.2.jar

 bcprov-jdk15on-1.56.jar

 bcpkix-jdk15on-1.56.jar

            


2. 에러 메세지


 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'configurationEncryptor' defined in file [C:\sample\server\apache-tomcat-8.0.42\webapps\sample-pjt\WEB-INF\classes\META-INF\config\context-datasource-dev.xml]: Cannot resolve reference to bean 'environmentVariablesConfiguration' while setting bean property 'config'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'environmentVariablesConfiguration' defined in file [C:\Sample\server\apache-tomcat-8.0.42\webapps\sample-pjt\WEB-INF\classes\META-INF\config\context-datasource-dev.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'java.lang.String' to required type 'java.security.Provider' for property 'provider'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'java.security.Provider' for property 'provider': no matching editors or conversion strategy found



3.  AS-IS 설정/소스

 

    - database 관련 설정파일 context-datasource.xml 파일 내 프로퍼티 파일 암호화 환경 설정

   

   <!-- 암호화  provider 선언 -->

    <bean id="bouncyCastleProvider" class="org.bouncycastle.jce.provider.BouncyCastleProvider"/>

    <!-- 암호화  환경 설정 -->

    <bean id="environmentVariablesConfiguration"

        class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">

        <property name="provider" value="bouncyCastleProvider" />

        <property name="algorithm" value="PBEWITHSHA256AND128BITAES-CBC-BC" />

        <property name="passwordEnvName" value="APP_ENCRYPTION_PASSWORD" />

    </bean>

    <!-- 암호화 실행 모듈 선언 -->

    <bean id="configurationEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">

        <property name="config" ref="environmentVariablesConfiguration" />

        <property name="password" value="easyframework" />

    </bean> 



4. 에러 원인


    - environmentVariablesConfiguration bean에서는 bouncyCastleProvider 라는 bean을 참조로 하여 암호화 환경을 설정하고 있는데,

       이때, provider 속성에 해당하는 참조 bean bouncyCastleProvider를 'ref'로 선언해야 하는 데 value 로 선언하여 이를 provider 속성에

       String 값으로 넣으려 하다가 나는 에러다. 객체를 참조하는 부분이니 value 가 아니라 ref로 바꿔줘야 정상 동작한다. ㅎㅎㅎ 이런 실수를 ㅜ

       처음보는 에러 메세지여서 정리해둔닷



5. 해결


    - 아래와 같이 설정 변경해주니, 정상 기동하였다.


  <!-- 암호화  provider 선언 -->

    <bean id="bouncyCastleProvider" class="org.bouncycastle.jce.provider.BouncyCastleProvider"/>

    <!-- 암호화  환경 설정 -->

    <bean id="environmentVariablesConfiguration"

        class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">

        <property name="provider" ref="bouncyCastleProvider" />

        <property name="algorithm" value="PBEWITHSHA256AND128BITAES-CBC-BC" />

        <property name="passwordEnvName" value="APP_ENCRYPTION_PASSWORD" />

    </bean>

    <!-- 암호화 실행 모듈 선언 -->

    <bean id="configurationEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">

        <property name="config" ref="environmentVariablesConfiguration" />

        <property name="password" value="easyframework" />

    </bean> 




'Spring' 카테고리의 다른 글

(작성중) dispatcher-servlet.xml 설정  (0) 2017.04.16
spring - profile  (0) 2017.03.19
[Spring] Transaction 관리  (0) 2017.03.12
Spring - BeanNameViewResolver  (0) 2017.01.29


프로젝트에서 전체 프로젝트 환경 구성을 맡게 되었다. 

프로젝트 구조를 어떻게 가져갈지 고민하고, 패키지 구조, 공통 제공 기능 등을 구상해야 했다. 

처음해보기도 했고, 아직 많~~~~이 부족하다는 걸 매순간 깨닫는 작업이었다..  

프로젝트 끝나기 전까지 내가 스스로 프로젝트를 좀 더 효율적으로 할 수 있는 부분을 캐치해내고, 적용해보는 부분이 생기도록 고민해봐야겠다!


우선, 오늘은 Spring 설정 부분을 정리해두려 한다. 

구성한 프로젝트 환경은 아래와 같다


 - JAVA: JDK 1.8

  - IDE: Eclipse Mars2 (4.5)

  - WAS: Tomcat 8.0.42 

  - DB: Oracle 11g

  - Build: Maven 3.3.9

  - Framework: Spring 4.3.6 , 사내프레임워크

 


기존 시스템 재구축 성격의 프로젝트라, 기본적인 tools 업그레이드와, 프레임워크 버전 현행화가 요새 주된 작업이다.

버전 업그레이드라 생각해서 처음부터 구축하는 것 보다 낫겠지 싶었는데, 더 어려운 것 같다.. 호환성이 안맞아 깨지는 부분이 생기고 ㅜ


AS-IS 시스템은 Spring 3.1 버전을 쓰고 있었다.


Spring 4.3.x 에 맞게 dispatcher-servlet.xml 파일을 수정했다. 처음엔 뜬구름 잡듯이 이해됬었는데, 차장님한테 질문하고나니

그래도 흐름이 쭉 잡힌 것 같다. 잘정리해놔야지!


_____________________________________________________________________________________________________________________________

# Spring 설정: dispatcher-servlet.xml


  dispatcher-servlet에서 기본적으로 설정 고려해야 하는 항목들은 아래와 같다고 생각한다.

  

  1.component 스캔

   2.MVC 설정 = interceptors, adpater, handler

   3.Resolver 설정


 '화면'단에 적용할 설정들을 모아놓는 곳이기 때문에 기본적으로 위의 설정들은 들어가야 한다. 


1) dispatcher-servlet.xml

  

    - 톰캣 서버를 기동시키면 기동로그에 dispatcher-servlet 파일이 로딩되는 부분이 보인다.

    - root Context 초기화가 이루어진 다음, 이제 WebApplication Context가 초기화될 차례다.

    -  WebApplication Context가 초기화되면서, dispatcher-servlet.xml 파일에 선언한 bean 들이 등록된다.


정보: Initializing Spring FrameworkServlet 'sample'

| [INFO ] 20:45:38.727 [o.s.w.servlet.DispatcherServlet] [localhost-startStop-1]   -FrameworkServlet 'sample': initialization started 

| [INFO ] 20:45:38.732 [o.s.w.c.s.XmlWebApplicationContext] [localhost-startStop-1]   -Refreshing WebApplicationContext for namespace 'sample-servlet': startup date [Sun Apr 16 20:45:38 KST 2017]; parent: Root WebApplicationContext 

| [INFO ] 20:45:38.732 [o.s.b.f.x.XmlBeanDefinitionReader] [localhost-startStop-1]   -Loading XML bean definitions from class path resource [META-INF/dispatcher-servlet.xml]  



  (1) component 스캔 작업


      - dispatcher-servlet.xml 파일 내 컴포넌트 스캔 셋팅은 아래와 같다. 


<?xml version="1.0" encoding="UTF-8"?>

<beans  xmlns:context="http://www.springframework.org/schema/context" 

            xsi:schemaLocation=" http://www.springframework.org/schema/context 

                                         http://www.springframework.org/schema/context/spring-context.xsd ">


<context:component-scan base-package="com.sampleframework, com.sampleCompany.sample" use-default-filters="false">

   <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>    

</context:component-scan>  



      ▶ Spring이 @Component 또는 @Component를 메타 어노테이션으로 갖고 있는 어노테이션(@Controller, @Repository, @Service)이 

          붙은 클래스들을 빈으로 등록한다.

      ▶ 스캔 범위: 보통 공통빈(persistence, service) 설정 정보는 Application context에, web layer 단의 빈(controller)들WebApplicationContext에 

                        저장한다.

      ▶ stereotype annotation: 클래스에 붙어 해당 클래스가 컴포넌트 스캔 대상이고, 스프링에 의해 관리될 것임을 명시한다. 

      ▶ base-package: 설정한 패키지 내에서 컴포넌트 스캔을 수행한다. 스캔 범위 지정

      ▶ use-default-filters: 아무 설정을 안할 경우 default로는 모든 stereo type 스캔한다. 개별적으로 특정 빈만 스캔하려는 경우 

                                   해당 설정을 false로 해주고, 특정 빈을 include filter 설정해주어야 한다.



      ▶ sts 의 spring explorer를 통해 bean 로딩 확인 (프로젝트 패키지명은 모자이크 처리함)



[ 이미지1 - component-scan의 use-default-filters 설정을 주지 않은 경우, base-package내 컴포넌트들을 모두 스캔하고 있다]



                   [ 이미지2 - component-scan의 use-default-filters 설정을 false로 주고, Controllerㄹ 컴포넌트만 include 설정 한 경우, base-package내 

                                  @Controller 컴포넌트들만 스캔하고 있다]




(2) spring MVC 설정


    - spring MVC를 활성화하기 위해 아래와 같은 설정을 해준다.


    - 보통 설정들을 copy해서 쓰기 때문에 실제로 이 설정이 정확히 어떤 역할을 하는지 몰라 그냥 그대로 쓰는 경우가 많다.

      그러다 보면 사용하지 않는 설정들도 다 포함되어 설정파일만 비대해지게 된다. 


      STS를 별도로 설치하여 spring explorer 뷰를 활용하여 실제 설정을 적용했을 때 어떤 변화가 일어나는 지 확인해 보았다. (강추!)

      (eclipse Mars2 4.5 버전에서는 sts 플러그인 설치 시, 기존 내장되어 있는 maven 의 m2e와 충돌이 나는지.. 설치 후 

       maven 도 안되고, sts 기능도 사용이 불가했다...버그인것 같은데 레퍼런스가 거의 없다 ㅜㅜ. sts 중 maven 과 겹치는 부분은 제외한 채

       설치해도 같은 결과가 반복됬다.....eclipse를 밀기를 몇번 ^^;; 그냥 sts 를 별도로 설치해서 확인했다)


<mvc:annotation-driven />  


    ▶@Controller 와 @RequestMapping 사용 활성화

    ▶@Controller들에게 요청을 전파하기 위한 HandlerMapping(default: RequestMappingHandlerMapping)과          

       HandlerAdapter(default: RequestMappingHandlerAdapter)를 등록


         - RequestMappingHandlerMapping 역할: 요청들을 해당 annotation이 걸린 컨트롤러 method로 매핑

          

    ▶ HandlerExceptionResolver 등록

  


[이미지3 - mvc:annotation-driven 설정을 해준 경우, 위와 같이 handlerAdapter가 자동으로 등록되었다. 더 깊게 확인은 못해봤지만,       

              AnnotationDrivenBeanDefinitionParser라는 애가 파싱을 담당하나 보다.]





(3) MVC - interceptor 설정 


(4) MVC - adapter 설정


(5) MVC - resolver 설정






__________________________________________________________________________________________________________________________________________________________

** 본 포스팅에 대해 수정해야할 부분이나 추가 의견 등이 있으신 분들은 댓글 달아주세요. 언제나 환영입니다 :) 

** 본 포스팅을 reference 자료로 참고하실 분들은 출처를 꼭 밝혀주시기 바랍니다.



 

      


'Spring' 카테고리의 다른 글

[에러] no matching editors or conversion strategy found  (0) 2017.04.20
spring - profile  (0) 2017.03.19
[Spring] Transaction 관리  (0) 2017.03.12
Spring - BeanNameViewResolver  (0) 2017.01.29

+ Recent posts