# 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

1. AJAX 통신이란?


   - Asynchronous Javascript And XML

   - 비동기로 서버와 데이터를 주고 받는 javascript 기술!

   - XMLHttpRequest 객체가 핵심. XMLHttpRequest는 서버측 javascript와 통신하기 위한 ajax의 핵심 기술이며 '비동기' 통신을 가능케 한다.

     즉,  ajax 통신을 사용하게 되면 페이지를 새로 리로딩 하지 않아도 데이터가 슉슉 바뀌는 것!!


   - ajax가 적용된 페이지는 전체 HTML이 아닌, XML이나 JSON 형식으로 구성된 새로운 데이터만을 XMLHttpRequest 객체를 통해 받아오기

     때문에, 사용자에게 페이지 이동없이 새로운 내용을 제공할 수 있다.


  


  Q. 비동기 통신을 사용하기 전, 기존 통신의 문제점은?


  웹 페이지에는 요청/응답의 관계가 성립된다. 기존 웹페이지 통신 방식에서는 응답 시, 페이지 redirect 처리가 필수였다. 

  때문에 사용자 입장에서는 모든 처리마다 페이지 리로딩이 발생했다. 조그만한 변경사항을 보여주기 위해, 전체 HTML 코드를

  재전송해야하는 비효율적인 처리 방식이다. --> 과도한 트래픽 발생, 서버 유지비용 증가..




2. $.ajax() 함수


    - ajax() 함수에 웹 서버로 보내기 위한 요청 설정 정보와 통신이 성공했을 경우 실행 될 함수,  통신에 실패했을 경우 실행 될 함수를 설정한다.

        

 $.ajax({

    "url": "접속할 페이지 주소",

    "dataType": "전송 데이터 type(ex: json)",

    "type": "get/post",

    "data": "전송할 data",

    "success": function(data) {

                  .... // 통신 성공시 실행 함수

                 }

    });  




__________________________________________________________________________________________________________________________________________________________

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

** 본 포스팅은 아래의 reference 들을 참고하여 내용을 덧붙인 글입니다. 혹시, 문제가 되는 경우 알려주시면 조치하도록 하겠습니다.

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


  - 책: [Javascript, jQuery, Ajax 완벽가이드], 저자: 주영아 이광호, 출판사: Interpress


  

'UX' 카테고리의 다른 글

[WebSquare5] 웹스퀘어5 연동  (0) 2017.04.29
jQuery 기초  (0) 2017.02.26
Javascript 기초2  (0) 2017.02.26
Javascript 기초  (0) 2017.02.26
[Error] maven 프로젝트 checkout 후 JSP 파일 에러  (0) 2017.01.29

1. jQuery 란?


   - Javascript Library 중 하나

   - 브라우저 호환성 o

   - ajax 통신처리 용이

   - 참고: http://www.jquery.com 



2. jQuery 사용 이점


   - 크로스 브라우징: 한번의 코딩으로 모든 브라우저에 적용됨

   - 다양한 플러그인: jquery 기반 플러그인들이 무료로 배포되고 있음.



3. jQuery 사용 선언


   - jQuery를 사용하기 위해 다운로드 받은 js 파일을 HTML 내에서 참조해야 한다.

  

  <!-- JQUERY -->

    <script type="text/javascript" src="${pageContext.request.contextPath}/resources/js/jquery/jquery-1.11.1.min.js"></script>

  <script type="text/javascript" src="${pageContext.request.contextPath}/resources/js/jquery/jquery.session.js"></script>

<script type='text/javascript' src='${pageContext.request.contextPath}/resources/js/jquery/jquery.cookie.js'></script>

<script type='text/javascript' src='${pageContext.request.contextPath}/resources/js/jquery/jquery.hoverIntent.minified.js'></script>

<script type='text/javascript' src='${pageContext.request.contextPath}/resources/js/jquery/jquery.dcjqaccordion.2.9.js'></script>

<script type='text/javascript' src='${pageContext.request.contextPath}/resources/js/jquery/jquery.form.min.js'></script>

<script type='text/javascript' src='${pageContext.request.contextPath}/resources/js/jquery/jquery.validate.js'></script> 


   - 위와 같은 방법 외에 src="http://code.jquery.com/jquery-1.11.0.min.js" 라고 설정하여 받아올 수도 있지만 이는 원격지 파일을 참조하는 

     것이기 때문에 인터넷이 가능한 환경에서만 정상 수행된다.



4. 최상위 객체 '$'


    - $ 객체는 jQuery의 모든 기능을 담고 있는 최상위 객체다. 



5. 셀렉터 (Selector)


   셀렉터 때문에 개발 처음 할 때 고생을 좀 했다. 정리해 보면 쉽게 구별해 쓸 수 있었다. 셀렉터는 좀 알아둬야 할 것같다.


    * class 셀렉터: (".class명")

    * id 셀렉터: ("#id명")

    * 태그 셀렉터: ("태그명")

    

    - 셀렉터 조합 


       * 여러 셀렉터에 접근:  콤마로 구분

                           (".class명 , #id명")


       * 계층관계 셀렉터 접근: 연속으로 명시 (공백 없이)

                                       (".class명#id명")


       * 셀렉터 내 특정 값을 가진 요소에 접근:  [요소=값]

 

 $(this).find("input[type=text]").each(function(j,field) {

   ......

  }      --> input type이 text인 요소들 각각 을 선택하는 셀렉터




__________________________________________________________________________________________________________________________________________________________

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

** 본 포스팅은 아래의 reference 들을 참고하여 내용을 덧붙인 글입니다. 혹시, 문제가 되는 경우 알려주시면 조치하도록 하겠습니다.

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





'UX' 카테고리의 다른 글

[WebSquare5] 웹스퀘어5 연동  (0) 2017.04.29
AJAX 통신 기초  (0) 2017.02.26
Javascript 기초2  (0) 2017.02.26
Javascript 기초  (0) 2017.02.26
[Error] maven 프로젝트 checkout 후 JSP 파일 에러  (0) 2017.01.29

# Javascript 사용 목적

   - javascript 를 사용하는 이유는 <body> 안의 어떤 태그를 사용자의 이벤트에 반응할 수 있도록 제어하기 위함이다.

   - HTML 태그요소 제어? 

     : 해당 태그의 시작과 끝 사이에 어떤 내용을 새롭게 지정하거나 기존 내용을 삭제하는 것 의미.





# Javascript 내장 함수


1. Javascript 내장 함수?


   : 웹 페이지 작성 시 사용되는 보편적인 기능들을 웹 브라우저 개발사에서 미리 정의하여 웹브라우저 안에 내장해 놓은 함수.


2. 주요 내장 함수

 

 Number(문자열)

 주어진 문자열의 변수를 실제 숫자형으로 변환 

 isNaN(문자열)

 주어진 문자열이 숫자로 변환 할 수 없는 문자열인 경우 true, 숫자로 변환 가능한 경우 false 반환 

 **   NaN: Not a Number

 parseInt(문자열)

 주어진 문자열 변수를 실제 숫자형으로 변환 

 confirm(문자열)

 확인/취소 대화창 표시 

 ** Number() 와 parseInt() 차이

    : 대부분 동일한 결과를 리턴하지만, 실수 형태를 반환할 경우 서로 다른 결과를 리턴한다. (parseInt는 정수형만 다룬다)

    : Number ("100.1") --> 100.1

      parseInt("100.1") --> 100  




3. Javascript 에서의 Id 속성
    - 여러 개의 id 값이 중복될 경우 javascript에서는 가장 첫번째 요소에게만 동작한다.
       --> document.getElementById("");


4. Javascript 내장 객체

   4.1 값 처리 위한 내장객체

   

 Date

 시스템의 현재 날짜 시작 조회 및 계산 기능 제공 

  - 주의: javascript 에서는 월에 대한 값이 0부터 시작됨. 원하는            날짜에서 한 달 작은 값 설정 필요

  - 현재날짜 출력: getFullYear(), getMonth() + 1, getDate()

  - 현재시간 출력: getHours(), getMinutes(), getSeconds()

 Array 

 배열에 관련된 기능 제공 

  - var arrayTest = new Array();

  - var arrayTest = [ ] ;

  - Java와 다르게 javascript는 배열의 크기가 유동적으로 변화       가능하다

 String

 문자열 객체 제공 

 Math 

 삼각함수, 지수, 로그 등 수학과 관련된 각종 고급 함수 제공 

  - int round( ): 반올림

  - int floor( ): 소수점 이하 값 버림

  - int ceil( ): 소수점 이하 값 올림



    4.2 값 처리 위한 내장객체


 window

 브라우저 창에 대한 모든 상황을 제어하는 최상위 객체. javascript의 모든  브라우저 제어 관련 내장객체는 window 객체의 하위에 존재한다. 

  - window 객체 명시하는 것은 생량 가능하다. 

    원래는 window.내장객체이름.함수이름(); 호출하는 것이 정식.

  - window.open("페이지URL") : 새로운 탭 오픈

  - window.close()  혹은 self.close() : 현재 창 닫기

 location 

 url 정보를 제어하는 개체. 페이지 이동, 현재 주소 조회, 새로 고침 등의  기능을 제공한다.

  - 속성: href, host, hostname, port, pathname, protocol, search 

           (search: url에 포함된 파라미터 조회) 

  - location.reload() : 페이지 새로고침

 history 

 웹 블우저에 기록되어 있는 히스토리 정보 제어 

  - 브라우저의 뒤로/앞으로 버튼 기능 수행 객체

  - back(), forward() 함수 내장

  - history.back() : 이전 페이지로 이동하기

 navigator 

 브라우저 종류 판별 및 브라우저 정보 조회

  - 속성: appName, platform, userAgent, appVersion

           (appName: 브라우저 이름, platform: 브라우저 설치된 시스템 환경, userAgent: 웹 브             라우저의 종류와 버전, appVersion: 웹 브라우저의 버전)




    4.3  HTML 문서를 제어하기 위한 내장객체


 document

 문서에 대한 정보, 즉 HTML 문서의 각 요소들을 제어하기 위한 기능. javascript 의 핵심객체!!

 form 

 입력양식 컴포넌트를 위한 개별 객체 포함 






__________________________________________________________________________________________________________________________________________________________

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

** 본 포스팅은 아래의 reference 들을 참고하여 내용을 덧붙인 글입니다. 혹시, 문제가 되는 경우 알려주시면 조치하도록 하겠습니다.

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


  - 책: [Javascript, jQuery, Ajax 완벽가이드], 저자: 주영아 이광호, 출판사: Interpress




'UX' 카테고리의 다른 글

[WebSquare5] 웹스퀘어5 연동  (0) 2017.04.29
AJAX 통신 기초  (0) 2017.02.26
jQuery 기초  (0) 2017.02.26
Javascript 기초  (0) 2017.02.26
[Error] maven 프로젝트 checkout 후 JSP 파일 에러  (0) 2017.01.29

프로젝트 하면서 javascript를 썼는데, 기초 내용도 탄탄히 안다지고 무작정 이렇게 쓰면 되는구나~ 하고 썼던 것 같아 

기초 내용을 정리해두려한다. 틈틈히 몰랐던 내용 정리해놔야지~~



1. JavaScript 기초


1.1 DTD 선언


    - HTML5 버전에 들어서면서 DTD 선언문이 간략화 되었다.


      * 기존(XHTML1.0) : <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional //EN"

                               "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


      * 현재(HTML5) : <!DOCTYPE html>

                          

    - DTD 선언은 HTML 페이지의 가장 첫 라인에 명시되어야 한다. 웹 브라우저가 HTML의 버전을 인식하고 HTML 태그나 CSS를 해당 버전에 

      맞도록 처리하기 때문. DTD 선언문은 웹 표준 준수를 위하여 반드시 명시되어야 한다!



1.2 파일 인코딩 형식 


     - HTML5 버전에 들어서면서 파일 인코딩 지정 방식도 간략화 되었다.


       * 기존(XHTML1.0) : <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />


       * 현재(HTML5) : <meta charset="utf-8" />



       ** 인코딩(Encoding): 어떤 파일이 저장되는 방식. 한국어 처리를 위한 "euc-kr", 다국어 처리를 위한 "utf-8" 이 있다. 

                                   ajax에서는 "euc-kr" 형식을 지원하지 않기 때문에 최근 웹 페이지 제작은 대부분 "uft-8"을 사용한다.



1.3 HTML 페이지 내 Javascript 코드 포함


     - Javascript 블록은 <script> 태그로 정의되며 구문의 종류를 의미하는 type = "text/javascript" 속성이 함께 명시된다. 


     - HTML 코드 안에 javascript 포함시키는 다른 방법은, javascript 명령문을 js 파일에 별도로 작성해 두고, HTML이 이 js 파일 내용을 

       참조하도록 설정해주는 것.

       --> javascript 구문을 외부 js 파일 형태로 작성하게 되면 하나의 js 파일을 여러 HTML에서 참조 할 수 있기 때문에 javascript를 재사용

            할 수 있다는 이점이 있다.


 <script type="text/javascript" src="js 파일경로"></script>


     ** html 코드 다음에 javascript 블록을 넣어주는 것 을 권장한다. 페이지 로딩 시, 위에서부터 소스코드를 읽어들이는데, 이때 자바스크립트에 

        오류 코드가 있으면 html 소스를 읽기 전에 에러가 떠, 화면 로딩 조차 되지 않기 때문이다.  화면은 기본으로 띄워주고 자바스크립트에 오류가 있을         경우 오류 메세지를 띄워주는게 낫겠죠 ㅎㅎ

     


1.4 Javascript 주석


    - 한 줄 주석: //

    - 여러 줄 주석: /*   */



1.5 console 사용

 

    - console.log("출력내용");


   ** 결과 확인은 브라우저의 확인 대화상자 호출(alert())



1.6 변수 데이터 타입 종류

     

 Number

 숫자 표현. 산술 연산에 사용 

 String

 문자열 표현.  

 Boolean

 true / false 

 Object

 객체 저장 하기 위한 데이터 타입. 브라우저 제어 기능, form 제어 기능,

 html 태그 요소에 대한 제어가 가능하다 

 Null 

  

 undefined

 변수만 선언되고 아무런 값도 할당되지 않은 상태. 

 ** Javascript 에서는 일반적인 프로그래밍언어와 달리 변수 선언할 때는 변수 존재 여부와 범위     만 결정되고, 변수의 자료형은 값을 할당 할 때 자동으로 결정된다!




__________________________________________________________________________________________________________________________________________________________

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

** 본 포스팅은 아래의 reference 들을 참고하여 내용을 덧붙인 글입니다. 혹시, 문제가 되는 경우 알려주시면 조치하도록 하겠습니다.

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


  - 책: [Javascript, jQuery, Ajax 완벽가이드], 저자: 주영아 이광호, 출판사: Interpress


'UX' 카테고리의 다른 글

[WebSquare5] 웹스퀘어5 연동  (0) 2017.04.29
AJAX 통신 기초  (0) 2017.02.26
jQuery 기초  (0) 2017.02.26
Javascript 기초2  (0) 2017.02.26
[Error] maven 프로젝트 checkout 후 JSP 파일 에러  (0) 2017.01.29

정신이 없어 캡처 이미지를 뜨지 못했다.. 

그래도 꽤 자주 발생하는 에러인것 같아 글로라도 정리해놔야겠다.


SVN에서 maven 프로젝트를 처음 체크아웃 받을 때 가끔 JSP 파일들에만 빨간색으로 에러가 쭈~욱 뜰 때가 종종 있다.

체크아웃밖에 안했는데 에러가 나서 당황스러웠지만 찾아보니 원인과 해결방법은 아래와 같았다.


우선, 


 * 에러 메세지: javax.servlet.jsp.JspException cannot be resolved to a type 

 * 원인: 프로젝트를 처음 만들면서 target runtime을 선택하지 않아 발생된 문제다.

          일부 공통컴포넌트의 경우는 JSP나 Servlet에 대한 참조가 필요한 경우가 있다. (taglib를 사용하기 위해)

          이 경우는 Server Runtime(ex: Apache Tomcat 등)에 대한 library 참조가 필요하다.


* 해결1: project 우클릭 > build path > configure build path > library 탭 > add library 선택 > Server Runtime 선택 > 설정되어 있는 

           Servlet engine 선택!


* 해결2: project 우클릭 > properties > project facets > 오른쪽 Runtime에 사용하는 was 서버 선택! > project clean 



해결 끝~~~~~!



__________________________________________________________________________________________________________________________________________________________

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

** 본 포스팅은 아래의 reference 들을 참고하여 내용을 덧붙인 글입니다. 혹시, 문제가 되는 경우 알려주시면 조치하도록 하겠습니다.

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


  - http://aljjabaegi.tistory.com/187

  - http://open.egovframe.go.kr/nforges/freediscussion/qna/4327/.do


'UX' 카테고리의 다른 글

[WebSquare5] 웹스퀘어5 연동  (0) 2017.04.29
AJAX 통신 기초  (0) 2017.02.26
jQuery 기초  (0) 2017.02.26
Javascript 기초2  (0) 2017.02.26
Javascript 기초  (0) 2017.02.26

+ Recent posts