차장님과 SAP Jco 관련 에러를 해결하다가 systemWOW64 폴더를 처음 보게되었다.

system32는 종종 봐왔지만, systemWOW64는 정말 처음 보는 애였다. ㅎㅎ 


겉보기에는 이름 그대로 systemWOW64는 64bit 프로세스를 처리할 것 같고, system32는 32bit 용을 처리할 것 같아 보였다.

하지만 실은 그 반대라고 차장님이 설명해주셔서 따로 적어놓았다가 이렇게 정리해둔다.


# System32 와 SystemWOW64 차이


64bit Windows 운영체제에서 파일을 위치시킬 때, 

64bit용 DLL은 system32에, 32bit용 DLL은 systemWOW64에 위치시킨다.

(C:\Windows\System32, C:\Windows\System32)


왜 헷갈리게 이렇게 교차로 match되어 들어갈까?? 


궁금해서 그 이유를 찾아보다가 MS에서 naming 쪽을 담당했던 직원의 인터뷰 자료를 찾게 되었다.

이름 안에 WOW가 들어가는 것도 정말 WOW 였다.....ㅎㅎ


—And what about System32 is that yours?

—Yep. I thought, "these files are 32 bit files. So I'll put them here."

—And that was pretty successful?

—Yes. I did such a good job naming it System32, that nowadays it contains all the 64 bit files as well.

—Then what happens to the 32 bit version of the 64 bit files. Where do they go?

—Well they can't go in System32, because on a 64 bit machine, System32 is where the 64 bit files go. So if we're running a 32 bit executable we lie to the executable and tell it that "System32" points at another folder, called SysWOW64 and that's where we stick the 32 bit files.

—Why is there a 'WOW' in the middle of the name?

—I was typing System64 and half way through I just thought: "WOW, nature is beautiful!"

—And the 32 bit files, they go in SysWOW64, since the 64 bit files are in System32?

        —Yep. (Laughing) Oh I took a lot of meth that day, my friend. 



이와 마찬가지로 Program Files(x86) 폴더도 32bit 용 파일들이 위치하는 곳이다.  그냥 Program Files 폴더에는 64bit 용 파일들이 위치하고 ㅎㅎ



예전에는 정말 폴더들도 아무 생각없이 봤었는데 요새는 한 번씩 생각하게 된다 ㅎㅎ 

얘는 무슨 역할을 하는 애지?? 



많이 궁금해하고, 많이 배워야지 :) 


'JAVA' 카테고리의 다른 글

예외처리 관련 참고문서  (0) 2017.06.11
로깅(Logging) 참고문서  (0) 2017.06.11
JAVA - 향상된 for 문 (from Java1.5)  (0) 2017.02.26
SAPJCO 연동 설정  (0) 2017.02.26
JAVA_리팩토링  (1) 2017.01.08

프로젝트 할 때 SAP 과 연동 작업이 필요해서 이와 관련된 환경을 셋팅했다.

다음에 또 같은 환경을 쓸 때 참고하려고 sap jco 연동 방법 정리해 둔다~~


1. SAP Jco란?


   - Java에서 SAP을 연동하여 시스템을 구축할 때 사용되는 SAP JAVA Connector.

   - Java에서 SAP의 데이터를 가져오기 위해 SAP Jco 사용



2. 필요 파일


   - sapjco.jar

   - sapjco.dll



3. 환경 셋팅


    ** 주의: sapjco 관련 파일은 사용자의 OS 환경에 맞게 다운받아 설치해야 한다. 32bit 환경인데 64bit용 jco 파일을 설치하면 당연히 에러 ^^


   (1) sapjco.dll 파일을 C 드라이브 > Windows > System32 아래로 넣어준다. 




   (2) sapjco.jar 파일은 maven 사용 시, pom 파일에 추가해주고 

       maven 사용하지 않는 경우,  프로젝트 우클릭 > properties > Java build path > libraries > add external jars 해서 추가해주면 된다.

       (아래 사진 systemPath 태그에는 로컬 파일 경로를 명시해주었다)



      --> maven 사용 시 중앙 리파지토리에 sapjco3.jar 파일을 등록하여 받아 쓰는 것도 가능하지만,

           그렇게 설정하면 sapjco3.jar 파일에 버전정보가 붙은채로 땡겨오게 되고, 버전정보가 붙으면 maven build 시 jar 파일을

           정상적으로 인식하지 못하는 에러가 발생했다. 그래서 우선 maven build 시 로컬 경로로부터 jar파일을 가져다 쓸 수 있도록

           설정하여 사용했다.



 (3) SAP 연결 정보 설정


     - 내가 한 프로젝트의 경우 연결할 SAP 서버 정보를 properties 파일에서 관리했다.

       properties 파일에는 아래와 같은 정보가 필요하다.


 sap.client =

 sap.host = 

 sap.language = ko

 sap.systemnumber =

 sap.user =                ....접속 계정 정보

 sap.password =           ....접속 계정 정보


 #connection pool 설정

 sap.pool.capacity =        ....허용 pool 갯수

 sap.pool.limit =           ....최대 허용 pool 갯수



    - context-common.xml 파일 내 위에 설정한 properties 파일에 대한 설정을 해주었다.

<util:properties id="globalProperties"

location="classpath:/property/global_test.properties" />              // global_test.properties 라는 파일에 sap 연결정보를 설정


<!-- Properties 초기화 -->

<bean class="groupdId.artifactId.cmm.sapjco.JcoConnection">                // 위의 globalProperties 파일을 참고하여 JcoConnection class 초기화

<constructor-arg>

<ref bean="globalProperties" />

</constructor-arg>

</bean> 


 



(4) SAP 연결 정보 및 connection 얻기


     - Properties 클래스는 HashTable<Object, Object> class 를 확장하고 있는 클래스로, key, value 형태의 properties 값들을 받는 역할을 한다.

     - properties 파일에 정의해 놓았던 sap 연결 정보들을 key, value 형태로 Properties 클래스에 셋팅해준다.

     - 앞에서 초기화 했던 JcoConnection class에서 globalProperties 파일을 통해 sap 연결정보 get!


 public JcoConnection(Properties jcoProperties)

    {

    try

    {

    Properties connectProperties = new Properties();

   

    connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, jcoProperties.getProperty("sap.host"));

    connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, jcoProperties.getProperty("sap.systemnumber"));

    connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, jcoProperties.getProperty("sap.client"));

    connectProperties.setProperty(DestinationDataProvider.JCO_USER, jcoProperties.getProperty("sap.user"));

    connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, jcoProperties.getProperty("sap.password"));

    connectProperties.setProperty(DestinationDataProvider.JCO_LANG, jcoProperties.getProperty("sap.language"));

    connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, jcoProperties.getProperty("sap.pool.capacity"));

    connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, jcoProperties.getProperty("sap.pool.limit"));

   

    File destCfg = new File(jcoProperties.getProperty("sap.host")+".jcoDestination");


    FileOutputStream fos = new FileOutputStream(destCfg, false);

    connectProperties.store(fos, "for tests only !");

    fos.close();

   

    destination = JCoDestinationManager.getDestination(jcoProperties.getProperty("sap.host"));

                repository = destination.getRepository();

            

    }catch (Exception e)

    {

    // 

    }

    } 



       

(5) RFC Function 얻기

     - SAP으로부터 필요한 데이터를 주고받기 위해 SAP에서 제공하는 함수를 가져온다.


 public JCoFunction getFunction(String functionStr) {

JCoFunction function = null;

try {

function = repository.getFunction(functionStr);

} catch (Exception e) {

throw new RuntimeException("Problem retrieving JCO.Function object.");

}

if (function == null) {

throw new RuntimeException("Not possible to receive function. ");

}


return function;

}

    



(6) RFC Function 실행


public void execute(JCoFunction function) {

try {

JCoContext.begin(destination);

function.execute(destination);

} catch (JCoException e) {

//

} finally {

            try {

                JCoContext.end(destination);

            } catch (JCoException e) {

               //

            }

        }




(7) 서버 기동 시 SAP 연동 


    + 연동 관련 로그 정보 추후 추가 예정




__________________________________________________________________________________________________________________________________________________________

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

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



'JAVA' 카테고리의 다른 글

예외처리 관련 참고문서  (0) 2017.06.11
로깅(Logging) 참고문서  (0) 2017.06.11
JAVA - 향상된 for 문 (from Java1.5)  (0) 2017.02.26
system32와 systemWOW64  (0) 2017.02.26
JAVA_리팩토링  (1) 2017.01.08

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

1. JSON 이란?


 - Javascript Object Notation 

 - 경량의 데이터 교환형식 (XML에 비해 훨씬 경량화 됨)

 - 서로 다른 프로그래밍 언어 간에 데이터를 교환하기 위해 널리 사용되는 표기법

 - json 에 포함되는 값의 종류에도 제한이 없다. Number, String, boolean, 배열 등등 모두 포함 가능. (함수도 포함 가능)

 - json 데이터 읽기: "객체명.이름"


 - 기본 형식: 빈 객체( { } ) 안에 콤마로 구별하여 여러 값을 하나의 객체안에 포함시킨다. 

                 key: value 형태로 할당한다.


 기본 형식: var jsonData = { name: wonnyyyy, age: 99, gender: 여자}


 배열 data: var jsonData = { "company": ["삼성SDS", "SK C&C", "LG CNS"] }









__________________________________________________________________________________________________________________________________________________________

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

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

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


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








# 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

Eclipse 설치 후, 최적화를 위하여 eclipse.ini 파일을 수정하려 한다.


eclipse 툴을 다운로드 받으면 찾을 수 있는 eclipse.ini 파일은 eclipse 툴 구동 시 읽어들이는 초기 설정 내역이 담겨 있는 파일이다.


현재 사용하고 있는 eclipse.ini 파일 내 설정은 아래와 같다.


  1  #C:\Sample\jdk\jdk170_79\jre\bin\server\jvm.dll

  2  -vm

  3  C:/Sample/jdk/jdk170_79/bin/javaw.exe

  4  -vmargs

  5  -Dosgi.requiredJavaVersion=1.7

  6  -Xverify:none

  7  -XX:+UseParallelGC

  8  -XX:-UseConcMarkSweepGC

  9  -XX:+AggressiveOpts

 10  -XX:PermSize=256M

 11  -XX:MaxPermSize=256M

 12  -XX:MaxNewSize=256M

 13  -XX:NewSize=256M

 14  -Xms1024m

 15  -Xmx1024m

 16  -Dfile.encoding=UTF-8

 17  -Duser.name=wonnyyyy



각 라인 별 설정 내역을 짚고 넘어가려한다. 나중에 이 부분 설정을 건드려야 할 때 꼭 도움이 되길! ㅎ_ㅎ


1) #C:\Sample\jdk\jdk170_79\jre\bin\server\jvm.dll

      - 우선 1번 라인 설정은 주석처리 되어 있는 상태인데, 3번 설정을 통해 JVM을 찾을 수 없을 때 1번 설정을 사용한다. 

      - 이클립스 시작 중 "Java was started but returned exit code=1" 에러가 발생하는 경우, -vm 옵션의 value 값을 1번과 같이 바꿔준다. (path to jvm.dll)

        (차장님이 3번 설정이 바라보는 곳이 결국 1번이라고 하셨는데, 시간날 때 한 번 찾아서 정리해봐야겠다.)



2)  -vm

    C:/Sample/jdk/jdk170_79/bin/javaw.exe

      - 2~3번 라인에서는 -vm 옵션을 통해 eclipse가 사용할 JDK 경로를 설정한다. 

      - '-vm' 옵션과 그의 value 값인 path는 별도 라인에 명시되어야 한다. 

      - value 값인 path는 Java home 디렉토리가 아니라, Java executable 까지에 대한 path를 명시해주어야 한다.(exact path to javaw.exe)

      - '-vm' 옵션은 '-vmargs' 옵션보다 먼저 수행된다. ('-vmargs' 옵션이 수행된 후에는 바로 JVM이 실행된다)

      - 당연한거지만, 32bit 용 eclipse.exe에서는 32bit 용 JVM 이 사용되어야 하고, 64bit 용 eclipse.exe에서는 64bit용 JVM이 사용되어야 한다. 

  

3) -vmargs

    -Dosgi.requiredJavaVersion=1.7 

      - 4번 라인에서는 해당 eclipse 실행을 위한 최소 Java 버전을 명시하고 있다. (eclipse 툴 버전별로 최소 요구 Java 버전 확인 할 것)

      - 참고로 '-vmargs' 옵션은 JVM의 operation을 커스터마이징 하기 위한 설정이다. 설정 옵션들 중 가장 마지막에 오게 하기.


4) -Xverify:none

      - 초기 구동 시 클래스의 유효성 검사를 skip 하겠다는 뜻. 구동 시간이 빨라진다.


5) -XX:+UseParallelGC

      - 병렬 GC 사용 설정. 병렬 처리로 인한 처리 속도 향상. 


6)  -XX:-UseConcMarkSweepGC

      - 병행 Mark sweep GC 수행을 통해 이클립스 GUI 의 응답속도 향상. (mark sweep GC는 GC 수행 방법 중 하나..자세한 설명은 별도 검색)


7)  -XX:+AggressiveOpts

      - 컴파일러의 소수점 최적화 기능 설정....이라는데 무슨말인지 잘 이해가 안된다.


8)  -XX:PermSize=256M

      - permanent generation의 크기 설정. 즉, 클래스와 메서드를 위한 공간. JDK 7 기준, permanent generation 공간은 GC가 일어나지 않는다.


9)  -XX:MaxPermSize=256M

      - permanent generation의 최대 크기 설정(클래스와 메서드를 위한 공간). OOM 발생 시 이부분을 늘려주는 것을 권장. 메모리의 최소와 최대 값을

        같게 설정하면 힙메모리 영역의 변경이 없어 속도를 향상시킬 수 있다. 


10) -XX:MaxNewSize=256M

     -XX:NewSize=256M

        - new generation의 크기 설정. 즉, 새로 생성되는 객체들을 위한 공간. 어플리케이션 내 새로 생성되는 객체들은 주로 생성 후 얼마 지나지 않아

          사용하지 않게 되는 경우가 많다. 때문의 new generation 영역의 크기가 너무 크면 GC 호출이 잘 일어나지 않으며, 호출 시간도 오래 걸리게 된다.

          사이즈 조절 주의!


11) -Xms1024m

     -Xmx1024m

        - Xms는 eclipse가 사용하는 최소 heap memory 크기

        - Xmx는 eclipse가 사용하는 최대 heap memory 크기 

        - 메모리의 최소와 최대 값을 같게 설정하면 힙메모리 영역의 변경이 없어 속도를 향상시킬 수 있다. 

        - heap size를 1024m 로 설정하면, eclipse가 컴퓨터 상의 메모리 중 1024m를 자기 영역으로 확보하므로, 다른 작업들을 하고 있을 경우,

          메모리가 부족할 수 있다.  상황에 따라 메모리 크기를 적절하게 설정해주어야 한다.

        - 권장 사이즈

            1G 이하 메모리의 컴퓨터: -Xms256m -Xmx256m

            2G ~ 3G 메모리의 컴퓨터: -Xms512m -Xmx512m

            4G 이상 메모리의 컴퓨터: -Xms1024m -Xmx1024m



12) -Dfile.encoding=UTF-8

        - JVM을 통한 입출력으로 변환되는 데이터는 이 옵션을 통해 지정된 언어로 인코딩 된다. 위의 설정과 같이 UTF-8로 지정하면

          명시적으로 UTF-8 charset을 사용하게 된다.    

        - eclipse에서 다루는 파일들의 기본 문자셋 지정하는 옵션



** 설정 완료 후, eclipse 에서 window > preferences > general > show heap status 클릭하면 eclipse 우측 하단에서 

    ini 파일에서 설정했던 heap size를 확인할 수 있다.





이 설정파일 내용을 정리하다보니 JVM 메모리 구조를 정확히 알아놔야겠다는 생각이 든다.. 다음에 정리해놔야지 이부분!


__________________________________________________________________________________________________________________________________________________________

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

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

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


  - http://androidhuman.com/514

  - https://wiki.eclipse.org/Eclipse.ini

  - http://differentcolor.tistory.com/entry/%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4-STS-%EC%84%A4%EC%A0%95



프로젝트 개발환경을 업데이트 하던 도중.. Spring 관련 설정 하나 바꾼 것이 에러를 발생시켜 2~3시간 동안 매달렸다. 

같이 일하시는 차장님이 도와주셔서 다행히 에러 원인을 찾았다 ㅜㅜ 차장님 아니었으면 해결 못했을 뻔....


이번 정리로, 또 한번 새겨야겠다 설정 바꿀때는 항상 신중하게!!!! 


우선, 새로운 프로젝트의 기존 개발환경은 Spring 3.1.1 버전이었다. 이를 사내 프레임워크에 맞게 현행화 하기 위하여

Spring 4.3.3 버전으로 업데이트 했다. 


1) 배경


   - 개발환경 Spring 3.1.1 --> 4.3.3 버전 업데이트 



2) 에러


   - 화면 이벤트 발생 시 해당 결과값을 받아오지 않음. 개발자 도구(F12)로 확인해도 에러 떨어지는 게 없고, 서버에도 에러 로그 남는게 없다..



3) 원인


   - 소스코드 체크아웃 받은 이후로 건드린 소스가 없어서 왜 내 로컬에서만 해당 에러가 발생할까 고민이 많았다. 나만 바꾼거 위주로 거슬러 올라가

     생각하다보니 spring 설정이 생각났다. ㅎㅎ


   - dispatcher-servlet.xml 파일 내 BeanNameViewResolver 설정을 제거한 것이 문제였다.


  [AS-IS]

   : BeanNameViewResolver 설정 제거

 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />

    <property name="prefix" value="/WEB-INF/jsp/" />

    <property name="suffix" value=".jsp" />

    <property name="order" value="1" />

  </bean>

  <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">

    <property name="order" value="0" />

  </bean>


   - 해당 설정이 없으니, view 매핑이 제대로 이루어지지 않아 결과값을 뿌려줄 화면을 못찾았던 것.

   - 참고로, BeanNameViewResolver는 view 이름과 동일한 이름을 갖는 bean 객체를 view 객체로 사용한다. order도 0이여서      

     InternalResourceViewResolver 보다 먼저 찾았겠넹... ㅎㅎ



 4) 해결


     - BeanNameViewResolver 설정을 다시 원복한 후 view 맵핑이 정상적으로 처리되었다.

     - spring 4.x 에 와서 deprecated 된 애도 아닌데 내가 왜 이 설정을 제거했는지 모르겠다.............. ㅎㅎ;;

       하나 제거할때마다 신중하게 테스트해보고 커밋하기 ㅎㅎ 


 

 5) 참고자료

 

    [BeanNameViewResolever]

     - BeanNameViewResolver는 spring container에 bean으로 등록된 view 이름을 찾아 사용하는 resolver.

     - modelAndView를 반환할 때 viewName을 셋팅하여 리턴하면 해당 beanName을 가진 view를 찾는다. 

     - 커스텀 view 클래스를 view로 사용하는 경우 주로 사용한다.

     

   - 하나의 Dispatcher-Servlet은 다수의 viewResolver를 사용할 수 있다(order 옵션으로 먼저 사용할 resolver 지정하여 사용)

     우선순위(order)는 0 부터 0,1,2...의 형태로 부여되며, 우선순위가 높은 viewResolver가 null을 리턴하면, 그 다음 우선순위를 가진 viewResolver에게

     view가 요청된다.

   - 주의할 점은, InternalResourceViewResolver는 항상 우선순위 마지막에 놓도록 한다. InternalResourceViewResolver는 항상 view이름에 매핑되는 view        객체를 리턴하기 때문에(prefix, suffix 사용하여) null을 리턴하지 않는다.  InternalResourceViewResolver가 우선순위가 높을 경우 그보다 낮은 우선순위

     의 viewResolver들은 사용되지 않게 된다.



    [InternalResourceViewResolver]

     - Resource를 대상으로 view를 찾는데, 정적 자원 즉, webapp 아래 자원들을 반환값으로 찾게 된다. 컨트롤러가 지정한 view 이름으로부터 

       실제로 사용될 view를 선택한다.

     - 컨트롤러가 지정한 뷰 이름 앞뒤로 prefix 프로퍼티와 suffix 프로퍼티를 붙인 값이 실제로 사용될 자원의 경로가 된다.

 



__________________________________________________________________________________________________________________________________________________________

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

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

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


  - http://snoopy81.tistory.com/325

  - http://blog.naver.com/PostView.nhn?      

    blogId=chm8410&logNo=220375757503&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView


   

'Spring' 카테고리의 다른 글

[에러] no matching editors or conversion strategy found  (0) 2017.04.20
(작성중) dispatcher-servlet.xml 설정  (0) 2017.04.16
spring - profile  (0) 2017.03.19
[Spring] Transaction 관리  (0) 2017.03.12

프로젝트 내 개발 진행 중 발생한 에러인데 아직 명확한 해결책은 나지 않았지만 우선 정리해 둔다.


 @Autowired

  private GenericDao<Map<String, Object>> dao;

 @Autowired

  private SampleListDao<Map<String, Object>> sampleListDao;



우선 소스코드에 위와 같이 선언하여 service 구현체에 dao를 가져다 쓰려했다. 서버를 구동시키자 아래와 같은 에러가 떨어졌다.


1) 에러 메세지


Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [xxx.orm.mybatis.GenericDao] is defined: expected single matching bean but found 2: sampleListDao,genericDao

at org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:172)



 - 확인해보니, 찾으려는 bean에대해 한 개 이상의 bean이 존재하여 발생하는 에러였다. 

 - 에러에 대해 알아보기 위해 GenericDao와 SampleListDao 소스에 각각 들어가 살펴보았다.

   GenericDao는 SqlSessionDaoSupport를 extends 한 class 였고, SampleListDao는 그 GenericDao를 extends하고 있는 class였다. (내가 그렇게 만듬...ㅎ)



2) 원인


 - @Autowired로 주입하고 있기 때문에 Type을 검색하여 연결하는데, SampleListDao와 GenericDao의 생성 type이 결국 조상 class인 

   SqlSessionDaoSupport로 type이 같기 때문에 @Autowired가 누굴 찾아 주입해야하는지 명확히 알 수 없기 때문이다.

   이러한 경우 name 을 주어 어떤 bean을 주입할 지 결정해주곤 한다.


- 그래서 아, name 으로 구분하면 되겠네 하고 name을 주어 @Resource로 빈 주입을 시도했다.

- 하지만 예상과 다르게 계속 같은 에러가 발생했다....충격 

  음 아직 명확한 답은 모르겠으나, 'extends' 가 문제인 것 같다. SampleListDao가  SqlSessionDaoSupport를 extends 하여 맨위와 같이 선언하면

  문제없이 돌아간다. (참고로 SqlSessionDaoSupport는 abstract class)


- SqlSessionDaoSupport를 extends 하면 name 기반으로도 주입이 잘 된다. 



3) 해결


    - 명확한 해결방법은 좀 더 연구해보아야 할 것 같다... 자료도 더 찾아보고

    

    

4) 보충 자료


먼저 @Autowired 와 @Resource.


@Autowired 와 @Resource는 모두 의존관계를 자동으로 주입하기 위한 설정이다. 

비슷한 기능을 하지만 약간의 차이가 존재하는데, 이 둘의 차이점은 아래와 같다.



 @Autowired

 @Resource

 공통점

 의존관계를 자동으로 주입하기 위한 설정

 차이점1: 지원

 Spring Framework

 Java

차이점2: 검색 

bean의 Type으로 검색하여 의존성 주입 

bean의 Name으로 검색하여 의존성 주입 

 옵션

 @Autowired는 타입을 이용해서 자동적으로 값을 설정하기때문에 해당 타입의 빈 객체가 존재하지 않거나 또는 2개이상 존재할 경우 빈객체를 생성할때 예외를 발생시킨다.이 경우를 대비하여  @Autowired(required=false) 옵션을 설정할 수 있다. 해당 옵션을 설정하면 연결할 bean을 찾지 못해도 예외를 발생시키지 않는다.

 name 속성을 이용하여 명시적으로 bean name을 줄 수 있다.

 단점

 type으로 검색하여 연결하기 때문에 같은 타입이 2개 이상 존재하는 경우, 예외가 발생한다.

  --> 보완: @Qualifier

        (동일한 type의 bean 객체들 중 name을 사용하여 특정 bean

        을 연결하도록 설정 가능)

 


 - @Autowired는 spring에서 제공하는 annotation이기 때문에 spring을 쓰지 않고 다른 framework를 쓰는 경우

   더이상 사용할 수 없다는 단점이 있다. 반면, @Resource는 JAVA에서 제공하는 annotation이기 때문에

   framework에 관계없이 계속 사용할 수 있다는 장점이 있다.


 - @Autowired는 생성 Type으로 연결하지만, @Resource는 name으로 연결하기 때문에 주입하려는 bean에 name을 설정해주어야 한다.

   예를 들면,

 

@Service("sampleService")

public class SampleServiceImpl implements SampleService { 


 ...


@Resource(name="sampleService")

private SampleService sampleService;


 - 위의 예제와 같이 주입하려는 bean (@Service)에 name(sampleService)을 설정해주고 해당 bean을 가져다 쓰려는 곳에서

  @Resource(name="sampleService") 로 검색하여 찾아 연결한다. 



 - @Qualifier는 @Autowired를 보완하기 위해 나온 annotation으로, 동일한 type의 빈 객체들 중 name을 기반으로 특정 빈을 사용할 수 있도록 

   설정해준다.


 @Autowired

 @Qualifier("genericDao")

 private GenericDao<Map<String, Object>> dao;

 @Autowired

 @Qualifier("sampleListDao")

 private SampleListDao<Map<String, Object>> sampleListDao;  




__________________________________________________________________________________________________________________________________________________________

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

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



+ Recent posts