'학습정리 > by Min' 카테고리의 다른 글

안드로이드 nfc 사이트  (0) 2013.07.18
AOP(Aspect-oriented programming)  (0) 2013.07.12
nodejs  (0) 2013.07.11
css & selector & 상속  (0) 2013.06.26
박스 모델  (0) 2013.06.25
by 알 수 없는 사용자 2013. 7. 24. 14:31

안드로이드 인트로 화면


http://hoyanet.pe.kr/740


http://androphil.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%ED%8F%B0-%EC%98%A4%EB%9D%BC%ED%81%B4-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%99%80-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0-model-1-jsp

'학습정리 > by aking' 카테고리의 다른 글

안드로이드 NFC  (0) 2013.07.19
Java Script  (0) 2013.07.09
HTML & CSS  (0) 2013.06.25
(수정중) GIT Server 구축 및 Log4J 설정  (0) 2013.06.24
by aking 2013. 7. 21. 17:51


onResume()

- 홈버튼을 이용해 나가던지 Back버튼으로 나가던지 onDestory()함수를 사용하지 않는다면,

다시 앱을 실행되면onCreate()함수가 실행이 되지 않고 onResume()가 실행된다.


onPause()

- 인텐트 전달을 중지시킨다.



NDEF

- NDEF (NFC Data Exchange Format)는 NFC에서 데이터를 교환하기 위한 포맷.

- NFC 디바이스가 NFC 태그로부터 데이터를 가져올 때, 그리고 NFC 디바이스 사이에 P2P로 데이터를 전송할 때 이 포맷을 사용


NDEF 메시지

- 기본적인 메시지 단위 하나를 'NDEF 메시지 (NDEF Message)'라고 부른다.

- 하나의 NDEF 메시지는 여러 개의 'NDEF 레코드 (NDEF Record)'로 구성되어 있다.


NDEF 레코드

- 하나의 NDEF 레코드는 하나의 데이터를 담는데, 이 데이터를 '페이로드 (payload)' 라고 한다.


- 결국 이 페이로드를 전달하기 위해서는 NDEF 레코드가 필요하다.


- 페이로드 데이터는 그냥 byte 덩어리이기 때문에 이것만 보고는 이 데이터가 그냥 텍스트인지, URL인지,

이미지인지, 동영상인지 알 수가 없다. 그래서 '페이로드 타입'이 필요하다.


- 인터넷을 예로 들면, 인터넷에 있는 수많은 콘텐츠들은 모두 MIME타입이라고 하는 타입을 가지고 있다.


- PNG 이미지라면 'image/png', mpeg 동영상이라면 'video/mpeg', 그냥 텍스트라면 'text/plain' ... 이와 마찬가지로 페이로드도 타입을 갖는다.


- 하나의 메시지에 여러 개의 레코드가 존재하므로, 어떤 레코드가 다른 레코드를 참조하는 경우가 생기는데


- 이 경우 레코드에 대한 식별자가 필요하다. 이것을 페이로드 'ID'라고 한다. 대부분의 경우 이 ID가 필요없는데

 그래서 ID는 생략될 수 있다.


- 이렇게 '페이로드', '타입', 'ID' 세 가지가 NDEF 레코드의 주요 구성 요소가 된다. 실제로는 각 구성요소의 길이와 '레코드 헤더'가 추가되기 때문이다.



TNF 와 Type


- MIME 타입 이외의 다른 타입들도 포함하고자 해서, 'Type' 외에 이 Type이 MIME Type 형식으로 정의된 Type인지, 아니면 다른 형식의 Type인지를 구분할 필요가 있을 것인데, 이것이 TNF (Type Name Format)이다.

     즉, 'Type이 어떤 형식으로 되어 있는가'를 나타낸다.















'학습정리 > by aking' 카테고리의 다른 글

사이트정리  (0) 2013.07.21
Java Script  (0) 2013.07.09
HTML & CSS  (0) 2013.06.25
(수정중) GIT Server 구축 및 Log4J 설정  (0) 2013.06.24
by aking 2013. 7. 19. 23:19

http://w3c.github.io/nfc/proposals/intel/nfc.html    


https://wiki.mozilla.org/WebAPI/WebNFC


http://dev.webinos.org/specifications/draft/nfc.html


http://mobile.tutsplus.com/tutorials/android/reading-nfc-tags-with-android/


http://developer.android.com/guide/topics/connectivity/nfc/nfc.html


http://www.cyworld.com/kjky0/3982081

'학습정리 > by Min' 카테고리의 다른 글

프로그래밍 구조  (0) 2013.07.24
AOP(Aspect-oriented programming)  (0) 2013.07.12
nodejs  (0) 2013.07.11
css & selector & 상속  (0) 2013.06.26
박스 모델  (0) 2013.06.25
by 알 수 없는 사용자 2013. 7. 18. 20:19

이 문서는 안드로이드에서 기본적인 NFC 작업을 처리하는 방법을 설명하고 있다. 기본적으로 NDEF 메시지 형식의 NFC 데이터를 안드로이드 프레임워크 API를 사용하여 송수신 하는 방법을 설명하며 NDEF 형식이 아닌 다른 형식의 데이터는 어떻게 작업해야 하는 지는 Advanced NFC를 참조하기 바란다.

 

안드로이드에서 NDEF 데이터를 사용하는 경우는 다음과 같이 2가지 사항이 있을 수 있다.

 

  • NFC 태그의 NDEF 데이터를 읽기
  • 안드로이드 빔( Android Beam™ )을 사용하여 NDEF 메시지를 하나의 장비에서 다른 장비로 전송하기

 

NFC 태그로 부터 NDEF 데이터를 읽는 것은 검색된 NFC 태그들을 분석하는 태그 디스패치 시스템(tag dispatch system)을 이용해 데이터를 적절하게 분류하고 분류된 데이터를 처리할 수 있는 앱을 실행한다. NFC 태그를 처리하기를 희망하는 앱은 인텐트 필터(intent-filter)를 선언하여 데이터 처리에 대해 요청하면 된다.

 

안드로이드 빔은 물리적으로 태깅하는 장비들을 이용하여 장비가 NDEF 메시지를 다른 장비에 푸시할 수 있도록 도와준다. 이 것은 블루투스와 같은 다른 무선 기술보다 더 쉽게 데이터를 보낼 수 있는 방법을 제공한다. 왜냐하면 NFC는 블루투스와 달리 장비 검색과 페어링이라는 단계를 요구하지 않기 때문이다.

 

안드로이드 빔의 연결은 자동으로 2개의 장비가 같은 범위안에 있을 때 연결된다. 안드로이드 빔은 NFC API 집합을 통해 유용하게 사용될 수 있도록 정의되어져 있어 어떠한 앱도 장비간에 정보를 송수신할 수 있도록 설계되어져 있다. 예를 들어 주소록, 브라우저 그리고 유투브 앱은 안드로이드 빔을 통해 주소록 정보, 웹 페이지 그리고 동영상을 다른 장비와 공유할 수 있다.

 

태그 디스패치 시스템

 

안드로이드 장비는 NFC가 환경설정 메뉴에서 비활성화되어져 있지 않다면 일반적으로 스크린이 잠금 해제되어져 있을 때 NFC 태그들을 찾을 것이다.

 

안드로이드 장비가 NFC 태그를 찾았을 때 적절한 동작은 사용하는 앱이 무엇인지 사용자에게 물어보지 않고 대부분 인텐트를 처리할 수 있는 적절한 액티비티가 처리하는 것이다. 왜냐하면 장비들은 매우 가까운 범위에서만 NFC 태그들을 스캔하므로 사용자가 수동적으로 액티비티를 선택하게 만드는 것은 사용자가 태그로 부터 멀어질 때 연결이 끊어져 원하는 작업을 수행하지 못하기 때문이다. 그러므로 당신은 액티비티 선택기가 나타나는 것을 방지되도록 오직 관심있는 태그만을 처리하는 액티비티를 개발해야 한다.

 

이렇게 개발되도록 돕기 위하여 안드로이드는 스캔된 NFC 태그를 분석하고 파싱하고 파싱된 데이터에 관심있는 앱을 탐색하는 특별한 태그 디스패치 시스템을 제공한다. 이 시스템은 다음과 같은 것을 한다.

 

  1. NFC 태그 파싱과 MIME 타입 혹은 태그안에 있는 데이터 페이로드를 구분하는 URI를 알아내기.
  2. 인텐트에 MIME 타입 혹은 URI와 페이로드를 캡슐화하기. 여기까지는 NFC 태그가 MIME 형식들과 URI들에 매핑되는 방법을 설명할 때 자세히 살펴보겠다.
  3. 인텐트에 기반한 액티비티 실행하기. 이것은 앱에 NFC 태그 운송하는 방법에서 설명하겠다.

 

NFC 태그가 MIME 형식들과 URI들에 매핑되는 방법

 

NFC 앱을 작성하기에 앞서 태그 디스패치 시스템에서 각기 다른 NFC 태그를 어떻게 파싱하는지와 NDEF 메시지가 감지될 때 태그 디스패치 시스템이 어떻게 수행되는지를 이해하는 것이 중요하다. NFC 태그들은 많은 기술들이 있으며 여러 다른 방법으로 데이터를 태그에 쓸 수 있다. 안드로이드는 NFC 포럼에서 정의하고 있는 NDEF 표준의 대부분을 지원하고 있다.

 

NDEF 데이터는 하나 혹은 그 이상의 레코드들(NdefRecord)을 포함하고 있는 메시지(NdefMessage) 안에 캡슐화되어져 있다. 각각의 NDEF 레코드는 당신이 생성하고자 한 레코드의 유형에 대한 규약서를 잘 따르는 well-formed 레코드이다.

 

안드로이드는 또한 NDEF 데이터가 포함되지 않은 다른 태그 형식들도 지원한다. 이러한 기능과 연관된 클래스들을android.nfc.tech 패키지에 정의되어져 있다. 이 기술에 대해 더 알아보고 싶으면 Advanced NFC 토픽을 살펴보기 바란다.

 

다른 형식의 태그와 작업하는 것은 태그와 통신하기 위해 쓰기 위해 당신만이 사용하는 프로토콜 스택을 만들어야 하는 것이므로 당신이 많은 안드로이드 장비들에서 지원되고 가능한 쉽게 개발하기 위해 NDEF를 사용할 것을 권한다.

 

참고
NDEF 스펙을 다운받기 위해서는 NFC Forum Specification Download 사이트에서 받을 수 있고 NDEF 레코드들을 어떻게 구성할 수 있는지에 대한 예제는 Creating common types of NDEF records에서 참조할 수 있다.

 

NFC 태그 배경 지식을 가지고 다음 섹션에서는 어떻게 안드로이드에서 NDEF 형식의 태그들을 핸들링하는 지 자세히 살펴보겠다.

 

안드로이드 장비가 NDEF 형식의 데이터를 NFC 태그에서 스캔하면 메시지를 파싱하고 데이터의 MIME 타입 혹은 구별을 위한 URI을 찾는 것을 시도한다. 이것이 수행하려면 먼저 시스템은 전체 NDEF 메시지를 해석하는 방법을 결정하기 위해 NdefMessage 안에 있는 NdefRecord를 읽는다.(하나의 NDEF 메시지는 여러개의 NDEF 레코드들을 가질 수 있다.) well-formed NDEF 메시지안에서 첫번째에는 아래의 필드가 포함되어져 있는 NdefRecord가 있다.

 

3-bit TNF (Type Name Format)

변수 길이 타입 필드를 해석하는 방법을 가리킨다. 유효한 값은 아래 Table 1을 참조하기 바란다.

 

Variable length type

레코드의 타입을 설명한다. 만약 TNF_WELL_KNOWN을 사용하면 이 필드에 RTD(Record Type Definition)을 명시한다. 유효한 RTD 값들은 Table 2를 참조하기 바란다.

 

Variable length ID

레코드를 구분하기 위한 ID. 이 필드는 종종 사용되지 않지만 만약 당신이 태그를 구분하는데 필요할지도 모른다.

 

Variable length payload

당신이 읽거나 쓰기 원하는 실제 데이터 페이로드. 하나의 NDEF 메시지는 여러개의 NDEF 레코드들을 가질 수 있다. 그래서 전체 페이로드가 NDEF 메시지의 첫번째 NDEF 레코드라고 생각하고 처리하지 말아야 한다.

 

태그 디스패치 시스템은 TNF와 NDEF 메시지에서 MIME 타입 혹은 URI와 매핑을 위한 타입 필드들을 사용한다. 만약 성공적이면 실제 페이로드와 함께 ACTION_NDEF_DISCOVERED 인텐트에 정보를 캡슐화한다. 그러나 태그 디스패치 시스템이 첫번째 NDEF 레코드에 기반한 데이터의 유형을 결정할 수 없을 때가 있는데 이것은 NDEF 데이터가 MIME 타입 혹은 URI와 매핑되어져 있지 않거나 NFC 태그가 그 안에 어떠한 NDEF 데이터도 포함하고 있지 않을 때 발생한다. 이러한 경우 태그의 기술과 페이로드에 대한 정보를 가지고 있는 Tag 객체가 ACTION_NDEF_DISCOVERED 인텐트에 캡슐화된다.

 

Table 1은 태그 디스패치 시스템이 TNF와 MIME 타입 혹은 URI를 위한 타입 필드들이 매핑되는 방법을 설명하고 있거나 TNF들이 MIME 타입 혹은 URI와 매핑될 수 없다는 것을 설명하고 있다. 후자의 경우 태그 디스패치 시스템은ACTION_TECH_DISCOVERED 로 대체한다.

 

예를 들어 만약 태그 디스패치 시스템이 TNF_ABSOLUTE_URI 형식의 레코드를 만나면 레코드의 variable length type 필드가 URI에 매핑된다. 태그 디스패치 시스템은 페이로드와 같은 태그에 대한 다른 정보와 함께 ACTION_NDEF_DISCOVERED 인텐트의 데이터 필드안에 URI를 캡슐화 시킨다. 그리고 만약 TNF_UNKNOWN 형식의 레코드라면 TNF_ABSOLUTE_URI 형식의 작업 대신에 태그의 기술들을 캡슐화한 인텐트를 생성한다.

 

Table 1. 지원되는 TNF들과 매핑
Type Name Format (TNF)Mapping

TNF_ABSOLUTE_URI

타입 필드에 따른 URI

TNF_EMPTY

ACTION_TECH_DISCOVERED 로 대체됨

TNF_EXTERNAL_TYPE

타입 필드에 URN을 기반으로 한 URI. URN은 <domain_name>:<service_name>와 같은 단축형식으로 NDEF 타입 필드에 인코딩된다. 안드로이드는 이것을 vnd.android.nfc://ext/<domain_name>:<service_name> 형식으로 매핑한다.

TNF_MIME_MEDIA

타입 필드에 따른 MIME 타입

TNF_UNCHANGED

첫번째 레코드가 유효하지 않음. ACTION_TECH_DISCOVERED로 대체됨

TNF_UNKNOWN

ACTION_TECH_DISCOVERED로 대체됨

TNF_WELL_KNOWN

Record Type Definition (RTD)에 의존적인 MIME 타입 혹은 URI 로 타입 필드에 설정한다. RTD와 RTD의 매핑에 관한 정보는 Table 2.를 참조 바람.

 

Table 2. 지원되는 TNF_WELL_KNOWN을 위한 RTD들과 매핑
Record Type Definition (RTD)Mapping

RTD_ALTERNATIVE_CARRIER

ACTION_TECH_DISCOVERED로 대체.

RTD_HANDOVER_CARRIER

ACTION_TECH_DISCOVERED로 대체

RTD_HANDOVER_REQUEST

ACTION_TECH_DISCOVERED로 대체

RTD_HANDOVER_SELECT

ACTION_TECH_DISCOVERED로 대체

RTD_SMART_POSTER

페이로드 파싱에 따른 URI

RTD_TEXT

text/plain MIME 타입

RTD_URI

URI 페이로드

 

NFC 태그들이 앱에 전달되는 방법

 

태그 디스패치 시스템은 NFC 태그와 태그를 식별하는 정보를 캡슐화한 인텐트를 생성하고 인텐트에 대한 필터를 등록한 앱에게 인텐트를 전송한다. 만약 하나 이상의 앱에서 인텐트를 받기 원한다면 Activity Chooser가 사용자로 하여금 액티비티를 선택하도록 표시된다. 태그 디스패치 시스템은 3개의 인텐트를 정의할 수 있다. 높은 우선순위부터 낮은 우선순위로 정리하면 다음과 같다.

 

  1. ACTION_NDEF_DISCOVERED : NDEF 페이로드가 포함된 태그가 스캔되고 인식가능한 타입을 포함하고 있을 때 액태비티를 시작시키는데 사용되는 인텐트로 제일 높은 우선순위의 인텐트이다. 그리고 태그 디스패치 시스템은 가능하다면 언제든지 다른 인텐트보다 먼저 이 인텐트와 함께 액티비티를 실행한다.
  2. ACTION_TECH_DISCOVERED : ACTION_NDEF_DISCOVERED 인텐트를 핸들링을 위한 액티비티가 없다면 태그 디스패치 시스템은 이 인텐트와 함께 앱이 실행되도록 시도한다. 만약 스캔된 태그가 MIME 타입 혹은 URI와 매핑될 수 없는 NDEF 데이터를 포함하고 있거나 잘 알려진 태그 기술외에 다른 NDEF 데이터를 포함하고 있지 않다면 ACTION_NDEF_DISCOVERED를 먼저 시작되는 것없이 바로 이 인텐트가 시작된다.
  3. ACTION_TAG_DISCOVERED : ACTION_NDEF_DISCOVERED 혹은 ACTION_TECH_DISCOVERED 인텐트를 핸들링하는 액티비티가 없다면 이 인텐트가 시작된다.

 

태그 디스패치 시스템은 기본적으로 다음과 같은 방법으로 동작한다.

 

  1. NFC 태그를 파싱할 때 태그 디스패치 시스쳄에 의해 생성된 인텐트와 함께 액티비티가 시작되도록 시도한다. (ACTION_NDEF_DISCOVERED 혹은 ACTION_TECH_DISCOVERED 중 하나)
  2. 만약 인텐트에 대한 어떠한 액티비티도 없다면 인텐트에 대한 필터링하는 앱이 나타나거나 태그 디스패치 시스템이 가능한 모든 인텐트를 시도할 때까지 다음 낮은 순위의 인텐트(ACTION_TECH_DISCOVERED 혹은 ACTION_TAG_DISCOVERED 중 하나) 와 함께 액티비티가 시작되도록 시도한다.
  3. 만약 어떠한 앱도 인텐트들에 대해 필터링되지 않으면 어떠한 것도 하지 않는다.




가능하다면 언제든지 위 3가지 인텐트 중 가장 구체적인 것이기 때문에 NDEF 메시지들과 ACTION_NDEF_DISCOVERED 인텐트와 함께 동작한다. ACTION_NDEF_DISCOVERED는 사용자에게 최상의 경험을 제공하므로 다른 2가지 인텐트 보다 더 명확하게 앱을 시작시키는 인텐트이다.

 

안드로이드 매니페스트에 NFC 접근 요청하기

 

장비의 NFC 하드웨어에 접근하고 제대로 NFC 인텐트들을 처리하려면 먼저 AndroidManifest.xml 파일에 다음과 같은 항목을 선언해야 한다.

 

  • NFC 하드웨어에 접근하기 위한 NFC <uses-permission> 엘리먼트:

    <uses-permission android:name="android.permission.NFC"/>
  • 앱이 지원하는 최소 SDK 버전. API level 9는 오직 ACTION_TAG_DISCOVERED 만을 지원하고EXTRA_NDEF_MESSAGES extra를 통해 NDEF 메시지를 접근할 수 있으며 다른 태그의 프로퍼티 혹은 I/O 연산을 지원하지 않는다. API level 10은 포괄적인 reader/writer를 지원할 뿐만 아니라 포그라운드(foreground) NDEF 푸싱을 지원하며 API level 14 는 안드로이드 빔을 통해 다른 장비에 NDEF 메시지를 쉽게 푸시하는 방법을 제공하고 NDEF 레코드들을 생성하기 위한 여분의 편리한 메서드들을 제공한다.

    <uses-sdk android:minSdkVersion="10"/>
  • NFC 하드웨어를 지원하는 장비들만 안드로이드 마켓에서 찾을 수 있기 위한 uses-feature 엘리먼트:

    <uses-feature android:name="android.hardware.nfc" android:required="true"/>

    만약 NFC 기능을 사용하지만 굳이 없어도 동작할 수 있는 앱이라면 생략할 수 있다. 만약 사용할 때면 런타임시에 NfcAdapter의 getDefaultAdapter() 가 null인지를 통해 NFC를 사용할 수 있는지를 확인할 수 있다.

 

NFC 인텐트에 대한 필터링

 

당신이 핸들링하기 원하는 NFC 태그가 스캔될 때 앱이 시작되기 위해서는 안드로이드 매니페스트에 NFC 인텐트 중 하나, 둘 혹은 세가지 모두에 대한 필터를 등록할 수 있다. 그러나 보통 앱이 시작할 때 대부분을 제어하는데는 ACTION_NDEF_DISCOVERED 인텐트에 대한 필터만 등록하면 된다. ACTION_NDEF_DISCOVERED에 대한 필터를 등록한 앱이 없거나 페이로드가 NDEF가 아닐때는 ACTION_TECH_DISCOVERED 인텐트가 대체된다.

 

ACTION_TAG_DISCOVERED에 대한 필터링은 너무 일반적인 필터이다. 많은 앱이 ACTION_NDEF_DISCOVERED 혹은 ACTION_TECH_DISCOVERED를 등록하므로 앱은 제일 낮은 우선순위로 시작될 것이다.

 

ACTION_TAG_DISCOVERED는 오직 ACTION_NDEF_DISCOVERED 혹은 ACTION_TECH_DISCOVERED 에 대한 앱이 존재하지 않을 때 최후의 수단으로 사용하기 위할 때만 유효하다.

 

항상 그렇지는 않지만 NFC 태그 배포들은 다양하고 매번 다른 2가지 인텐트들로 대체되는 것이 당신의 제어안에 없기 때문에 당신의 태그에는 쓰여진 데이터와 태그의 유형에서 제어하기 위해 NDEF 형식을 사용할 것을 권유한다.

 

다음 섹션은 인텐트의 각 유형에 따라 필터링 하는 방법을 설명한다.

 

ACTION_NDEF_DISCOVERED

 

ACTION_NDEF_DISCOVERED 인텐트를 필터링 하려면 원하는 데이터의 유형과 함께 인텐트 필터를 선언하면 된다. 다음의 예제는 text/plan MIME 타입의 데이터와 함께한 ACTION_NDEF_DISCOVERED 인텐트를 위한 필터 선언이다.

 

<intent-filter>

<action android:name="android.nfc.action.NDEF_DISCOVERED"/>

<category android:name="android.intent.category.DEFAULT"/>

<data android:mimeType="text/plain"/>

</intent-filter>

 

다음은 http://developer.android.com/index.html 형식을 갖는 URI에 대한 필터 선언 예제이다.

 

<intent-filter>

<action android:name="android.nfc.action.NDEF_DISCOVERED"/>

<category android:name="android.intent.category.DEFAULT"/>

<data android:scheme="http"

android:host="developer.android.com"

android:pathPrefix="/index.html"/>

</intent-filter>

 

ACTION_TECH_DISCOVERED

 

만약 당신의 앱이 ACTION_TECH_DISCOVERED 인텐트에 대해 필터링 하고 싶다면 XML 자원 파일을 생성해야 하며 파일에는 액티비티가 지원하는 기술들이 tech-list 집합에 명시되어 있어야 한다. 당신의 액티비티가 tech-list 집합이 태그에 의해 지원되는 기술들이 부분 집합에 속하는 것인지를 고려하고 싶다면 Tag 클래스의 getTechList() 메서드를 통해 지원되는 기술의 클래스명들을 획득하면 된다.

 

예를 들어 스캔된 태그가 MifareClassic, NdefFormatable 그리고 NfcA를 지원한다면 당신의 tech-list 집합은 세가지 모두, 두개 혹은 기술들 중 하나라도 명시해야 당신의 액티비티와 매칭된다.

 

다음의 샘플은 모든 기술들을 선언한 것이다. 당신은 필요없는 것을 제거하여 사용하기 바란다.

이 파일은 <project-root>/res/xml 폴더안에 저장되어야 한다.

 

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">

<tech-list>

<tech>android.nfc.tech.IsoDep</tech>

<tech>android.nfc.tech.NfcA</tech>

<tech>android.nfc.tech.NfcB</tech>

<tech>android.nfc.tech.NfcF</tech>

<tech>android.nfc.tech.NfcV</tech>

<tech>android.nfc.tech.Ndef</tech>

<tech>android.nfc.tech.NdefFormatable</tech>

<tech>android.nfc.tech.MifareClassic</tech>

<tech>android.nfc.tech.MifareUltralight</tech>

</tech-list>

</resources>

 

또한 여러개의 tech-list로 분류할 수 있다. 각각의 tech-list 집합은 독립적으로 고려되고 액티비티가 어떤 tech-list 집합이 getTechList() 메서드에 의해 반환되는 기술들의 부분 집합인지를 매칭 하는데 고려된다. 이것은 기술의 매칭을 위해 AND 와 OR 의미를 제공한다. 아래의 예제는 NfcA와 Ndef 기술을 지원하거나 NfcB와 Ndef 기술을 지원하는 태그들과 매칭된다.

 

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">

<tech-list>

<tech>android.nfc.tech.NfcA</tech>

<tech>android.nfc.tech.Ndef</tech>

</tech-list>

</resources>

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">

<tech-list>

<tech>android.nfc.tech.NfcB</tech>

<tech>android.nfc.tech.Ndef</tech>

</tech-list>

</resources>

 

AndroidManifest.xml 파일에 <activity> 엘리먼트안에 <meta-data> 엘리먼트를 사용하여 자원 파일을 명시한다.

 

<activity>

...

<intent-filter>

<action android:name="android.nfc.action.TECH_DISCOVERED"/>

</intent-filter>

<meta-data android:name="android.nfc.action.TECH_DISCOVERED"

android:resource="@xml/nfc_tech_filter"/>

...

</activity>

 

태그 기술들과 작업하는 것과 ACTION_TECH_DISCOVERED 인텐트에 대한 자세한 것은 Advanced NFC 문서의 지원되는 태그 기술들과 작업하기(Working with Supported Tag Technologies) 를 참조하기 바란다.

 

ACTION_TAG_DISCOVERED

 

ACTION_TAG_DISCOVERED 에 대한 필터 선언은 다음과 같이 하면 된다.

 

<intent-filter>

<action android:name="android.nfc.action.TAG_DISCOVERED"/>

</intent-filter>

 

인텐트로 부터 정보 획득

 

액티비티가 NFC 인텐트에 의해 시작되면 인텐트로 부터 스캔된 NFC 태그에 대한 정보를 획득할 수 있다. 인텐트에는 다음과 같은 스캔된 태그에 대한 extra들이 포함되어져 있다.

 

 

extra들을 얻기 위해서는 액티비티가 스캔된 태그를 확신시킬 수 있는 NFC 인텐트들 중 하나와 함께 런칭되었는지 체크한 후 인텐트에서 획득한다. 아래의 예제는 ACTION_NDEF_DISCOVERED 인텐트인지 확인 후 인텐트에서 NDEF 메시지를 얻는다.

 

public void onResume(){
super.onResume();
...
if(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())){
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if(rawMsgs != null){
msgs = new NdefMessage[rawMsgs.length];
for(int i =0; i < rawMsgs.length; i++){
msgs[i]=(NdefMessage) rawMsgs[i];
}
}
}//process the msgs array
}

 

선택적으로 당신은 인텐트로 부터 Tag 객체를 얻을 수 있다. 이 객체에는 페이로드가 포함되어 있으며 태그의 기술들을 열람할 수 있다.

 

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

 

NDEF 레코드의 일반적 타입들 생성하기

 

이 섹션에서는 NFC 태그에 쓰거나 안드로이드 빔을 통해 전송하 때 사용하는 NDEF 레코드들의 일반적 타입들을 생성하는 방법과 레코드와 연관된 인텐트 필터를 생성하는 방법도 설명한다. 다음의 모든 예제는 태그 혹은 빔을 통해 NDEF 메시지의 첫번째 NDEF 레코드에 작성하는 예이다.

 

TNF_ABSOLUTE_URI

 

TNF_ABSOLUTE_URI 레코드는 다음과 같이 생성하여 NdefMessage 의 첫번 째 레코드에 저장한다.

 

NdefRecord uriRecord = new NdefRecord(
NdefRecord.TNF_ABSOLUTE_URI ,
"http://developer.android.com/index.html".getBytes(Charset.forName("US-ASCII")),
newbyte[0], newbyte[0]);

 

인텐트 필터는 다음과 같다.

 

<intent-filter>

<action android:name="android.nfc.action.NDEF_DISCOVERED"/>

<category android:name="android.intent.category.DEFAULT"/>

<data android:scheme="http"

android:host="developer.android.com"

android:pathPrefix="/index.html"/>

</intent-filter>

 

TNF_MIME_MEDIA

 

TNF_MIME_MEDIA NDEF 레코드는 다음과 같이 생성하여 NdefMessage 의 첫번 째 레코드에 저장한다.

 

NdefRecord mimeRecord = new NdefRecord(
NdefRecord.TNF_MIME_MEDIA ,
"application/com.example.android.beam".getBytes(Charset.forName("US-ASCII")),
new byte[0], "Beam me up, Android!".getBytes(Charset.forName("US-ASCII")));

 

인텐트 필터는 다음과 같다.

 

<intent-filter>

<action android:name="android.nfc.action.NDEF_DISCOVERED"/>

<category android:name="android.intent.category.DEFAULT"/>

<data android:mimeType="application/com.example.android.beam"/>

</intent-filter>

 

RTD_TEXT를 포함한 TNF_WELL_KNOWN

 

다음과 같이 TNF_WELL_KNOWN NDEF 레코드를 생성한 후 NdefMessage 의 첫번 째 레코드에 저장한다.

 

public NdefRecord createTextRecord(String payload, Locale locale, boolean encodeInUtf8){
byte[] langBytes = locale.getLanguage().getBytes(Charset.forName("US-ASCII"));
Charset utfEncoding = encodeInUtf8 ? Charset.forName("UTF-8"):Charset.forName("UTF-16");
byte[] textBytes = payload.getBytes(utfEncoding);
int utfBit = encodeInUtf8 ? 0:(17);
char status = (char)(utfBit + langBytes.length);
byte[] data =new byte[1+ langBytes.length + textBytes.length];
data[0]=(byte) status;
System.arraycopy(langBytes, 0, data, 1, langBytes.length);
System.arraycopy(textBytes, 0, data,1+ langBytes.length, textBytes.length);
NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
NdefRecord.RTD_TEXT,newbyte[0], data);
return record;
}

 

인텐트 필터는 다음과 같다.

 

<intent-filter>

<action android:name="android.nfc.action.NDEF_DISCOVERED"/>

<category android:name="android.intent.category.DEFAULT"/>

<data android:mimeType="text/plain"/>

</intent-filter>

 

RTD_URI를 포함한 TNF_WELL_KNOWN

 

다음과 같이 TNF_WELL_KNOWN NDEF 레코드를 생성한 후 NdefMessage 의 첫번 째 레코드에 저장한다.

 

byte[] uriField = "example.com".getBytes(Charset.forName("US-ASCII"));
byte[] payload = new byte[uriField.length +1]; //URI Prefix로 1을 추가할 것임.
payload[0] = 0x01//접두사 http://www.
System.arraycopy(uriField, 0, payload, 1, uriField.length); //payload에 URI 삽입
NdefRecord rtdUriRecord = new NdefRecord(
NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI,new byte[0], payload);

 

인텐트 필터는 다음과 같다.

 

<intent-filter>

<action android:name="android.nfc.action.NDEF_DISCOVERED"/>

<category android:name="android.intent.category.DEFAULT"/>

<data android:scheme="http"

android:host="example.com"

android:pathPrefix=""/>

</intent-filter>

 

TNF_EXTERNAL_TYPE

 

다음과 같이 TNF_EXTERNAL_TYPE NDEF 레코드를 생성한 후 NdefMessage 의 첫번 째 레코드에 저장한다.

 

byte[] payload;
...
NdefRecord mimeRecord = new NdefRecord(
NdefRecord.TNF_EXTERNAL_TYPE, "example.com:externalType"new byte[0], payload);

 

인텐트 필터는 다음과 같다.

 

<intent-filter>

<action android:name="android.nfc.action.NDEF_DISCOVERED"/>

<category android:name="android.intent.category.DEFAULT"/>

<data android:scheme="vnd.android.nfc"

android:host="ext"

android:pathPrefix="/example.com:externalType"/>

</intent-filter>

 

안드로이드 장비와 안드로이드 기반이 아닌 장비간에 향상된 방법을 지원하는 위해 보다 일반적인 NFC 태그에 배포가 가능한 TNF_EXTERNAL_TYPE을 사용한다.

 

참고
TNF_EXTERNAL_TYPE에 대한 URNs는 urn:nfc:ext:example.com:externalType의 표준형식을 가진다. 그러나 NFC 포럼의 RTD 규약서에는 URN의 urn:nfc:ext: 부분은 NDEF 레코드로 부터 생략한다. 그래서 당신은 도메인(example.com)과 유형(externalType)을 콜론(':')으로 구분하여 제공해야 한다. TNF_EXTERNAL_TYPE이 디스패치될 때 안드로이드는urn:nfc:ext:example.com:externalType URN을 인텐트 필터에 선언한 것에 따라vnd.android.nfc://ext/example.com:externalType URI로 변경한다.

 

Android Application Records (AAR)

 

안드로이드 4.0 (API level 14)에서 소개되는 Android Application Record (AAR)은 NFC 태그가 스캔될 때 시작되는 앱에게 강력한 확실성을 제공한다. AAR은 NDEF 레코드에 포함된 앱의 패키지 이름을 가진다. NDEF 메시지의 어떠한 NDEF 레코드에도 AAR를 추가할 수 있다. 왜냐하면 안드로이드는 NDEF 메시지 전체에서 AAR들을 찾기 때문이다. 만약 AAR이 발견되면 AAR에 있는 패키지 명에 근거하여 앱을 시작한다. 만약 장비에 해당하는 앱이 없다면 앱을 다운로드 받기 위해 안드로이드 마켓이 런칭된다.

 

AAR은 만약 당신이 같은 인텐트에 대한 필터링을 가진 다른 앱으로 부터 보호하고 잠재적으로 당신이 배치한 특정 태그를 처리하는데 유용하다. AAR은 패키지 이름이 반드시 사용되므로 인텐트 필터링 같은 액티비티 레벨이 아닌 오직 애플리케이션 레벨에서만 지원된다. 만약 액티비티 레멜에서 인텐트를 처리하기를 원한다면 AAR이 아닌 intent-filter 를 사용하기 바란다.

 

만약 태그가 AAR을 포함하고 있다면 태그 디스패치 시스템은 다음과 같은 방법으로 태그 정보를 전달한다.

 

  1. 먼저 인텐트 필터를 사용하는 액티비티를 시작하도록 시도한다. 만약 인텐트와 매칭되는 액티비티와 AAR과도 매칭이 되면 해당 액티비티를 시작한다.
  2. 만약 AAR이 매칭되지 않으며 여러 액티비티가 인텐트를 처리할 수 있거나 어떠한 액티비티도 인텐트를 처리할 수 없다면 AAR에 명시된 앱의 메인 액티비티를 시작한다.
  3. 만약 어떠한 앱도 없다면 AAR에 해당하는 앱을 다운로드 받기 위해 안드로이드 마켓으로 이동한다.

 

참고
당신은 AARs와 포그라운드 디스패치 시스템(foreground dispatch system)과 함께하는 인텐트 디스패치 시스템(intent dispatch system)을 재정의(override)할 수 있다. 포그라운드 디스패치 시스템은 현재 보여지고 있는(foreground) 액티비티가 NFC 태그가 발견되었을 때 우선적으로 가질 수 있게 한다. 이 방법을 통해 액티비티는 AARs과 인텐트 디스패치 시스템을 재정의하기 위해 포그라운드로 있어야 한다.

 

만약 당신은 AAR을 포함하지 않은 스캔되는 태그를 필터링하기 원한다면 일반적으로 인텐트 필터(intent-filter)를 선언할 수 있다. 이 것은 AAR을 포함하지 않은 다른 태그들에 관심있는 앱이라면 유용한 방법이다. 예를 들어 어쩌면 당신은 앱이 당신의 독점적인 태그뿐만 아니라 타사에 의해 배포된 일반적인 태그에 대한 처리도 보증하기 원한다면 AARs가 안드로이드 4.0 이상의 장비에서만 지원된다는 것을 유의하여 태그를 배포할 때 광범위한 장비들을 지원하기 위해 AARs와 MIME 타입/URI의 조합을 사용하기 바란다. 추가적으로 당신이 NFC 태그를 배포할 때 대부분의 장비(안드로이드 장비 뿐만 아니라 다른 장비들)에 대한 지원을 활성화하기 위해 당신의 NFC 태그를 작성하는 방법을 생각하기 바란다. 당신은 앱을 구별하기 쉽게하기 위해 상대적으로 고유한 MIME 타입 혹은 URI를 정의할 수 있다.

 

안드로이드는 AAR을 생성하기 위해 createApplicationRecord() 와 같은 간단한 API를 제공한다. 당신은 오직 NdefMessage안 어디든지 AAR을 포함하면 된는데 AAR이 NdefMessage의 유일한 레코드가 아니라면 NdefMessage의 첫번째 레코드로 사용하지 않아야 한다. 이것은 안드로이드 시스템이 앱이 필터링하는 인텐트를 생성하는데 사용하는 MIME 타입 혹은 태그의 URI를 결정하기 위해 NdefMessage 의 첫번째 레코드를 확인하기 때문이다. 다음은 AAR을 생성하는 예제이다.

 

NdefMessage msg = new NdefMessage(
new NdefRecord[]{
...,
NdefRecord.createApplicationRecord("com.example.android.beam")});

 

다른 장비에 NDEF 메시지들을 빔으로 전송하기

 

안드로이드 빔은 2개의 안드로이드 장비간에 P2P 데이터 교환이 가능하게 한다. 빔을 통해 데이터를 다른 장비에 전송하기 원하는 앱은 포그라운드로 동작하고 있어야 하고 데이터를 받는 장비는 연결 해제 되어져 있어야 한다. 수신 장비와 충분히 근접하게 접촉되면 빔을 쏘는 장비에는 "Touch to Beam" 이라는 사용자 인터페이스가 표시되어 사용자가 수신 장비에 메시지를 전송할지 말지를 선택할 수 있다.

 

참고
포그라운드 NDEF 푸싱은 API level 10에서도 가능하며 안드룅드 빔과 유사한 기능을 제공한다. 하지만 deprecated 상태이다. 더 자세한 것은 enableForgroundNdefPush() 를 살펴 보기 바란다.

 

앱에서 안드로이드 빔을 활성화하기 위해서는 2개의 메서드 중 하나를 호출하면 된다.

 

  • setNdefPushMessage()NdefMessage 를 빔을 통해 메시지를 전송한다. 자동적으로 2개의 장비가 근접해졌을 때 메시지가 전송된다.
  • setNdefPushMessageCallback(): 장비가 데이터를 빔을 통해 전송할 수 있는 범위안에 들어올때 createNdefMessage()가 포함되어져 있는 콜백을 호출한다. 콜백은 전송이 가능할 때 NDEF 메시지를 생성하기 위함이다.

 

액티비티는 오직 한번에 NDEF 메시지를 보낼 수 있다. 그래서 양쪽다 사용할 경우 setNdefPushMessageCallback()이 setNdefPushMessage() 보다 우선순위가 높다 먼저 설정된다.

 

안드로이드 빔을 사용하기 위해서는 다음과 같은 가이드라인을 따라주면 된다.

 

  • 데이터를 빔을 통해 전송하는 액티비티는 포그라원드에 있어야 하며 양쪽의 장비는 스크린이 잠금해제된 상태여야 한다.
  • 보낼 데이터는 NdefMessage 객체로 캡슐화하여야 한다.
  • 빔으로 전송되는 데이터를 수신하는 NFC 장비는 com.android.npp NDEF 푸시 프로토콜(NDEF push protocol) 혹은 NFC 포럼의 SNEP(Simple NDEF Exchange Protocol)을 지원해야 한다. com.android.npp 프로토콜은 안드로이드 2.3(API Level 9)에서 안드로이드 3.2(API Level 13)까지의 장비를 요구하며 com.android.npp 프로토콜과 SNEP 둘 다 지원은 안드로이드 4.0(API Level 14) 이상의 장비를 요구한다.

 

참고
만약 액티비티가 안드로이드 빔이 활성화 되어 있고 포그라운드로 동작하고 있다면 표준 인텐트 디스패치 시스템은 비활성화되어 있어 인텐트 필터에 해당하는 태그가 스캔되어도 전달 받지 못한다. 그러나 만약 포그라운드 디스패치(foreground dispatching)가 활성화 되어있다면 설정된 인텐트 필터에 의한 태그를 스캔할 수 있다. (포그라운드 디스패치는 Advanced NFC 참조)

 

안드로이드 빔을 활성화 하려면

 

  1. 다른 장비에 푸시하기 원하는 NdefRecord들이 포함된 NdefMessage 객체를 생성한다.
  2. NdefMessage 객체와 함게께 setNdefPushMessage() 를 호출 하거나 액티비티의 onCreate() 에서NfcAdapter.CreateNdefMessageCallback 을 파라메터로 하여 setNdefPushMessageCallback() 를 호출한다.

 

일반적으로, 2개의 장비들이 통신할 수 있는 영역에 있을 때 액티비티가 한번에 같은 NDEF 메시지를 푸시하는데는 setNdefPushMessage()를 사용하고 앱이 현재의 상황정보(context)에 따르고 사용자의 앱 안에서 기능의 사용에 따라 NDEF 메시지를 푸시하기 원하면 setNdefPushMessageCallback()을 사용한다.

 

다음의 예제는 앱티비티의 onCreate() 메서드에서 NfcAdapter.CreateNdefMessageCallback을 호출하는 것이다.

 

package com.example.android.beam;

import android.app.Activity;
import android.content.Intent;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.NfcAdapter.CreateNdefMessageCallback;
import android.nfc.NfcEvent;
import android.os.Bundle;
import android.os.Parcelable;
import android.widget.TextView;
import android.widget.Toast;
import java.nio.charset.Charset;

public class BeamextendsActivity implements CreateNdefMessageCallback{
NfcAdapter mNfcAdapter;
TextView textView;

@Override
publicvoid onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView textView = (TextView) findViewById(R.id.textView);

// NFC Adapter가 유효한지 체크
mNfcAdapter =NfcAdapter.getDefaultAdapter(this);
if(mNfcAdapter == null){
Toast.makeText(this,"NFC is not available",Toast.LENGTH_LONG).show();
finish();
return;
}

// 콜백 등록
mNfcAdapter.setNdefPushMessageCallback(this,this);
}

@Override
public NdefMessage createNdefMessage(NfcEventevent){
String text =("Beam me up, Android!\n\n"+
"Beam Time: "+System.currentTimeMillis());
NdefMessage msg = new NdefMessage(
new NdefRecord[]{ createMimeRecord(
"application/com.example.android.beam", text.getBytes())
/**
* Android Application Record (AAR) 설정은 주석처리 했음.
* 장비가 AAR정보의 푸시를 받으면, AAR에 명시된 앱이 실행되는 것을 보장한다.
* AAR은 태그 디스패치 시스템을 재정의한다.
* 당신은 빔 메시지가 수신될 때 이 액티비티가 시작되기를 보장하기 위해 재정의 이전의 것을 다시 추가할 수 있다.
* 지금 이 코드는 태그 디스패치 시스템을 사용한다.
*/

//,NdefRecord.createApplicationRecord("com.example.android.beam")
});
return msg;
}

@Override
public void onResume(){
super.onResume();
// 안드로이드 빔에 의해 시작된 것인지 체크
if(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())){
processIntent(getIntent());
}
}

@Override
public void onNewIntent(Intent intent){
// onResume은 이 메서드 이후에 호출되므로 이 인텐트를 얻어 처리한다.
setIntent(intent);
}

/**
* 인텐트로 부터 NDEF Message를 파싱하고 TextView에 프린트한다.
*/

void processIntent(Intent intent){
textView = (TextView) findViewById(R.id.textView);
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(
NfcAdapter.EXTRA_NDEF_MESSAGES);
// 오직 하나의 메시지가 빔을 통해 전달받는다.
NdefMessage msg = (NdefMessage) rawMsgs[0];
// record 0 은 MIME type을 포함하고, 만약 주석 처리를 제거하고 AAR을 설정했으면 record 1 은 AAR 이다.
textView.setText(newString(msg.getRecords()[0].getPayload()));
}

/**
* 커스텀 MIME 타입을 캡슐화한 NDEF 레코드를 생성한다.
*/

public NdefRecord createMimeRecord(String mimeType, byte[] payload){
byte[] mimeBytes = mimeType.getBytes(Charset.forName("US-ASCII"));
NdefRecord mimeRecord = new NdefRecord(
NdefRecord.TNF_MIME_MEDIA, mimeBytes, new byte[0], payload);
return mimeRecord;
}
}

 

참고로 위의 예제에서 AAR에 관한 코드를 주석처리 했다. 만약 필요하지 않다면 지워도 상관없다. AAR의 주석을 제거하여 코드가 실행되게 한다면 해당 패키지 명으로 된 AAR이 안드로이드 빔 메시지를 항상 수신하도록 명시하는 것이고 만약 장비에 해당 앱이 없으면 안드로이드 마켓에서 다운로드 받도록 이동한다. 그러므로 아래의 인텐트 필터 선언은 AAR을 지원하는 안드로이드 4.0 이후의 장비에서는 선언할 필요가 없다.

 

<intent-filter>

<action android:name="android.nfc.action.NDEF_DISCOVERED"/>

<category android:name="android.intent.category.DEFAULT"/>

<data android:mimeType="application/com.example.android.beam"/>

</intent-filter>

 

위와 같이 인텐트 필터를 선언하면 com.example.android.beam 앱은 현재 NFC 태그를 스캔했거나 com.example.android.beam 형식의 AAR에 대한 안드로이드 빔을 수신했거나 NDEF 형식의 메시지가 android/com.example.android.beam 형식의 MIME 레코드가 포함되어져 있을 때 시작될 것이다.

 

AAR이 앱이 실행되거나 다운로드를 보장한다고 해도 AAR에 의해 명시된 패키지의 메인 액티비티가 항상 실행되는 대신 앱안에서 사용자의 선택에 의한 액티비티가 실행되기를 원한다면 AAR은 액티비티 레벨로 세분하여 실행시킬 수 없으므로 인텐트 필터를 선언 방식을 사용할 것을 권고한다. 그리고 아직까지 많은 안드로이드 장비들이 AAR을 지원하지 않으므로 인텐트 필터 선언 방식으로 하는 것이 당분간은 더 유효할 것이다. 그리고 만약을 대비해서 필터를 선언하는 것뿐만 아니라 NDEF 메시지들의 첫 번째 레코드에 식별 정보를 포함하기 바란다.(식별 번호를 포함하는 것은 "NDEF 레코드의 일반적 타입들 생성하기"를 참조 바람)


'학습 > 용어정리' 카테고리의 다른 글

MVC  (0) 2013.07.04
RequestJS  (0) 2013.07.04
JSON  (0) 2013.07.04
by 알 수 없는 사용자 2013. 7. 18. 12:17

Transaction 사용하기

Transaction 를 사용하기 위해서는 그룹 설정을 해줘야 한다.


service.xml 설정

xmlns:tx="http://www.springframework.org/schema/tx"


http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx.xsd


<context:component-scan base-package="bit.java39.dao, bit.java39.service">


<tx:annotation-driven transaction-manager="transactionManager"/>



serviceImpl.java 설정

@Transactional(rollbackFor=Exception.class)



Aspect-oriented programming








service.xml 


xmlns:aop="http://www.springframework.org/schema/aop"


http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop.xsd



LoggingAspect.java 

@Aspect

@Component

public class LoggingAspect {

// fully-qualified name(QName) = 패키지명 + 클래스명

// AspectJ poingcut expression

// execution(메소드 범위 리턴타입 QName.메소드명(파라미터들)

// 예) execution(public int net.bitacademy.**.add(*))

   // @Before("execution(* bit.java39.dao.*.*(..))")//("표현식")

       // @Before("execution(* *.*(..))")//("표현식")

@Before("execution(* *..dao.*.*(..))")//("표현식")

public void logBefore(JoinPoint joinPoint){

System.out.println(joinPoint.getSignature().getDeclaringTypeName());

System.out.println(joinPoint.getSignature().getName());

System.out.println(Arrays.toString(joinPoint.getArgs()));

System.out.println("============================> 이전...");

}

@After("execution(* *..dao.*.*(..))")//("표현식")

public void logAfter(){

System.out.println("==============================> 이후....");

}

}




AspectJ의 Pointcut 표현식


  □ POJO 클래스를 이용하여 AOP를 적용하는 두 가지 방법

    - XML 스키마를 이용하여 Aspect를 설정하는 방법.

    - @Aspect 어노테이션을 이용하여 Aspect를 설정하는 방법.

    ■ 두 방법의 공통점

      - AspectJ의 문법을 이용하여 Pointcut을 설정.

    ■ <aop:태그>를 이용하여 Aspect를 설정하는 경우

      - execution 명시자를 이용하여 Advice가 적용될 Pointcut을 설정.

 <aop:aspect id="cacheAspect" ref="cache">

    <aop:around method="read"

        pointcut="execution(public * kame.spring.chap03.core.*.readArticle(..))" />

 </aop:aspect>


  □ AspectJ의 Pointcut 표현식

    - AspectJ는 Pointcut을 명시할 수 있는 다양한 명시자를 제공.

    - 스프링은 메서드 호출과 관련된 명시자만을 지원.

    ■ execution 명시자

      - Advice를 적용할 메서드를 명시할 때 사용.

      ○ 기본 형식

 execution(수식어패턴? 리턴타입패턴 패키지패턴?이름패턴(파라미터패턴)

        ● 수식어 패턴

          - 생략가능한 부분.

          - public, protected 등이 옴.

        ● 리턴타입패턴

          - 리턴 타입을 명시

        ● 클래스이름 패턴, 이름패턴

          - 클래스 이름 및 메서드 이름을 패턴으로 명시.

        ● 파라미터패턴

          - 매칭될 파라미터에 대해서 명시.

      ○ 특징

        - 각 패턴은 '*'를 이용하여 모든 값을 표현.

        - '..'을 이용하여 0개 이상이라는 의미를 표현.

      ○ 설정 예

        ● execution(public void set*(..))

          - 리턴 타입이 void이고 메서드 이름이 set으로 시작하고, 파라미터가 0개 이상인 메서드 호출.

        ● execution(* kame.spring.chap03.core.*.*())

          - kame.spring.chap03.core 패키지의 파라미터가 없는 모든 메서드 호출.

        ● execution(*.kame.spring.chap03.core..*.*(..))

          - kame.spring.chap03.core 패키지 및 하위 패키지에 있는 파라미터가 0개 이상인 메서드 호출.

        ● execution(Integer kame.spring.chap03.core.WriteArticleService.write(..))

          - 리턴 타입이 Integer인 WriteArticleService 인터페이스의 write() 메서드 호출.

        ● execution(* get*(*))

          - 이름이 get으로 시작하고 1개의 파라미터를 갖는 메서드 호출.

        ● execution(* get*(*, *))

          - 이름이 get으로 시작하고 2개의 파라미터를 갖는 메서드 호출.

        ● execution(* read*(Integer, ..))

          - 메서드 이름이 read로 시작하고, 첫 번째 파라미터 타입이 Integer이며, 1개 이상의 파라미터를 갖는 메서드 호출.

    ■ within 명시자

      - 메서드가 아닌 특정 타입에 속하는 메서드를 Pointcut으로 설정할 때 사용.

      ○ 설정 예

        ● within(kame.spring.chap03.core.WriteArticleService)

          - WriteArticleService 인터페이스의 모든 메서드 호출.

        ● within(kame.spring.chap03.core.*)

          - kame.spring.chap03.core 패키지에 있는 모든 메서드 호출.

        ● within(kame.spring.chap03.core..*)

          - kame.spring.chap03.core 패키지 및 그 하위 패키지에 있는 모든 메서드 호출.

    ■ bean 명시자

      - 스프링 2.5 버전부터 스프링에서 추가적으로 제공하는 명시자.

      - 스프링 빈 이름을 이용하여 Pointcut을 정의.

      - 빈 이름의 패턴을 갖는다.

      ○ 설정 예

        ● bean(writeArticleService)

          - 이름이 writeArticleService인 빈의 메서드 호출.

        ● bean(*ArticleService)

          - 이름이 ArticleServie로 끝나는 빈의 메서드 호출.

    ■ 표현식 연결

      - 각각의 표현식은 '&&' 나 '||' 연산자를 이용하여 연결 가능.

      ○ @Aspect 어노테이션을 이용하는 경우

        - '&&' 연산자를 사용하여 두 표현식을 모두 만족하는 Joinpoint에만 Advice가 적용.

 @AfterThrowing(

    pointcut = "execution(public * get*()) && execution(public void set*(..))")

 public void throwingLogging() {

    ...

 }

      ○ XML 스키마를 이용하여 Aspect를 설정하는 경우

        - '&&'나 '||' 연산자를 사용.

 <aop:pointcut id="propertyMethod"

     expression="execution(public * get*()) &amp;&amp; execution(public void set*(..))" />

         - XML 문서이기 때문에 값에 들어가는 '&&' '||'를 '&amp;&amp;'로 표현.

         - 설정파일에서 '&&'나 '||' 대신 'and'와 'or'를 사용할 수 있도록 하고 있음.

 <aop:pointcut id="propertyMethod"

     expression="execution(public * get*()) and execution(public void set*(..))" />


  □ 프록시 구현 방식에 따른 execution 적용 차이

    - Pointcut은 실제로 프록시가 구현하고 있는 인터페이스를 기준으로 Pointcut을 적용.

    - 인터페이스를 구현하고 있는 대상 객체에 대해서 Pointcut을 정의하려면 인터페이스를 기준으로 Pointcut을 작성.

 <aop:aspect id="cacheAspect" ref="cache">

    <aop:around method="read"

        pointcut="execution(public * kame..core.ReadArticleServiceImpl.get*(..))" />

 </aop:aspect>


 <bean id="readArticleService" class="kame.spring.chap03.core.ReadArticleServiceImpl" />

         - ReadArticleServiceImpl 클래스가 ReadArticleService 인터페이스를 구현하고 있다면, 

           <aop:around>는 ReadArticleServiceImpl 클래스의 get으로 시작하는 메서드에 적용.

           (<aop:around> 태그에서 명시한 Pointcut은 readArticleService 빈에는 적용되지 않음.)

         - ReadArticleServiceImpl 클래스가 인터페이스를 구현하고 있지 않다면,

           생성된 프록시는 ReadArticleServiceImpl 클래스를 상속받아 생성됨. (Pointcut은 readArticleService 빈에만 적용.)



transaction =>> insert, update, delete


transaction

프로그래밍 (직접 코딩) coding

filter(by aop) coding (코딩) aop ==> 메소드 앞 뒤로 지정

annotation 서버에서 직접 작업(유지보수에 좋다)


ownership – 서비스는 여러개의 Dao를 사용 가능하다.


Signature() 메서드 선언규칙 ==> 리턴타입 메소드명(파라미터)

'학습정리 > by Min' 카테고리의 다른 글

프로그래밍 구조  (0) 2013.07.24
안드로이드 nfc 사이트  (0) 2013.07.18
nodejs  (0) 2013.07.11
css & selector & 상속  (0) 2013.06.26
박스 모델  (0) 2013.06.25
by 알 수 없는 사용자 2013. 7. 12. 13:09
Node.js

 

자바스크립트엔진(V8) 위에서 동작하는 이벤트처리 I/O프레임워크

대부분의 자바스크립트가 웹 브라우저에서 실행되는 것과는 달리, Node.js는 서버 측에서 실행

실직적으로 서버사이드 자바스크립트 실행환경라이브러리, 이렇게 두 가지로 이루어져 있음

확장이 용이한 네트워크 프로그램을 쉽게 만들 수 있도록 함

많은 클라이언트 연결을 동시적으로 다룰 수 있음

 

 

CORDOVA

 

JS를 이용하여 native device 에 접근할 수 있도록 하는 device API set. 이것으로 HTML, CSS, JavaScript를 이용해 앱을 만들 수 있다.

Java, Objective-C 등의 native code 없이 앱을 만들수 있다. 

JS 자체가 web 표준을 따르기 때문에, 대부분의 장비에서 별도 코드 수정 없이 사용가능한 앱을 만들 수 있다는 장점이 있다. Android, iOS, blackberry, Windows Phone, Palm WebOS, Bada, Symbian 모두 사용 가능하다.

 

 

PhoneGap

 

모바일 크로스 플랫폼을 지원하는 오픈소스 모바일 개발 플랫폼입니다.
PhoneGap은 Web 2.0 Expo에서 최우수 Ajax 기술 전문기업으로 이름을 날린, 떠오르는 기업 Nitobi에서 개발, 완전한 오픈소스 프로젝트로 진행.
기 본 HTML을 바탕으로 하며 강력한 자바스크립트 엔진을 이용, 기존의 스마트 폰인 아이폰, 안드로이드, 블랙베리, 윈모바일, 심비안 SDK의 주요 기능들을 지원. 기존 HTML + Javascript 기반의 Web App의 한계를 극복.

 

'학습정리 > by H2K' 카테고리의 다른 글

javaScript, jQuery 함수  (0) 2013.07.08
NegotiatingViewResolver  (0) 2013.07.07
6.25  (0) 2013.06.25
by 알 수 없는 사용자 2013. 7. 11. 20:34

node.js 설정


http://nodejs.org/ 에 접속해서.. 인스톨 파일을 다운받는다.





컴퓨터 속성에서 환경 변수를 변경해야한다.


시스템 변수 - Path

본인 컴퓨터에 맞는 설치 위치의 폴더명을 추가해서 넣으세요

C:\Users\Administrator\AppData\Local\Android\android-sdk\platform-tools;

C:\Users\Administrator\AppData\Local\Android\android-sdk\tools;




명령프롬프트  창을 실행

node 입력




npm install -g cordova






npm info cordova





프로젝트 만들기

cordova create HelloWorld net.bitacademy.java39.hello " Hello World"





cordova platform add android



폴더가 만들어진다.



cordova platforms ls




cordova build





이클립스에서 Hello_World 





안드로이드 어플리케이션을 실행















'학습정리 > by Min' 카테고리의 다른 글

안드로이드 nfc 사이트  (0) 2013.07.18
AOP(Aspect-oriented programming)  (0) 2013.07.12
css & selector & 상속  (0) 2013.06.26
박스 모델  (0) 2013.06.25
폰트와 색으로 장식하기  (0) 2013.06.25
by 알 수 없는 사용자 2013. 7. 11. 13:06




JAVA SCRIPT




  • <script type="text/javascript">

-> 자바 스크립트 타입으로 지정


  • "use strict";

- 브라우저에게 자바스크립트를 엄격하게 검사할 것을 요구.

- 최신의 브라우저에 추가된 명령어로, "" 넣은 이유는 이전 브라우저에서

오류가 발생할 수 있기 때문에 미연의 방지차 정의 된 것이다.



  • 배경지식

- 변수는 페이지 단위로 관리된다.

- 페이지와 페이지 사이에는 절대 공유할 수 없다.

- 글로벌 변수 => 그 페이지 내에서 어디서든 접근할 수 있는 변수






변수와 자료형




- 변수 선언: 데이터형을 선언하지 않는다.

var a;                        // 변수에는 어떤 값을 넣을 수 있는가? - 마음대로.

a = 10; // number 데이터형

a = "홍";         // string 데이터형

a = true;         // boolean 데이터형

a = new Object(); // Object 데이터형

a = function() {}; // function 데이터형

- 출력: 브라우저의 콘솔 창으로 출력할 수 있다.

console.log(10); // 개발하는 동안 확인용으로 사용한다.




  • 바인딩이란?

- 변수의 데이터형의 결정되는 것.

- 값을 할당한 후 결정 된다.


var b;    // 바인딩 안되어 있는 상태: undefined

// 해당 변수에 값이 할당되지 않은 상태. 즉, 데이터형이 결정되어 있지 않은 상태.


console.log(b);

- 변수의 데이터형 알아내기: 바인딩 된 후 변수의 데이터형 확인 typeof()


b = 10;

console.log(typeof(b));


b = 10.5;

console.log(typeof(b));

- 동적 바인딩(dynamic binding <> static binding)

-> 예시) Java, C, C++, C#

- 변수의 데이터 형은 고정되어 있지 않다. 값을 할당하는 순간 결정되기 때문이다.

- 값을 할당할 때 데이터형이 결정되는 것.

- 가능한 변수의 용도를 결정했으면 그대로 사용.






자료형 검사: typeof()

자료형: null, undefined




b = "홍길동";

console.log(typeof(b));



b = true;

console.log(typeof(b));


b = null;

console.log(typeof(b));



b = new Object();

console.log(typeof(b));



b = function() {};

console.log(typeof(b));

- 이전 자바스크립트 명세에서는 var을 선언하지 않고 만든 변수는 글로벌 변수로 설정.

- 현재는 반드시 var을 붙여야 한다.

- 브라우저에게 자바스크립트 문법을 엄격하게 검사할 것을 요구. 'use strict";




  • 중복 선언?

- 오류가 아니다. 기존 변수 덮어쓴다.

var c = 10;

console.log(typeof(c));


var c = "홍길동";

console.log(c);



window 객체: 브라우저에 미리 정의된 객체

-> 브라우저의 정보를 다루는 객체

  • 글로벌 변수나 함수를 포함하고 있다.
  • 글로벌 변수는 모두 window 객체의 프로퍼티로 포함된다.
  • 글로벌 함수도 또한 모두 window 객체에 포함된다.

console.log(window.c);


var d = 20;

window.e = 30;


console.log(e);                                // e앞에 window 객체 레퍼런스가 생략된 것.

console.log(window.e);





기본 라이브러리

prompt(), confirm(), alert()



prompt()

prompt 리턴값은 string이다.


var r = prompt("당신의 나이는?");

console.log(r);



var r2 = confirm("당신은 비트 수강생입니까?", "제목입니까?");

console.log(r);



alert("오호라... 단순 메시지 출력할 때 사용");






배열: [ , , , ]


var names = ["홍길동", "임꺽정", "유관순", 20, function(){}, true];

for(var i = 0; i < names.lenght; i++){

console.log(names[0]);

}





    ==와 ===의 차이


var x1 = 20;

var x2 = "20";

if(x1 == x2){                                // 암시적 형변환이 발생함.

console.log("x1 == x2");

}


암시적 형변환 없이 정확하게 데이터형과 값이 일칳나는지 확인하고 싶다면?

if(x1 === x2){

console.log("x1 === x2");

} else {

console.log("x1! ==  x2");

}





console.log('52 + 273');            // 1번


console.log(52 + 273);              // 2번


console.log(parseInt('52') + 273);            // 3번: parseInt로 썼을 경우 데이터형으로 변환한다.

        

console.log(52 + '273');            // 4번


console.log('52' + '273');            // 5번





조건 연산자


var a = (20 > 30) ? "와우 정말?! ㅎㅎ" : "어후,,,";

console.log(a);




||와 &&의 다른 활용

var x = 20;


var b = true || (x = 30);

console.log(x, b);


var b = false || (x = 30);

console.log(x, b);


var age = prompt("니 나이 몇이냐?", "18");

// (age > 18) || console.log("미성년자입니다.");

(age < 19) && console.log("미성년자입니다.");





'학습정리 > by aking' 카테고리의 다른 글

사이트정리  (0) 2013.07.21
안드로이드 NFC  (0) 2013.07.19
HTML & CSS  (0) 2013.06.25
(수정중) GIT Server 구축 및 Log4J 설정  (0) 2013.06.24
by aking 2013. 7. 9. 18:34

**자바스크립트의 배경지식


1. 변수는 페이지 단위로 관리된다.

- 페이지 내에 있는 변수는 다른 페이지에서 접근할 수 없다.

- 페이지와 페이지 사이에는 절대로 변수를 공유할 수 없다.

탭과 탭은 별도의 윈도우라는 것을 알아야 한다.

2.  글로벌 변수는 그 페이지 내에서 어디서든 접근할 수 있는 변수.

-예전에는 오프너라 해서 다른 창에 있는 변수 접근이 가능했으나

현재는 자바스크립트 보안 관계로 다른 창의 변수를 가져올 수 없도록 하였다


0. 변수와 자료형

- 변수 선언 : 자바스크립트는 데이터형을 선언하지 않는다.


var a; => 이 변수에는 어떠한 값을 넣어도 가능하다.

a=10;         (number 데이터형)

a=홍길동;   (String 데이터형)

a= true;       (boolean 데이터형)

a= new Object();     (Object 데이터형)

a=function() {};     ( function 데이터형)


- 출력 : 브라우저의 콘솔 창으로 출력할 수 있다.

ex> console.log(10);


- 바인딩 : 변수의 데이터형이 결정되는 것

언제 결정이 되는 것인가? => 값을 할당한 후 결정된다.

ex>var b; => 바인딩이 안되어 있는 상태

console.log(b);


1. 자료형 검사 : typeof()

자료형 : null, undefined


- 변수의 데이터형 알아내기 : 바인딩 된 후 변수의 데이터 형 확인 typeof()

ex>b=10;

console.log(typeof(b));


b=10.5;

console.log(typeof(b));


-동적 바인딩(dynamic binding <> static binding ex: Java, C, C++, C#)

-변수의 데이터 형은 고정되어 있지 않다. 값을 할당하는 순간 결정되기 때문이다.

자바스크립트는 값을 할당할 때 데이터 형이 결정되는 것이 특징이다.

가능한 변수의 용도를 결정했으면 그대로 사용하여야 한다.


ex> b=”홍길동”;

console.log(typeof(b));


b= true;

console.log(typeof(b));


b=null;

console.log(typeof(b));


b= new Object();

console.log(typeof(b));


b = function(){};

console.log(typeof(b));


- 이전 자바스크립트 명세에서는 var를 선언하지 않고 만든 변수는 글로벌 변수로 설정

현재는 반드시 var를 붙여야 한다.


* “use strict”;

=> 브라우저에게 자바스크립트 문법을 엄격하게 검사할 것을 요구.

스크립트를 진행하기 전에“use strict”;를 선언함으로 해서 브라우저에게 자바스크립트를 엄격하게 검사할 것을 요구한다.

이 문법은 최근 문법이다.


예전 브라우저는 일반 문자열로만 바라보지만

최근 브라우저는 문자열로 선언하더라도 일반 문자열로 보지 않고  엄격한 검사를 요구한다는 것을 인지한다.


c=20;

console.log(typeof(c));

=> 최근 브라우저는 인지를 한다. 유지보수가 어려운 상황이 발생할 수 있으므로

미연에 방지하기 위해서 “use strict” 문법을 먼저 선언해주는 것이다.

선언해주는 동시에 위에 예시는 검사해서 에러를 발생시킨다.

그러므로 이 문법을 사용할 경우에는  반드시 ‘var’ 를 통한 변수선언을 해 주어야 한다.


- 중복 선언은 오류가 아니다. 단, 기존 변수를 덮어쓴다.

var c =”홍길동”;

console.log(c);


- window 객체 : 브라우저에 미리 정의된 객체. 브라우저의 정보를 다루는 객체.

. 글로벌 변수나 함수를 포함하고 있다.

. 글로벌 변수는 모두 window 객체의 프로퍼티로 포함된다.

. 글로벌 함수도 또한 모두 window 객체에 포함된다.

ex> console.log(window.c);


ex> var d = 20;

window.e=30;


console.log(e); => e 앞에는 window 객체 레퍼런스가 생략된 것.

console.log(window.d);


2. prompt(), confirm()

ex >

var r = prompt(“당신의 나이는?”);

console.log(r);


var r2= confirm(“당신은 비트 수강생입니까?”);

console.log(r2);


alert(“오호라.... 단순 메시지 출력!”);


3. 배열 [ , , , ] ;

배열은  [ ] 내부에 데이터 형을 따지지 않으므로 어떤 형이든 입력이 가능하다.

ex>

var names = [“홍길동”, “임꺽정”, “유관순”];

for(var i = 0; i < names.length; i++){

console.log(names.[i]);

}


4. == 와 ===의 차이

var x1 = 20;

var x2 = “20”;

if(x1 == x2){

console.log(“x1 == x2”);

}

=> 앞의 값과 데이터 형을 맞추기 위해서 암시적 형변환이 발생한다.


- 암시적 형변환 없이 정확하게 데이터형과 값이 일치하는지 확인하고 싶다면?

“ === ” 활용

ex>

if(x1 === x2){

console.log(“x1 === x2”);

}else{

console.log(“x1 !== x2”);

}


* alert 창 사용

ex>

<script>

alert(‘This\’ is “String”);

alert(“This\” is ‘String’);

</script>


=> alert 창 내부에 “ ” , ‘ ’ 둘 다 사용이 가능하다. 단, 창 내부에 두가지를 혼용할 수는 없다.

혼용하기 위해서는 ‘ \ '을 위에 예시 처럼 사용하면 된다.



* 숫자와 문자열을 덧셈할 경우의 예시

<script>

       // 1번

       console.log('52 + 273');

       // 2번

       console.log(52 + 273);

       // 3번

       console.log('52' + 273);

       // 4번

       console.log(52 + '273');

       // 5번

       console.log('52' + '273');

   </script>


=>  결과

52 + 273

325

52273

52273

52273

=> 문자열은 문자열 그대로 출력/ 숫자는 그대로 더한 결과값 출력

문자 + 숫자일 경우 문자 + 문자일 경우에는 합계가 아닌 이어 붙인 결과가 출력된다.


문자와 숫자를 더해서 합한 결과를 얻고자 할 경우에는 타입 캐스팅 하는 방법을 사용해야 한다.

ex> console.log((number)‘52’ + 273);



 <script>

       alert(Boolean(0));

       alert(Boolean(NaN));

       alert(Boolean(''));

       alert(Boolean(null));

       alert(Boolean(undefined));

   </script>


=> alert 창으로  모두 false 가 출력됨



* 조건연산자

var a = (20 > 30) ? "와~ 정말?" : "그러면 그렇지...";

console.log(a);


조건 연산자를 사용할 경우 출력은 true, false로 판단해서 결과 출력.

-> 예시문 출력결과 : "그러면 그렇지..."


*  ||와 &&의 다른 활용

ex> var x = 20;

var b = true || (x=30);


‘ || ’ 를 사용할 경우 앞에 값이 true 인 경우에는 뒤에 값은 검사하지 않고 앞의 값으로 출력


ex> var age = Number(prompt("너 나이 몇이야?", "18"));

(age > 18) || console.log("미성년입니다.");





' || ' 를 사용할 경우에는

둘 중 하나라도 true이면 true

둘 다 false일 경우는 false

둘 다 true인 경우는 true


'&& '를 사용할 경우에는

둘 중 하나라도 false이면 false

둘 다 true여야만 true이다.

둘 다 false일 경우는 당연히 false이다.



** 조건문

ex>

* if ~ else

 <script>

       // 변수를 선언합니다.

       var date = new Date( );

       var hour = date.getHours( );

       // 조건문

       if (hour < 11) {

           // "hour < 11"가 참일 때 실행합니다.

           alert('아침 먹을 시간입니다.');

       } else if (hour < 15) {

           // "hour < 11"이 거짓이고 "hour < 15"가 참일 때 실행합니다.

           alert('점심 먹을 시간입니다.');

       } else {

           // "hour < 15"가 거짓일 때 실행합니다.

           alert('저녁 먹을 시간입니다.');

       }

   </script>


원래는 else if가 자바에서는 아래와 같이 활용되어야 하는 것이 정확하다.

if (hour < 11) {

           // "hour < 11"가 참일 때 실행합니다.

           alert('아침 먹을 시간입니다.');

       } else {

      if (hour < 15) {

          // "hour < 11"이 거짓이고 "hour < 15"가 참일 때 실행합니다.

           alert('점심 먹을 시간입니다.');

       } else {

           // "hour < 15"가 거짓일 때 실행합니다.

           alert('저녁 먹을 시간입니다.');

       }

}



** 함수(function)


1. 함수 선언

- 리턴 타입이 없다. => 데이터형이 없기 때문에

- 함수 선언시 주의사항 : 파라미터 변수는 var를 붙이지 않는다.

엄격하게 검사하기 위해서 함수 선언 전에  “use strict”  를 붙인다.

- 모든 근로벌 변수, 함수는 window 객체에 포함된다.

ex>

<script>

console.log(plus(10, 11));

=> plus 함수는 다음 script 엘리먼트에서 만들기 때문에 여기서는 호출할 수 없다.

    스크립트는 순서대로 실행이되므로 함수 이전에 console.log를 찍게 되면 찾을 수 없으므로 결과를 출력할 수 없다.

</script>

<script>

“use strict”;

function plus(a, b){

return a+b;

}


console.log(plus(10, 20));

console.log(window.plus(10, 20));

</script>


2. 자바스크립트 실행 순서

- 자바스크립트는 <script></script> 엘리먼트 단위 순서대로 실행된다.


 script element 안에서는 함수 선언을 먼저 실행하고 => 함수 밖의 문장을 순서대로 실행한다.

- 다음 스크립트 엘리먼트에서는 이전 스크립트 엘리먼트에서 만든 변수나 함수는 글로벌 변수, 함수이므로  접근할 수 있다.

ex>

<script>

console.log(plus(20, 30));

</script>

=> 스크립트 엘리먼트가 나뉘더라도 위에 함수가 먼저 선언되었으므로

정상적으로 실행될 수 있다.


3. 함수 선언2

-  함수 객체를 생성하는 방법

(함수 선언이 아니라 함수를 선언하는 방법으로 객체를 생성한 것이다.)

ex> "use strict";

var plus = function(a, b){

return a+ b;

};


console.log(plus(50, 50));


'학습정리 > by ㅎㅈㅇ' 카테고리의 다른 글

실무 web 프로그래밍의 구성  (0) 2013.06.27
by 알 수 없는 사용자 2013. 7. 9. 17:39
| 1 2 3 |