2017년 8월 29일 화요일

DIの基本の@Autowiredと@Componentを理解する

http://javatechnology.net/spring/di-autowired-component/

springの特徴としてDIがあります。springではプログラム中でnew(インスタンス化)することなく、インターフェースを使って実クラスをコンポーネント化します。
「@Autowired」と「@Component」はspringのもっとも基本的な部分です。
springのアノテーションで使用頻度は非常に高いです。
今回はコンポーネント化で必要な「@Autowired」と「@Component」の使い方について解説していきます。このサイトではspring3.0以上を対象に解説を進めていきます。


Spring FrameworkとDIについて

https://mookjp.github.io/blog-ja/spring-framework%E3%81%A8di%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/

「初心者のためのSpring Framework入門」グループ

http://libro.tuyano.com/index2?id=4466003

「初心者のためのSpring Framework入門」グループ

SpringFrameworkでアノテーション(@Component、@Autowired)を使ってみる

http://thread.main.jp/spring/annotation.html

SpringFrameworkでアノテーション(@Component、@Autowired)を使ってみる

今回は、@Component、@Autowired、@Serviceを使ってみます。
作る手順は前回と同様ですが、設定ファイルの中身やソースを変えます。

まずは動かしてみましょう

pom.xml は前回と同様です。

Spring用の設定ファイル(SpringTest.xml)を以下を追加します。

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">

<bean id="helloWorld" class="spring.test.SpringBean">
<property name="text" value="Hello World!!" />
</bean>

<context:component-scan base-package="spring.test" />
</beans>

component-scan要素は指定場所(パッケージ)のクラスファイルよりアノテーション(@Component、@Autowiredなど)を読み込みます。
読み込みたいパッケージが複数ある場合は、パッケージ数分、component-scan要素を記述します。このページの下の方の例で2つパッケージを読み込んでいます。


設定ファイルは以上です。次はJavaファイルを作成、修正します。

実行対象となるJavaクラス(HelloWorldTest.java)は修正なしです。

package spring.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class HelloWorldTest {
public static void main(String[] args) {
ApplicationContext context = new FileSystemXmlApplicationContext("C:\\workspace\\springApp\\SpringTest.xml");

SpringBean bean = (SpringBean) context.getBean("helloWorld");
bean.show();
}
}


次に設定ファイルよりSpringがデータをセットするBeanクラス(SpringBean.java)ですが、@Autowiredを付けたフィールドを追加します。

package spring.test;

import org.springframework.beans.factory.annotation.Autowired;

public class SpringBean {
private String text;

@Autowired
private SpringComponent component;

public void show() {
System.out.println(text);
component.show();
}

public String getText() {
return text;
}

public void setText(String text) {
this.text = text;
}
}

最後に@Componentを持つクラス(SpringComponent.java)を作成します。

package spring.test;

import org.springframework.stereotype.Component;

@Component
public class SpringComponent {

public void show() {
System.out.println("Hello Component!");
}
}

準備は以上で終わりです。それでは実行してみましょう。

作成したファイルに問題がなければ、「Hello World!!」と「Hello Component!」と表示されます。

コンポーネント

前回は設定ファイルでオブジェクト作成を行いましたが、今回はアノテーションでオブジェクトの作成を行いました。

component-scanで指定した場所に @Autowired が見つかった場合、@Componentが付いているクラスのオブジェクト(Springが自動的にオブジェクトを生成してくれます)を探し、@Autowiredのインスタンス変数にセットします。

@Componentは幾つか拡張版が用意されており、同じような動きをします。用途によって使い分けて下さい。

@Component
下の3つのアノテーションのベースとなるもの。

@Repository
DBアクセス関連のクラスはこれにする。DBアクセス時の例外がDataAccessExceptionになる。

@Service
処理をひとまとめにするとき、トランザクションのコミット単位の処理などはこれにする。

@Controller
SpringでWebアプリを作るときにMVCのコントローラはこれにする。

インターフェースの活用

今回の例も活用の仕方が分かり難いですが、Componentクラスをインターフェースにすると活用の仕方がわかります。

SpringComponent.java(クラスからインターフェースに変更)

package spring.test;

public interface SpringComponent {

public void show();
}

SpringComponentの実装クラスを用意します。

SpringComponentImpl1.java

package spring.test1;

import org.springframework.stereotype.Component;
import spring.test.SpringComponent;

@Component
public class SpringComponentImpl1 implements SpringComponent {

public void show() {
System.out.println("One");
}
}

SpringComponentImpl2.java

package spring.test2;

import org.springframework.stereotype.Component;
import spring.test.SpringComponent;

@Component
public class SpringComponentImpl2 implements SpringComponent {

public void show() {
System.out.println("Two");
}
}


上記のように実装クラスが複数存在した場合、どの実装クラスを使用するかは、Spring設定ファイルで決められます。
例えば以下の様に spring.test1 を指定した場合、SpringComponentImpl1が使用されます。

設定ファイル

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">

<bean id="helloWorld" class="spring.test.SpringBean">
<property name="text" value="Hello World!!" />
</bean>

<context:component-scan base-package="spring.test" />
<context:component-scan base-package="spring.test1" />
</beans>

実行結果
One

設定ファイルの spring.test1 を spring.test2 に変更すると SpringComponentImpl2 が実行されます。

実行結果
Two

このようにどの実装クラスを使用するにも呼び出し元である HelloWorldTestクラス を修正する必要がありせん。

SpringアノテーションをJavaと並べてまとめ

http://blog.pepese.com/entry/20120613/1339573480

SpringアノテーションをJavaと並べてまとめ

クラス対象のアノテーション

Springアノテーション

@Component
SpringDIコンテナにbeanとして登録したいクラスへ付与する
bean定義ファイル(.xml)のタグと同じ働き
bean名をつけたいときは下記のようにする
@Component("name")
このアノテーションを使うとこはbean定義ファイルに「」を記述しておくこと
@Service
@Componentと基本的には同じ働きをするが、Service層(ビジネスロジック等)を対象としている
Service層とその他のbeanの違いを明確にするために使用する
このアノテーションを使うとこはbean定義ファイルに「」を記述しておくこと
@Repository
@Componentと基本的には同じ働きをするが、Persistence層(DAO等のDBアクセスを行うクラス)を対象としている
Persistence層とその他のbeanの違いを明確にするために使用する
このアノテーションを使うとこはbean定義ファイルに「」を記述しておくこと
@Controller
@Componentと基本的には同じ働きをするが、SpringMVCでControllerの役割となるクラスに付与する
@Scope
beanのスコープを設定する
@Scope("prototype")
@Transactional
トランザクション境界を設定する
メソッドへ適用することもできる
このアノテーションを使うとこはbean定義ファイルに」とトランザクションマネージャの定義を記述しておくこと
トランザクションマネージャの定義例
★idは「transactionManager」である必要がある★
<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
</bean>
■コンポーネントスキャンのオプション

base-package属性で指定したパッケージからスキャン対象を指定する。指定方法は「アノテーション」「タイプ」「正規表現」「aspectJ表記」「TypeFilter実装クラス」から選べる。
base-package属性で指定したパッケージからスキャン対象外とする。指定方法はと同様。
use-default-filters
base-package配下をすべてスキャン対象とするかを指定する。trueの場合、すべてが対象となる。
name-generator
アノテーションで自動登録されるbeanの名前を生成するクラスを指定する。
例
<context:component-scan base-package="jp.hoge" use-default-filters ="false" name-generator="jp.hoge.fuge.NameGenerator">
  <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
■の属性

transaction-manager
トランザクションマネージャの名前を指定する。デフォルトで"transactionManager"が適用される。
proxy-target-class
プロキシを利用してアスペクトを適用する場合には「true」を指定する。
order
アドバイスの適用順を指定する場合に定義する。数字の小さい順に定義されたアドバイスが処理される。
mode
SpringAOP、AspectJどちらのアノテーション定義を適用させる「proxy」、「aspectJ」から指定する。aspectJのload-time-weavingを定義する場合には「aspectJ」を選択する。
フィールド対象のアノテーション

Springアノテーション

@Autowired
自動でフィールドにbeanをインジェクションする
フィールドの型(インターフェース)の実装クラスのbeanを自動的にインジェクションする
フィールドの型(インターフェース)の実装クラスのbeanが複数個ある場合は使用できないが、それでも使いたい場合は@Qualifierと併用する
このアノテーションを使うとこはbean定義ファイルに「 」を記述しておくこと
このアノテーションを使うとこはbean定義ファイルに「」を記述しておくこと
メソッドにも使用することができる
このアノテーションは必須でインジェクションするためbeanが存在しない場合はエラーとなる
エラーとしないための設定は下記
@Autowired(required=false)
@Qualifier
@Autowiredと併用する
@Autowiredでbean名を指定したい場合に使用する
フィールドに対して「@Autowired」と「@Qualifier("name")」を両方つける
@Value
bean名を指定してフィールドにbeanをインジェクションする
@Value("name")
Javaアノテーション

@Inject
Springの@Autowiredと同じ機能
@Resource
bean名を指定してフィールドにbeanをインジェクションする
@Resource(name="name")
Springでこのアノテーションを使うとこはbean定義ファイルに「 」を記述しておくこと
フィールド名のDIコンテナに登録したbean名が同じ場合はbean名指定省略可能
setterメソッドにも使用することができる
Springの@Autowired+@Qualifierと思えばよい
@Autowiredの方が@Resourceより細やかな設定が可能なようだ
メソッド対象のアノテーション

Springアノテーション

@Required
setterメソッド対象
インジェクション必須であることを表す
beanが設定されていない場合は初期化時にエラーになる
Javaアノテーション

@PostConstruct
インジェクション後のBeanの初期化メソッドに設定する
@PreDestroy
インジェクション後のBeanの廃棄メソッドに設定する
Spring2.5.6SEC01で確認。Spring3系でもたぶん大丈夫。

Java(EE)系アノテーションまとめ

CDI

@Named
javax.inject
Inject対象管理
Inject管理対象としてマーク。
@Inject
javax.inject
Inject対象管理
Inject先のフィールド、Injectするための特殊処理を挟むメソッドを指定する。
@Qualifier
javax.inject
Inject対象管理
InjectとProducesを結びつけるマッピング。
@Produces
javax.enterprise.inject
Inject対象管理
Inject元のィールド、Inject元を生成するメソッドを指定する。
@Disposes
javax.enterprise.inject
Inject対象管理
破棄される時に呼ばれるのを指定。
@ApplicationScoped
javax.enterprise.context
Injectスコープ管理
アプリケーション単位での生成と破棄。
@SessionScoped
javax.enterprise.context
Injectスコープ管理
セッション単位での生成と破棄。
@RequestScoped
javax.enterprise.context
Injectスコープ管理
リクエスト単位での生成と破棄。
@ConversationScoped
javax.enterprise.context
Injectスコープ管理
業務単位での生成と破棄。
@Dependent
javax.enterprise.context
Injectスコープ管理
Injectされる元に依存した生成と破棄。
@NormalScoped
javax.enterprise.context
Injectスコープ管理
新しいスコープを定義するために使う。
CommonAnnotations

@PostConstruct
javax.annotation
Inject生成管理
Inject生成完了した時に行う処理。
@PreDestroy
javax.annotation
Inject生成管理
Inject破棄する前に行う処理。
JPA

@Entity
javax.persistence
永続化管理
EntityManagerの管理対象としてマーク。
@Id
javax.persistence
永続化管理
主キーを指定する。ID指定された対象のEntityが複合主キーを持っている場合は、ばらしたフィールドを別途用意して、@Idをつける必要がある。Id関連は@Columnとかで名前を指定した方が良いかも。@JoinColumnとか必要になってくるし。
@OneToMany
javax.persistence
関連数指定
1対多の関係のあるフィールドに指定する。主にListのフィールドに指定する。相手側からの依存が基本の場合はmappedBy属性を指定する。
@ManyToOne
javax.persistence
関連数指定
多対1
@OneToOne
javax.persistence
関連数指定
1対1
@ManyToMany
javax.persistence
関連数指定
多対多
@MapKey
javax.persistence
関連指定
主にMapなフィールドに指定する。※詳細は確認してない。
@Embeddable
javax.persistence
テーブルマッピング
フィールドの形で同じテーブルに組み込むための定義側指定。@PrePersist等は動かない。@MappedSuperclassと@Entityのみで動作する。
@Embedded
javax.persistence
テーブルマッピング
フィールドの形で同じテーブルに組み込むための指定。
@MappedSuperclass
javax.persistence
テーブルマッピング
これを定義したクラスをEntityで継承すると継承元も永続化対象になる。@Embed〜系と違って、@PrePersistを定義しておくと動作する。
@PrePersist
javax.persistence
永続化対象管理
Insert前に行う処理を指定。
@PreUpdate
javax.persistence
永続化対象管理
Update前に行う処理を指定。
@Temporal
javax.persistence
詳細指定
日付系に指定する。
@OrderBy
javax.persistence
詳細指定
順序指定。
@Transient
javax.persistence
詳細指定
永続化対象外マーク。
JSF

@ManagedBean
javax.faces.bean
画面対象管理
@ManagedProperty
javax.faces.bean
画面対象管理
@ApplicationScoped
javax.faces.bean
スコープ管理
@SessionScoped
javax.faces.bean
スコープ管理
@RequestScoped
javax.faces.bean
スコープ管理
@ViewScoped
javax.faces.bean
スコープ管理
@CustomScoped
javax.faces.bean
スコープ管理
@NoneScoped
javax.faces.bean
スコープ管理
@FacesConverter
javax.faces.convert
画面管理
独自クラスをプルダウンとかチェックボックスとかに使う場合の定義に使用する。
@FacesValidator
javax.faces.validator
画面管理
独自の入力のチェックを定義する。フロントエンド用。

TOEIC

http://37toeic.com/
37歳からのTOEIC勉強法

TOEIC

TOEIC(Test Of English for International Communication, 토익)은 영어가 모국어가 아닌 사람들을 대상으로 의사소통 능력을 평가하는 시험(Standardized Test)이다. 1979년 미국 ETS (Educational Testing Service)에서 개발되어, 대한민국에는 1982년 도입되었다.[1]

역사[편집]
도입[편집]
1978년, 일본의 재계 단체인 경단련 (일본어: 経団連 けいだんれん)은 미국 시장 진출 확대에 따라 미국 현지에 파견될 일본인 직원들의 영어 회화 능력의 향상과 평가 기준 마련을 위해 미국 ETS사에 영어 시험 개발을 의뢰하였다.[2] 당시 일본에는 1963년부터 시행 중인 실용영어기능검정시험이 이미 존재했으나, 대체로 중고생을 대상으로 하고 있어서 비즈니스 영어의 평가로는 적절하지 않다는 평가가 있었기 때문이다. ETS의 입장에서도, 아시아권에서 독보적인 지위를 가지고 있던 영어시험인 IELTS에 대항한 시험을 개발할 필요성을 절감하고 있었으므로, 개발에 착수한다. 그 결과, 1979년 12월 일본 국제비즈니스커뮤니케이션협회(IIBC)의 주관으로 최초 토익시험이 일본 국내에서 치러졌다. 제1회 토익시험의 응시자는 총 2,773명 이었으며 평균점수는 578점이었다.[2] 오늘날 토익시험은 전세계에서 매년 700만 명 이상이 응시하는 대표적인 영어시험이 되었다.[3]

한국에는 80년대 후반 도입 후 기업들이 채용 심사에서 토익을 평가 자료로 사용하기 시작하였고, 이로 인해 토익 응시자 가운데 한국은 일본에 이어 가장 많은 비율을 차지해왔다. 한국 내 응시자 수는 매해 증가하여 2003년 169만 명에 이르러 일본을 앞섰다.[4] 한편, 거의 90%에 가까운 응시생이 한국 수험생들이라는 편견이 존재하지만, 사실이 아니다. 이는 일본, 한국의 응시자 수가 각각 200만 명씩 넘기며, 1위, 2위 자리를 서로 바꾸고 있기 때문이다.

2006년 시험 개정[편집]
듣기 섹션이 미국, 캐나다 등의 북미식 영어(North American English) 발음에만 치중해 있다는 비판에 따라, 2006년에 주요한 변화가 있었다. 이러한 변화들은 아래와 같이 추릴 수 있다.

전반적으로 지문의 내용이 더 길어졌다.
PART 1의 경우 사진 내용과 곁들이는 질문이 줄어들었다.
듣기 섹션은 북미식(미국 영어, 캐나다 영어) 발음뿐 아니라 영국식(영국 영어), 호주식(오스트레일리아 영어, 뉴질랜드 영어)의 발음도 추가되었다.
비율은 각각 미국식, 캐나다식, 영국식, 호주식 발음이 각각 25%씩이다. [1].
PART 6은 더 이상 문법의 오류를 찾아내는 문제가 아니다. 실제 비즈니스 환경에 현실적이지 않다는 비판이 제기되었기 때문이다. 그 대신, 이 부분은 시험을 치르는 사람이 완전하지 않은 문장들의 빈칸을 채우는 형식으로 대체되어 있다.
PART 7은 단일 지문뿐 아니라 복수의 지문을 함께 읽고 종합적으로 문제를 푸는 부분이 추가되었다. 관련된 2개의 지문을 읽고 이어지는 문제를 풀어야 한다.
2016년 토익 재개정[편집]
ETS는 2016년 5월 29일부터 2차 개정을 한다고 밝혔다.

듣기
 * 파트 1: 6문제로 줄어든다.
 * 파트 2: 25문제로 줄어든다.
 * 파트 3: 39문제로 바뀌며 3명 이상의 화자가 출현하고 도표나 약도 등 시각 정보가 등장한다.
 * 파트 4: 도표나 약도 등 시각 정보가 추가되는 것을 빼면 다르지 않다.
읽기
 * 파트 5: 30문제로 줄어든다.
 * 파트 6: 4세트를 출제하며 1세트 4문제, 즉 총 16문제로 늘어나며 빈 칸에 문장을 넣는 문제가 출제된다.
 * 파트 7: 문제 수가 54개로 늘어나고 triple passage, 즉 3중 복합문단 지문이 출제되며 문장이 들어갈 곳 찾기 문제가 출제된다. 추가로 지문도 다양해져서 다수가 참여하는 문자메시지나 SNS 대화문도 출제된다.
TOEIC Listening & Reading[편집]
TOEIC Listening & Reading는 크게 청해(Listening Comprehension)와 독해(Reading Comprehension) 부분으로 나눌 수 있고, 세부적으로는 총 7개의 PART로 구분한다.

시험시간은 총 120분이며, 총 200문항으로 점수는 최저 10점에서 최고 990점이다.

Listening Comprehension[편집]
100문항, 45분으로 점수는 최저 5점~최고 495점이다.

PART 1 : 사진 묘사(6문항)
PART 2 : 질의 응답(25문항)
PART 3 : 짧은 대화(39문항)
PART 4 : 짧은 담화(30문항)
Reading Comprehension[편집]
100문항, 75분으로 점수는 최저 5점~최고 495점이다.

PART 5 : 단문 빈칸채우기(30문항)
PART 6 : 장문 빈칸채우기(16문항)
PART 7 : 지문 독해(54문항)
TOEIC Speaking[편집]
TOEIC Speaking Test는 2006년에 새로 도입된 영어 말하기 측정 시험이다. 전세계적인 근무환경에 적절한 내용으로 구성된 11개의 문항으로 구성되어 있으며, 여기에는 업무와 관련된 상황 혹은 문화를 초월한 친숙한 일상생활에서 수행해야 할 과제를 포함하고 있다.[5]

시험 응시는 컴퓨터로 진행되며, 준비 시간을 포함하여 총소요 시간은 40분으로 그 중 실제 시험시간은 20분 정도이다. 총 11개의 문제로 구성되어 있으며 6개의 문제유형으로 나뉜다.[5] 한국에서의 실시와 운영은 'YBM/ 한국TOEIC 위원회'에서 주관한다. 2006년 국내 첫 시행 후 6년 만에 100만 명 이상이 응시하였다.

구성[편집]
문제 1~2 : 문장 읽기 (준비 45초 / 답변 45초)
문제 3  : 사진 묘사 (준비 30초 / 답변 45초)
문제 4~6 : 듣고 질문에 답하기 (준비시간 없음 / 답변 15~30초)
문제 7~9 : 제공된 정보를 사용하여 질문에 답하기 (준비 30초(지문읽는 시간) / 답변 15~30초)
문제 10  : 해결책 제안 (준비 30초 / 답변 60초)
문제 11  : 의견 제시하기 (준비 15초 / 답변 60초)
채점과 성적발표[편집]
문제 유형 간에는 쉬운 문제보다 어려운 문제에 가중치가 적용되고 총점은 0점에서 200점의 점수 범위로 환산된다. 채점 결과 0점에서 200점 사이의 점수와 8개의 등급이 부여된다.[6]

Lv. 1 : 0~30
Lv. 2 : 40~50
Lv. 3 : 60~70
Lv. 4 : 80~100
Lv. 5 : 110~120
Lv. 6 : 130~150
Lv. 7 : 160~180
Lv. 8 : 190~200
비판[편집]
TOEIC에 대해서 몇 가지 비판이 존재한다. 토익 성적 발표가 19일이나 걸려 신속성이 저하된다는 비판이다. 일반적으로 토익 응시자들은 시험 성적을 보고 다음 시험을 응시할지 여부를 결정하는데 성적발표가 늦어져 미리 응시를 하고 기다려야 한다는 점을 악용한 상술이라는 지적이 있다. OMR 채점인데 이렇게 오래 걸릴 이유가 없다는 것이다. 후에 마음에 드는 성적이 나와 시험을 취소해도 절반밖에 환불해주지 않는다.[7] 또한 토익 시험지를 가지고 나올 수 없다는 점도 비판으로 제기된다. YBM 시사닷컴측은 창작물이기 때문에 나눠줄 수 없다는 입장을 보이고 있다. 자신이 어떤 문제를 틀렸는지도 알려주지 않는다는 점도 비판의 대상이다.[8]

활용 분야[편집]
병무청에서 모집하는 카투사와 어학병은 지원 시 토익 점수 제출을 요구받는다. (카투사는 780점 이상, 어학병은 900점 이상)
한국TOEIC위원회에서 최근의 기업 및 기관의 TOEIC, TOEIC Speaking 활용 현황 조사에 따르면, 국내 약 1600여개의 기관에서 채용, 승진에 있어서 TOEIC, TOEIC Speaking 점수를 반영한다고 조사되었다. 신입 채용의 경우 TOEIC과 TOEIC Speaking 일정 점수를 제한하거나, 기준 점수를 제시하지 않았으나 성적을 참고, 제출하게 하는 기업이 많다. 또한 기존 직원들의 영어 능력 강화를 위해 많은 기업에서 TOEIC과 TOEIC Speaking을 도입하여 활용하고 있다.[9]
외교관후보자시험 중 1차 시험에서 응시년도 기준 3년 내에 취득한 토익 870점 이상의 점수 제출을 요구받는다.

A 860点〜
Non-Nativeとして十分なコミュニケーションができる。

自己の経験の範囲内では、専門外の分野の話題に対しても十分な理解とふさわしい表現ができる。Native Speakerの域には一歩隔たりがあるとはいえ、語彙・文法・構文のいずれをも正確に把握し、流暢に駆使する力を持っている。

B 730点〜855点
どんな状況でも適切なコミュニケーションができる素地を備えている。

通常会話は完全に理解でき、応答もはやい。話題が特定分野にわたっても、対応できる力を持っている。業務上も大きな支障はない。正確さと流暢さに個人差があり、文法・構文上の誤りが見受けられる場合もあるが、意思疎通を妨げるほどではない。

C 470点〜725点
日常生活のニーズを充足し、限定された範囲内では業務上のコミュニケーションができる。

通常会話であれば、要点を理解し、応答にも支障はない。複雑な場面における的確な対応や意思疎通になると、巧拙の差が見られる。基本的な文法・構文は身についており、表現力の不足はあっても、ともかく自己の意思を伝える語彙を備えている。

D 220点〜465点
通常会話で最低限のコミュニケーションができる。

ゆっくり話してもらうか、繰り返しや言い換えをしてもらえば、簡単な会話は理解できる。身近な話題であれば応答も可能である。語彙・文法・構文ともに不十分なところは多いが、相手がNon-Nativeに特別な配慮をしてくれる場合には、意思疎通をはかることができる。

E 〜215点
コミュニケーションができるまでに至っていない。

単純な会話をゆっくり話してもらっても、部分的にしか理解できない。断片的に単語を並べる程度で、実質的な意思疎通の役には立たない。

2017년 8월 24일 목요일

display: inline-block;

The old way - using float (notice that we also need to specify a clear property for the element after the floating boxes):

Example
.floating-box {
    float: left;
    width: 150px;
    height: 75px;
    margin: 10px;
    border: 3px solid #73AD21;
}

.after-box {
    clear: left;
}

The same effect can be achieved by using the inline-block value of the display property (notice that no clear property is needed):

Example
.floating-box {
    display: inline-block;
    width: 150px;
    height: 75px;
    margin: 10px;
    border: 3px solid #73AD21;
}



<!DOCTYPE html>
<html>
<head>
<style>
.floating-box {
    display: inline-block;
    width: 150px;
    height: 75px;
    margin: 10px;
    border: 3px solid #73AD21;
}

.after-box {
    border: 3px solid red;
}
</style>
</head>
<body>

<h2>The New Way - using inline-block</h2>

<div class="floating-box">Floating box</div>
<div class="floating-box">Floating box</div>
<div class="floating-box">Floating box</div>
<div class="floating-box">Floating box</div>
<div class="floating-box">Floating box</div>
<div class="floating-box">Floating box</div>
<div class="floating-box">Floating box</div>
<div class="floating-box">Floating box</div>

<div class="after-box">Another box, after the floating boxes...</div>

</body>
</html>


2017년 8월 23일 수요일

bootstrap-select

https://silviomoreto.github.io/bootstrap-select/


jQueryのDeferredオブジェクトについて調べてみた

http://aoe-tk.hatenablog.com/entry/20110515/1305471586

jQueryのDeferredオブジェクトについて調べてみた

最近になって jQuery に Deferred Object と呼ばれるものが追加されたことを知りました。
バージョン1.5から追加になったようです。

ここのところ色々な場面で非同期処理と付き合うことが多かったこともあって
調べてみたのですが、中々嬉しい機能を持っているやつであることが判明したので、
調べた内容についてまとめてみました。

非同期処理は結構書きにくい
jQuery Deferred オブジェクトは非同期処理を書きやすくするために
用意されたものです。

でも何でそんなものが追加されたのでしょうか?

非同期処理は複雑になってくると書きにくいものです。
Ajaxリクエストを例に挙げてみます。

$.ajax({
  url: "serviceA.json",
  success: function(data) {
    // リクエストが成功したときの処理
  },
  error: function(xhr, status, error) {
    // 失敗したときの処理
  }
});

$.ajax({
url: "serviceA.json",
success: function(data) {
    // リクエストが成功したときの処理
},
error: function(xhr, status, error) {
    // 失敗したときの処理
}
});

非同期処理の典型的な書き方ですね。
jQuery.ajax() メソッドを使って serviceA.json というURLにリクエストを書けますが、
レスポンスが返ってくるまで待ちません。

(ajax() メソッドをコールした後, 制御が戻ってくる)

レスポンスが返ってきたら処理を依頼した相手に呼び戻して
 (コールバックして) もらいます。

 そこでコールバック関数を渡しておき、
 その中にリクエストが成功もしくは失敗した際にその結果を
 受け取って行う処理を実装することになります。

 この例では ajax() メソッドの引数に
 渡したオブジェクトの success プロパティにセットした関数、
 もしくは error プロパティにセットした関数です。

これだけなら単純ですが、ここで serviceB.json というWebサービスのURLがあって、
そのURLには serviceA.json から取得した結果を

パラメータとして渡したいというケースはどうでしょう?
ワークフローとしては次のようになります。


これをコードに書くとこんな風になります。

$.ajax({
  url: "serviceA.json",
  success: function(data) {
    $.ajax({
      url: "serviceB.json",
      data: {param: data.param},
      success: function(data) {
        // serviceB.json へのリクエストが成功したときの処理
      }
    });
  },
  error: function(xhr, status, error) {
    // 失敗時の処理
  }
});
一気に見にくくなりましたね...。
無名関数を使わず、
名前付き関数をコールバックに
渡すようにすれば少しましになりますが、
それでもどんな順番で処理が呼び出されるかが
パッと見分かりにくいです。

さらに、serviceC.json というWebサービスURLにも
アクセスする必要があるが、

これは他のURLとは依存関係が無い。

このURLからのデータ取得と、
serviceA.json -> serviceB.json でのデータ取得が
完了したタイミングで

次の処理を行いたい、
なんてことになった場合にはどうなるでしょう...。



こうなるとそれぞれの処理の中で
フラグを管理するような記述が必要になり、
どんどんソースがややこしくなってしまいます。*1

jQuery に新たに追加された Deferred オブジェクトを利用すると、
このような非同期処理の組み合わせをすっきり書けるようになります。

jQuery Deferred オブジェクトとは?
一言でまとめると、非同期処理に対する (複数の) コールバックのキューを
管理するオブジェクトと言ったところでしょうか。

このオブジェクトを利用すると次のようなことを
容易に記述出来るようになります。

処理が成功時のコールバック、
失敗時のコールバックを別々に管理する

ある非同期処理が終わったら次の非同期処理にパイプする

複数の並列で走っている非同期処理が
すべて完了したときに次の処理を実行する

まずは簡単なコード例を以下に示します。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf8">
<script src="jquery-1.6.js"></script>
<script>

$(function() {
    var df = $.Deferred();
    var output = $("#output");
 
    df.then(
        function(arg) {
            output.append("成功側のコールバックが呼ばれました。もらった引数は [" + arg + "] です。");
        },
        function(arg) {
            output.append("失敗側のコールバックが呼ばれました。もらった引数は [" + arg + "] です。");
        }
    ).done(function(arg) {
        output.append("成功時のコールバックをもう一丁登録。");
     
    }).always(function(arg) {
        output.append("どっちでもコールされるはずです。");
     
    });
 
    $("#btnResolve").click(function() {
        df.resolve("成功したよ");
    });
 
    $("#btnReject").click(function() {
        df.reject("失敗したよ");
    });
 
});
</script>
</head>
<body>
<p>
<button type="button" id="btnResolve">Resolveを呼び出します</button>
<button type="button" id="btnReject">Rejectを呼び出します</button>
</p>
<p id="output"></p>
</body>
</html>

jQuery.Deferred() が Deferred オブジェクトのファクトリメソッドになります。

Deferred オブジェクトには
コールバックを登録するためのメソッド (上の例では then, done, always) や
コールバックをキックするためのメソッド (上の例では reject, resolve) があります。

Deferred のコールバックを登録するメソッドは自分自身をリターンするので、
上の例のように登録メソッドをチェインすることでコールバックを複数登録することが可能です。
コールバックは登録順に呼び出されます。

非同期処理を提供する側は Deferred オブジェクトを作って利用側に渡し、
利用側が受け取った Deferred オブジェクトに対して用意されたメソッドを用いて
コールバックを登録することになります。

そして、非同期処理を提供する側は自身の処理が完了したらその処理結果に応じて
Deferred オブジェクトに対してコールバックをキックするメソッド
(成功したときに呼び出すもの、失敗したときに呼び出すものそれぞれあります) を
コールすることになります。

以下、Deferred オブジェクトに用意されたメソッドや
関連するトピックについての説明をまとめてみます。

コールバックをキックするためのメソッド
こちらは Deferred オブジェクトに用意された、
コールバックをキックするためのメソッドです。
非同期処理を提供する側が呼び出すことになります。
大きく分けてresolve系のメソッドとreject系のメソッドがあり、
前者を呼び出すと成功時に呼び出すように登録されたコールバックがキックされ、
後者を呼び出すと失敗時に呼び出すように登録されたコールバックがキックされます。

メソッド 説明
resolve(args) 成功したときにキックするメソッド。done() に登録、もしくは then() の第1引数に登録されたコールバックが呼び出される。このメソッドの引数はコールバックの引数に渡される。
resolveWith(context, [args]) 成功したときにキックするメソッドだが、第1引数にはコールバックの this に設定されるオブジェクトを渡す。つまりコールバックはこの引数のメソッドとして呼び出される。第2引数は配列を渡すことに注意! (内部で Function.prototype.apply が呼び出される)
reject(args) 失敗したときにキックするメソッド。fail() に登録、もしくは then() の第2引数に登録されたコールバックが呼び出される。このメソッドの引数はコールバックの引数に渡される。
rejectWith(context, [args]) 失敗したときにキックするメソッドだが、第1引数にはコールバックの this に設定されるオブジェクトを渡す。
後ろに "With" とついた名前のメソッドは、コールバックを何か特定のオブジェクトのメソッドとして実行させたい時に使います。

コールバックを登録するためのメソッド
対してこちらはコールバックを登録するためのメソッドです。上でも書きましたが、これらのメソッドは自分自身をリターンするので、いくらでもチェインして複数のコールバックを登録することが可能です。

メソッド 説明
done(callback, [callback]) resolve() がコールされた際のコールバック関数を登録する。複数渡すことが可能。
fail(callback, [callback]) reject() がコールされた際のコールバック関数を登録する。
then(doneCallback, failCallback) こちらは第1引数に resolve() がコールされた際の、第2引数に reject() がコールされた際のコールバックを登録する。
always(callback) resolve()、reject() どちらでもコールされるコールバック関数を登録する。finally的な処理を登録するのに使える。
成功時の処理は done、失敗時の処理は fail、まとめて登録するときは then、成功、失敗関係なしに同じ処理を実行するときは always で登録する、と覚えておけばいいでしょう。

Promise とは?
Deferred にはさらに promise() というメソッドが用意されています。これは Deferred オブジェクトから resolve(), reject() メソッドを取り除いた Promise というオブジェクトを返却するためのメソッドです。
非同期処理を利用する側に対しては Promise を返すようにして、利用側から勝手に resolve とか reject を呼ばれないようにするわけですね。

Deferred オブジェクト導入に伴う Ajax 系メソッドの変更
Deferred オブジェクトの導入に伴い、jQuery.ajax() や jQuery.get() などの Ajax 系のメソッドにも変更が入りました。
1.5より前は XMLHttpRequest (以下 XHR) オブジェクトを返していましたが、1.5 からは jqXHR というオブジェクトを返すように変更されています。
このオブジェクトは XHR オブジェクトのスーパーセットで、XHR と同じインターフェースとなっていますが、加えて Promise のインターフェースも備えています。よって次のように jQuery.ajax() の戻り値に対して、done や fail を使ってコールバックを登録出来るようになるわけです。

var jqxhr = $.ajax({ url: "example.json" });
jqxhr.done(function() { // 成功時の処理 }).fail(function() { // 失敗時の処理 });


jQuery.ajax() だけでなく、jQuery.get() や jQuery.post() もこの jqXHR オブジェクトを返すようになっています。これらのメソッドはリクエストに失敗したときのコールバックが登録できず、個人的には使いものにならない印象を持っていたのですが、これでやっと使えるようになりました。

Deferred オブジェクトを使って非同期処理のパイプや待ち合わせを実装してみる
では、[非同期処理は結構書きにくい] のところで挙げた例を Deferred オブジェクトを使って書きなおしてみることにします。
まずは以下の例から。

このように先に実行した非同期処理が完了してから次の非同期処理を実行する (パイプする) 場合には、Deferred.pipe() メソッドを使います。
コードは次のようになります。

var task1, task2, param;
task1 = $.getJSON("serviceA.json").then(
  function(data) {
    param = data.param;
  },
  function(data) {
    // serviceA.json へのリクエストが失敗したときの処理
  }
);
task2 = task1.pipe(
  function() {
    return $.getJSON("serviceB.json", {param: param});
  },
  function() {
    // 失敗しているときは後続を実行したくない場合、このように Deferred を返さずに何らかのエラーを示すものを返すと良い
    return "failed";
  }
).then(
  function(data) {
    // serviceB.json へのリクエストが成功したときの処理
  },
  function(data) {
    // serviceB.json へのリクエストが失敗したときの処理
  }
);
pipe() メソッドは引数を2つ持ち、最初の引数には resolve されたときのフィルタ関数を、2番目の引数には reject されたときのフィルタ関数を渡します。このフィルタ関数は Deferred もしくは Promise オブジェクトを返すことが出来ます。つまり、非同期処理のパイプが可能となります。
上の例では、serviceA.json へのリクエストが成功したときには、新たに serviceB.json に対する Ajax リクエストを実行し、その返り値 (jqXHR オブジェクト、つまり Promise オブジェクト) を返却して、処理をパイプするようにしています。
最初に書いた例と比べて結構見やすくなったのではないでしょうか?

では、こちらの例を書いてみることにします。こちらは複数の Deferred オブジェクトの待ち合わせを行う jQuery.when() メソッドを用いて書くことが出来ます。


コードはこのようになります。(先程のコード例の続きとなるので、併せて見てください)

var task3 = $.getJSON("serviceC.json").then(
  function(data) {
    // serviceC.json へのリクエストが成功したときの処理
  },
  function(data) {
    // serviceC.json へのリクエストが失敗したときの処理
  }
);
$.when(task2, task3).then(
  function(argsFromTask2, argsFromTask3) {
    alert("全部処理が終わりました!");
    // 何か後続の処理
  },
  function(argsFromTask2, argsFromTask3) {
    alert("途中でこけたやつがあります!");
  }
);
jQuery.when() メソッドは、(基本的に) 引数に Deferred オブジェクトを取り、引数に渡された Deferred オブジェクトが全て resolve もしくは reject されたときに、このメソッドが返す Promise オブジェクトの resolve もしくは reject をキックします。
従って、これを使うことで複数並行に走っている非同期処理の待ち合わせをこんなに簡単に書くことが出来るというわけです。
ちなみに when の返す Promise オブジェクトにセットしたコールバックの引数には、when() の引数に渡した全ての Deferred から渡される引数が順番に配列で渡されます。(上のコード例では引数名を分かりやすいように "argsFromTask2"、"argsFromTask3" と書いています)

まとめ
jQuery1.5 になって追加された Deferred オブジェクトを利用すると、書きにくい非同期処理が随分すっきりと書けるようになります。
非同期処理を書きやすくしようとするライブラリは他にもありますが、幅広く使われている jQuery の標準機能として追加されたことは大きいのではないでしょうか。

個人的にはついこの前まで、Flex アプリの開発でこのような複数の非同期処理のパイプや待ち合わせ処理を実装していたので、この機能のありがたみがすごくよく分かりました。というか ActionScript にもこんなライブラリが欲しかった...。





jQuery.each()

jQuery.each()


Categories: Utilities
jQuery.each( array, callback )Returns: Object
Description: A generic iterator function, which can be used to seamlessly iterate over both objects and arrays.
Arrays and array-like objects with a length property (such as a function's arguments object) are iterated by numeric index,
from 0 to length-1. Other objects are iterated via their named properties.

version added: 1.0jQuery.each( array, callback )
array
Type: Array
The array to iterate over.
callback
Type: Function( Integer indexInArray, Object value )
The function that will be executed on every object.
version added: 1.0jQuery.each( object, callback )
object
Type: Object
The object to iterate over.
callback
Type: Function( String propertyName, Object valueOfProperty )
The function that will be executed on every object.
The $.each() function is not the same as $(selector).each(), which is used to iterate, exclusively,
over a jQuery object. The  $.each() function can be used to iterate over any collection,
whether it is an object or an array. In the case of an array, the callback is passed an array index and
a corresponding array value each time. (The value can also be accessed through the this keyword,
but Javascript will always wrap the this value as an Object even if it is a simple string or number value.)
The method returns its first argument, the object that was iterated.

Note: The $.each() function internally retrieves and uses the length property of the passed collection.
So, if the collection has a property called length — e.g. {bar: 'foo', length: 10} —
the function might not work as expected.

$.each([ 52, 97 ], function( index, value ) {
  alert( index + ": " + value );
});
This produces two messages:

0: 52
1: 97

If an object is used as the collection, the callback is passed a key-value pair each time:

var obj = {
  "flammable": "inflammable",
  "duh": "no duh"
};
$.each( obj, function( key, value ) {
  alert( key + ": " + value );
});
Once again, this produces two messages:

flammable: inflammable
duh: no duh

We can break the $.each() loop at a particular iteration by making the callback function return false.
Returning non-false is the same as a continue statement in a for loop; it will skip immediately to the next iteration.

Examples:
Iterates through the array displaying each number as both a word and numeral

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>jQuery.each demo</title>
  <style>
  div {
    color: blue;
  }
  div#five {
    color: red;
  }
  </style>
  <script src="https://code.jquery.com/jquery-1.10.2.js"></script>
</head>
<body>

<div id="one"></div>
<div id="two"></div>
<div id="three"></div>
<div id="four"></div>
<div id="five"></div>

<script>
var arr = [ "one", "two", "three", "four", "five" ];
var obj = { one: 1, two: 2, three: 3, four: 4, five: 5 };

jQuery.each( arr, function( i, val ) {
  $( "#" + val ).text( "Mine is " + val + "." );

  // Will stop running after "three"
  return ( val !== "three" );
});

jQuery.each( obj, function( i, val ) {
  $( "#" + i ).append( document.createTextNode( " - " + val ) );
});
</script>

</body>
</html>
Demo:


Iterates over items in an array, accessing both the current item and its index.


$.each( [ "a", "b", "c" ], function( i, l ){
  alert( "Index #" + i + ": " + l );
});
Iterates over the properties in an object, accessing both the current item and its key.

$.each({ name: "John", lang: "JS" }, function( k, v ) {
  alert( "Key: " + k + ", Value: " + v );
});

AJAX is a developer's dream

AJAX Introduction

AJAX is a developer's dream, because you can:

Update a web page without reloading the page
Request data from a server - after the page has loaded
Receive data from a server - after the page has loaded
Send data to a server - in the background

What is AJAX?
AJAX = Asynchronous JavaScript And XML.

AJAX is not a programming language.

AJAX just uses a combination of:

A browser built-in XMLHttpRequest object (to request data from a web server)
JavaScript and HTML DOM (to display or use the data)
AJAX is a misleading name. AJAX applications might use XML to transport data,
but it is equally common to transport data as plain text or JSON text.

AJAX allows web pages to be updated asynchronously by exchanging data with
a web server behind the scenes. This means that it is possible to update parts of a web page,
without reloading the whole page.

1. An event occurs in a web page (the page is loaded, a button is clicked)
2. An XMLHttpRequest object is created by JavaScript
3. The XMLHttpRequest object sends a request to a web server
4. The server processes the request
5. The server sends a response back to the web page
6. The response is read by JavaScript
7. Proper action (like page update) is performed by JavaScript

jQuery AJAX Methods
AJAX is the art of exchanging data with a server, and update parts of a web page - without reloading the whole page.

The following table lists all the jQuery AJAX methods:

Method Description
$.ajax() Performs an async AJAX request
$.ajaxPrefilter() Handle custom Ajax options or modify existing options before each request is sent and before they are processed by $.ajax()
$.ajaxSetup() Sets the default values for future AJAX requests
$.ajaxTransport() Creates an object that handles the actual transmission of Ajax data
$.get() Loads data from a server using an AJAX HTTP GET request
$.getJSON() Loads JSON-encoded data from a server using a HTTP GET request
$.parseJSON() Deprecated in version 3.0, use JSON.parse() instead. Takes a well-formed JSON string and returns the resulting JavaScript value
$.getScript() Loads (and executes) a JavaScript from a server using an AJAX HTTP GET request
$.param() Creates a serialized representation of an array or object (can be used as URL query string for AJAX requests)
$.post() Loads data from a server using an AJAX HTTP POST request
ajaxComplete() Specifies a function to run when the AJAX request completes
ajaxError() Specifies a function to run when the AJAX request completes with an error
ajaxSend() Specifies a function to run before the AJAX request is sent
ajaxStart() Specifies a function to run when the first AJAX request begins
ajaxStop() Specifies a function to run when all AJAX requests have completed
ajaxSuccess() Specifies a function to run when an AJAX request completes successfully
load() Loads data from a server and puts the returned data into the selected element
serialize() Encodes a set of form elements as a string for submission
serializeArray() Encodes a set of form elements as an array of names and values

Springframework, Ajax에서 한글이 물음표로 나오는 현상

@RequestMapping(value = "/add", produces = "application/text; charset=utf8")
public @ResponseBody String add() {
return "성공했음";
}

@ResponseBody를 통해 내릴 때 명시적으로 produces를 사용해서 utf-8로 인코딩을 해주면
드디어 UTF-8로 인코딩 된 값이 내려간다~!!
json을 내리는 경우라면 application/json; 으로.

AJAX(Asynchronous Javascript and XML)란 무엇인가?

1. AJAX(Asynchronous Javascript and XML)란 무엇인가?

Ajax의 예를들면,
네이버나 다음같은 포털사이트에 가보면,
메인페이지에서 뉴스 등 밑에 < , > 요런 버튼을 눌렀을 때 페이지가 Reloading 되지 않고 뜨는걸 볼 수있다.

보통 웹의 흐름에서는 새로운 URL로 호출 되면서 페이지가 새로 뿌려지지만,
AJAX를 사용하면 일부만을 로드해올 수 있는 것이다.
이름처럼 비동기 통신을 통해서.

2. 어떤 원리이고 흐름인가?

보통 웹사이트 들어갈 때 어떻게 들어가는가?
브라우저 위에 주소창에 URL을 쓰고 들어간다. 그러면 브라우저가 그 URL(서버)로 연결시켜준다.
서버에서 받아온 데이터들을 브라우저가 받아서 파싱해서 뿌려준다.

이게 보통 웹의 흐름이라면,

AJAX는 AJAX 자체가 브라우저라고 생각하면 된다.
URL을 받고, AJAX 내부에서 XMLHttpRequest 통신을 해서 URL(서버)로 연결시켜준다.
서버에서 받아온 데이터들을 AJAX가 받는다.  (어떻게 뿌릴지는 여기서 직접 알아서 한다 ㅋㅋ)

3. 예제

jQuery 같은 프레임워크를 안쓰고 AJAX 통신 하는 예제는
http://mainia.tistory.com/314  <- 이 블로그 참조

jQuery를 이용하면 간단 명료하게 작성 가능하다.

<script  src="http://code.jquery.com/jquery-latest.min.js"></script>

<script>
$(document).ready(function() {
     jQuery.ajax({
           type:"GET",
           url:"/test",
           dataType:"JSON", // 옵션이므로 JSON으로 받을게 아니면 안써도 됨
           success : function(data) {
                 // 통신이 성공적으로 이루어졌을 때 이 함수를 타게 된다.
                 // TODO
           },
           complete : function(data) {
                 // 통신이 실패했어도 완료가 되었을 때 이 함수를 타게 된다.
                 // TODO
           },
           error : function(xhr, status, error) {
                 alert("에러발생");
           }
     });
});
</script>

* <script  src="http://code.jquery.com/jquery-latest.min.js"></script>
이렇게 쓰면 jQuery의 항상 최신 버전을 쓸 수 있다.

보통 complete을 쓸 지, success를 쓸 지는 상황에 따라 다르다.
둘 중 하나만 써야함. 그냥 설명하기 위해 2개 쓴 것임.
(반드시 둘 중 하나만 써야하는건 아니고, 둘다 쓰면 두 번 호출되기 때문에)

4. 값 받아오기

success를 통해 받아온 값을 alert 으로 띄운다거나,
HTML 코드에 추가해서 나타내거나 여러가지 방법으로 보여지도록 할 수 있다.

JSON으로 받는 법을 정리하겠다

JSON 객체는 요렇게 생긴 객체임.

 {"name": "lioncat", "age": 14, "nickname": "qwerty"}

서버 단에서는,
객체에 있는 값을 JSON 형태로 만들어주는 라이브러리들이 있으니
서버는 그 것을 사용해서 JSON으로 리턴 하면된다.

클라이언트에서도 JSON으로 받아야 하는데,
3번 예제처럼 dataType:"JSON" 부분을 써주면 JSON으로 받아진다.

success에서 받아온 객체인 data를 alert으로 띄워보면
[Object object] 라고 나올 것이다.

저것을 어떻게 보느냐???

// success나 complete 안에서 사용

alert(data.name);
alert(data.age);
alert(data.nickname);

* 참고로 jQuery를 사용하지 않은 순수 AJAX를 통해 데이터를 받아왔을 때는 eval 함수를 써야한다.
jQuery의 AJAX에서는 자체적으로 JSON Object로 변환 시켜준 것이기 때문에 그냥 사용할 수 있지만
순수 AJAX에서는 JSON 객체로 변환되지 않았기 때문이다.