ALL DEBUG INFO WARN ERROR FATAL OFF
•All
•DEBUG •DEBUG
•INFO •INFO •INFO
•WARN •WARN •WARN •WARN
•ERROR •ERROR •ERROR •ERROR •ERROR
•FATAL •FATAL •FATAL •FATAL •FATAL •FATAL
•OFF •OFF •OFF •OFF •OFF •OFF •OFF
2017년 8월 29일 화요일
성경말씀
잠언 5장 [현대인의성경]
2. 모든 일을 신중하게 하며 네 말에 지식이 깃들여 있음을 보여 주어라.
잠언 5장 [현대인의성경]
18. 네가 젊어서 얻은 아내를 행복하게 하고 그녀와 함께 즐거워하라.
19. 너는 암사슴처럼 그녀를 사랑스럽고 아름답게 여겨 그 품을 항상 만족하게 여기며 그녀의 사랑을 항상 연모하라.
20. 내 아들아, 네가 무엇 때문에 음란한 여자에게 정을 주어야 하며 남의 아내 가슴을 안아야 하겠느냐?
전도서 9장 [현대인의성경]
1.나는 신중하게 모든 일을 살펴보고 의로운 사람이나 지혜로운 사람이나 그들이 하는 모든 일이 하나님의 손에 달려 있다는 결론을 내렸다. 그러나 사람은 자기에게 기다리고 있는 것이 사랑인지 미움인지 알지 못한다.
2.인간은 하나의 공동 운명체이다. 의로운 자와 악한 자, 선한 사람과 나쁜 사람, 깨끗한 자와 더러운 자, 제사를 드리는 자와 제사를 드리지 않는 자가 다같은 운명이 처해 있으니 선한 사람이 죄인보다 나은 것이 없고 맹세를 하는 자가 맹세하지 않는 자보다 나은 것이 없다.
3.인간이 같은 운명에 처해 있다는 것은 공평하지 못한 일이다. 그래서 사람들은 구태여 선하게 살려고 애쓰지 않고 한평생을 미친 개처럼 살다가 결국 저 세상으로 가고 만다.
4.그래도 살아 있는 자가 희망이 있는 것은 살아 있는 개가 죽은 사자보다 낫기 때문이다.
5.살아있는 자들은 죽을 것을 알지만 죽은 자들은 아무것도 모르며 다시는 상도 받지 못하고 그들의 기억은 영원히 사라지고 만다.
6.그들의 사랑과 미움과 질투도 그들의 죽음과 함께 다 사라지고 그들은 이 세상에서 일어나는 그 어떤 일에도 참여하지 못할 것이다.
7.너는 가서 기쁨으로 음식을 먹고 즐거운 마음으로 포도주를 마셔라. 하나님은 네가 하는 일을 이미 인정하셨다.
8.너는 항상 깨끗한 옷을 입고 머리를 단정하게 손질하여라.
9.이 세상에서 하나님이 너에게 주신 덧없는 삶을 사는 동안 너는 네가 사랑하는 아내와 인생을 즐겨라. 이것은 이 세상에서 네가 수고한 것에 대한 보상이다.
10.너는 무슨 일을 하든지 최선을 다하라. 네가 앞으로 들어갈 무덤에는 일도 없고 계획도 없으며 지식이나 지혜도 없다.
골로새서 3장 [현대인의성경]
5.그러므로 여러분은 땅에 있는 육체의 욕망을 죽이십시오. 음란과 더러운 짓과 정욕과 악한 욕망과 지나친 욕심은 버려야 합니다. 지나친 욕심은 우상 숭배입니다.
잠언 31장 [현대인의성경]
3.너는 네 정력을 여자들에게 소모하지 말아라. 왕들이 그것 때문에 망한다.
2. 모든 일을 신중하게 하며 네 말에 지식이 깃들여 있음을 보여 주어라.
잠언 5장 [현대인의성경]
18. 네가 젊어서 얻은 아내를 행복하게 하고 그녀와 함께 즐거워하라.
19. 너는 암사슴처럼 그녀를 사랑스럽고 아름답게 여겨 그 품을 항상 만족하게 여기며 그녀의 사랑을 항상 연모하라.
20. 내 아들아, 네가 무엇 때문에 음란한 여자에게 정을 주어야 하며 남의 아내 가슴을 안아야 하겠느냐?
전도서 9장 [현대인의성경]
1.나는 신중하게 모든 일을 살펴보고 의로운 사람이나 지혜로운 사람이나 그들이 하는 모든 일이 하나님의 손에 달려 있다는 결론을 내렸다. 그러나 사람은 자기에게 기다리고 있는 것이 사랑인지 미움인지 알지 못한다.
2.인간은 하나의 공동 운명체이다. 의로운 자와 악한 자, 선한 사람과 나쁜 사람, 깨끗한 자와 더러운 자, 제사를 드리는 자와 제사를 드리지 않는 자가 다같은 운명이 처해 있으니 선한 사람이 죄인보다 나은 것이 없고 맹세를 하는 자가 맹세하지 않는 자보다 나은 것이 없다.
3.인간이 같은 운명에 처해 있다는 것은 공평하지 못한 일이다. 그래서 사람들은 구태여 선하게 살려고 애쓰지 않고 한평생을 미친 개처럼 살다가 결국 저 세상으로 가고 만다.
4.그래도 살아 있는 자가 희망이 있는 것은 살아 있는 개가 죽은 사자보다 낫기 때문이다.
5.살아있는 자들은 죽을 것을 알지만 죽은 자들은 아무것도 모르며 다시는 상도 받지 못하고 그들의 기억은 영원히 사라지고 만다.
6.그들의 사랑과 미움과 질투도 그들의 죽음과 함께 다 사라지고 그들은 이 세상에서 일어나는 그 어떤 일에도 참여하지 못할 것이다.
7.너는 가서 기쁨으로 음식을 먹고 즐거운 마음으로 포도주를 마셔라. 하나님은 네가 하는 일을 이미 인정하셨다.
8.너는 항상 깨끗한 옷을 입고 머리를 단정하게 손질하여라.
9.이 세상에서 하나님이 너에게 주신 덧없는 삶을 사는 동안 너는 네가 사랑하는 아내와 인생을 즐겨라. 이것은 이 세상에서 네가 수고한 것에 대한 보상이다.
10.너는 무슨 일을 하든지 최선을 다하라. 네가 앞으로 들어갈 무덤에는 일도 없고 계획도 없으며 지식이나 지혜도 없다.
골로새서 3장 [현대인의성경]
5.그러므로 여러분은 땅에 있는 육체의 욕망을 죽이십시오. 음란과 더러운 짓과 정욕과 악한 욕망과 지나친 욕심은 버려야 합니다. 지나친 욕심은 우상 숭배입니다.
잠언 31장 [현대인의성경]
3.너는 네 정력을 여자들에게 소모하지 말아라. 왕들이 그것 때문에 망한다.
일본어..
貫いて つらぬく [貫く]
1.관통하다
2.꿰뚫다
3.관철하다
あつれき [軋轢]
1.알력
2.마찰
とがり [尖り]
뾰족함
いせい [異性]
이성. 성질이 다름. 또는 다른 성질.
성질이 다름. 또는 다른 성질.
こきゅう [呼吸]
1.호흡
2.고구
3.호궁
すいよせる [吸い寄せる]
1.빨아 당기다
2.끌어 당기다
3.쏠리다
よりつく [寄り付く]
1.가까이하다
2.접근하다
ひんしゅく [顰蹙]
빈축
顰蹙ひんしゅくを買かう 빈축을 사다.
けいえん [敬遠]
경원
1.공경하되 가까이하지는 않음
2.겉으로는 공경하는 체하면서 속으로는 꺼리어 멀리함
3.야구에서, 투수가 고의로 볼을 네 번 연속으로 던져 타자를 일루로 보내는 일
1.관통하다
2.꿰뚫다
3.관철하다
あつれき [軋轢]
1.알력
2.마찰
とがり [尖り]
뾰족함
いせい [異性]
이성. 성질이 다름. 또는 다른 성질.
성질이 다름. 또는 다른 성질.
こきゅう [呼吸]
1.호흡
2.고구
3.호궁
すいよせる [吸い寄せる]
1.빨아 당기다
2.끌어 당기다
3.쏠리다
よりつく [寄り付く]
1.가까이하다
2.접근하다
ひんしゅく [顰蹙]
빈축
顰蹙ひんしゅくを買かう 빈축을 사다.
けいえん [敬遠]
경원
1.공경하되 가까이하지는 않음
2.겉으로는 공경하는 체하면서 속으로는 꺼리어 멀리함
3.야구에서, 투수가 고의로 볼을 네 번 연속으로 던져 타자를 일루로 보내는 일
DIの基本の@Autowiredと@Componentを理解する
http://javatechnology.net/spring/di-autowired-component/
springの特徴としてDIがあります。springではプログラム中でnew(インスタンス化)することなく、インターフェースを使って実クラスをコンポーネント化します。
「@Autowired」と「@Component」はspringのもっとも基本的な部分です。
springのアノテーションで使用頻度は非常に高いです。
今回はコンポーネント化で必要な「@Autowired」と「@Component」の使い方について解説していきます。このサイトではspring3.0以上を対象に解説を進めていきます。
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入門」グループ
「初心者のための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クラス を修正する必要がありせん。
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
画面管理
独自の入力のチェックを定義する。フロントエンド用。
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点
コミュニケーションができるまでに至っていない。
単純な会話をゆっくり話してもらっても、部分的にしか理解できない。断片的に単語を並べる程度で、実質的な意思疎通の役には立たない。
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>
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일 수요일
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 から取得した結果を
パラメータとして渡したいというケースはどうでしょう?
ワークフローとしては次のようになります。
こうなるとそれぞれの処理の中で
フラグを管理するような記述が必要になり、
どんどんソースがややこしくなってしまいます。*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の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 );
});
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
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; 으로.
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 객체로 변환되지 않았기 때문이다.
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 객체로 변환되지 않았기 때문이다.
java hot key
必ず覚えること
検索系
Ctrl + Shift + R -> リソース検索(名称で探す場合、1つのファイル、*利用可能)
Ctrl + H -> 検索(名称、内容で探す場合、複数のファイル、*利用可能)
Ctrl + F -> ファイル内検索(置き換えも含む)
クラス名をの上にカーソルがある場合、
F3 -> クラスの定義、インターフェースの場合、インターフェースの定義
Ctrl + メソッドの上にマウスオーバー ->
インターフェースの場合、定義、実装のメニューが現れ、実装の方を選ぶ。
クラス名をの上にカーソルがある場合、
Ctrl + Shift + G -> ワークスペース内の参照
インポート系
Ctrl + Shift + O -> 不要のimportの整理
Ctrl + Shift + M -> インポートの追加
コメント系
Ctrl + Shift + / -> ブロック コメントの追加
Ctrl + Shift + \ -> ブロック コメントの除去
Ctrl + / -> コメントの切り替え
Ctrl + Shift + J -> Javadoc コメントを追加
その他
Ctrl + Shift + F -> フォーマット
検索系
Ctrl + Shift + R -> リソース検索(名称で探す場合、1つのファイル、*利用可能)
Ctrl + H -> 検索(名称、内容で探す場合、複数のファイル、*利用可能)
Ctrl + F -> ファイル内検索(置き換えも含む)
クラス名をの上にカーソルがある場合、
F3 -> クラスの定義、インターフェースの場合、インターフェースの定義
Ctrl + メソッドの上にマウスオーバー ->
インターフェースの場合、定義、実装のメニューが現れ、実装の方を選ぶ。
クラス名をの上にカーソルがある場合、
Ctrl + Shift + G -> ワークスペース内の参照
インポート系
Ctrl + Shift + O -> 不要のimportの整理
Ctrl + Shift + M -> インポートの追加
コメント系
Ctrl + Shift + / -> ブロック コメントの追加
Ctrl + Shift + \ -> ブロック コメントの除去
Ctrl + / -> コメントの切り替え
Ctrl + Shift + J -> Javadoc コメントを追加
その他
Ctrl + Shift + F -> フォーマット
스프링(Spring) 프레임워크 기본 개념 강좌 (1) - 스프링 이해하기 출처: http://ooz.co.kr/170 [이러쿵저러쿵]
http://ooz.co.kr/170
JAVA개발자를 위한 스프링 기본 개념 이해를 돕기 위한 강좌를 진행할 예정입니다.
스프링을 처음 접하시거나 개념에 대해 이해가 좀 더 필요하신 분들을 위해 작성한 것으로 스프링을 이미 잘 다루시거나 전문적으로 하시는 분들에게는 크게 유용하지 않을 수 있습니다. 또한 실무보다는 개념 위주로 작성된 강좌입니다.
저 또한 스프링 환경에서 개발 경력이 긴 것도 아니고, 스프링에 대해 모든 것을 완벽하게 이해하고, 사용하는 것은 아닙니다.
많이 부족하지만 그래도 제가 JAVA 개발 초기에 스프링에 대해 배우면서 정리하여 PPT로 작성한 내용을 스프링에 처음 입문하시는 분들께 도움이 되었으면 하는 바람으로 포스팅하였습니다.
참고로 본 강좌는 PPT로 작성하였던 강좌를 거의 그대로 작성한 것으로 자세한 설명이 많이 부족할 수도 있습니다.^^
혹시 내용에 대해 이해가 잘 안되시면 댓글로 질문 해주시면 아는 범위 내에서 답변드리도록 하겠습니다.
그리고 잘못된 내용이 있어도 바로 잡아주시면 감사하겠습니다.
그리고 추가적으로 스프링 개념 정리하면서 제 나름대로 정리한 부분이 대부분이나, 점선 박스로 된 내용은 스프링 강좌 이해를 돕기 위해 별도로 수집한 내용으로 다른 출처의 자료를 가져와 인용한 경우가 많습니다. 당시 자료를 만들면서 출처에 대한 부분을 따로 정리하지 않았는데, 뒤 늦게 출처를 확인하여, 코멘트를 단 경우도 많으나, 확인이 불가했던 출처도 있었습니다. 혹시 원 출처를 알려주시면 해당 원 출처에 대해 링크를 걸고, 저작물에 대해 허용이 되었는지 확인하고, 수정하도록 하겠습니다.
-------------------------------------------------------------------------------------------------------------------------------
1. 스프링의 이해
1.1) 스프링 정의
- 간단히 스프링이라 지칭하지만 정확하게는 스프링 프레임워크 (Spring Framework) 라고 하는 것이 정확한 표현.'
* 자바(JAVA) 플랫폼을 위한 오픈소스(Open Source) 애플리케이션 프레임워크(Framework)
* 자바 엔터프라이즈 개발을 편하게 해주는 오픈 소스 경량급 애플리케이션 프레임워크
* 자바 개발을 위한 프레임워크로 종속 객체를 생성해주고, 조립해주는 도구
* 자바로 된 프레임워크로 자바SE로 된 자바 객체(POJO)를 자바EE에 의존적이지 않게 연결해주는 역할.
- POJO 란 Plain Old Java Object 의 약자로 특별한 뜻을 담고 있는 용어는 아니며, 단순히 평범한 자바빈즈(Javabeans) 객체를 의미함.
- 참고 -
JAVA : JAVA 개발 언어
Open Source : 소프트웨어 혹은 하드웨어의 제작자의 권리를 지키면서 원시 코드를 누구나 열람할 수 있도록 한 소프트웨어 혹은 오픈 소스 라이선스에 준하는 모든 통칭을 일컫는다. (소스가 공개되어 여러 개발자가 플랫폼을 함께 개발, 구축, 보완해 나가는 시스템. )
Framework : 개발할 때 설계 기본이 되는 뼈대나 구조 / 환경 (문제 영역을 해결한 재사용, 확장 가능한 라이브러리.)
POJO : http://ko.wikipedia.org/wiki/Plain_Old_Java_Object
1.2) 스프링 특징
* 크기와 부하의 측면에서 경량.
* 제어 역행(IoC)이라는 기술을 통해 애플리케이션의 느슨한 결합을 도모.
* 관점지향(AOP) 프로그래밍을 위한 풍부한 지원을 함.
* 애플리케이션 객체의 생명 주기와 설정을 포함하고 관리한다는 점에서 일종의 컨테이너(Container)라고 할 수 있음.
* 간단한 컴포넌트로 복잡한 애플리케이션을 구성하고 설정할 수 있음.
- 스프링의 특징을 좀 더 상세히 말하자면 -
1) 경량 컨테이너로서 자바 객체를 직접 관리.
각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.
2) 스프링은 POJO(Plain Old Java Object) 방식의 프레임워크.
일반적인 J2EE 프레임워크에 비해 구현을 위해 특정한 인터페이스를 구현하거나 상속을 받을 필요가 없어 기존에 존재하는 라이브러리
등을 지원하기에 용이하고 객체가 가볍다.
3) 스프링은 제어 반전(IoC : Inversion of Control)을 지원.
컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출한다.
4) 스프링은 의존성 주입(DI : Dependency Injection)을 지원
각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.
5) 스프링은 관점 지향 프로그래밍(AOP : Aspect-Oriented Programming)을 지원
따라서 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.
6) 스프링은 영속성과 관련된 다양한 서비스를 지원
iBatis나 Hibernate 등 이미 완성도가 높은 데이터베이스 처리 라이브러리와 연결할 수 있는 인터페이스를 제공한다.
7) 스프링은 확장성이 높음.
스프링 프레임워크에 통합하기 위해 간단하게 기존 라이브러리를 감싸는 정도로 스프링에서 사용이 가능하기 때문에 수많은 라이브러리
가 이미 스프링에서 지원되고 있고 스프링에서 사용되는 라이브러리를 별도로 분리하기도 용이하다.
출처 : http://ko.wikipedia.org/wiki/%EC%8A%A4%ED%94%84%EB%A7%81_%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC
- 또다른 특징 -
* 동적(Dynamic) 웹 사이트 개발을 위한 프레임워크
* 대한민국 전자정부 표준 프레임워크의 기반 기술
1.3) 스프링 역사
* Rod Johnson 이 2002년 출판한 자신의 저서 Expert One-on-One J2EE Design and Development에 선보인 코드가 시초.
* 이 프레임워크는 2003년 6월 최초 아파치 2.0 라이선스로 공개.
* 2004년 3월에 1.0 버전이 릴리즈 되고, 2011년 12월에 현재 최신 버전인 3.1 버전이 공개됨.
참고) 로드 존슨이 자신의 JAVA 개발 경험과 노하우를 기반으로 출판한 책에 샘플 프레임워크를 만들어서 저서에 실었는데, 이것이 차후 스프링이란 자바 표준 프레임워크로 발전하게 됨.
출처: http://ooz.co.kr/170 [이러쿵저러쿵]
JAVA개발자를 위한 스프링 기본 개념 이해를 돕기 위한 강좌를 진행할 예정입니다.
스프링을 처음 접하시거나 개념에 대해 이해가 좀 더 필요하신 분들을 위해 작성한 것으로 스프링을 이미 잘 다루시거나 전문적으로 하시는 분들에게는 크게 유용하지 않을 수 있습니다. 또한 실무보다는 개념 위주로 작성된 강좌입니다.
저 또한 스프링 환경에서 개발 경력이 긴 것도 아니고, 스프링에 대해 모든 것을 완벽하게 이해하고, 사용하는 것은 아닙니다.
많이 부족하지만 그래도 제가 JAVA 개발 초기에 스프링에 대해 배우면서 정리하여 PPT로 작성한 내용을 스프링에 처음 입문하시는 분들께 도움이 되었으면 하는 바람으로 포스팅하였습니다.
참고로 본 강좌는 PPT로 작성하였던 강좌를 거의 그대로 작성한 것으로 자세한 설명이 많이 부족할 수도 있습니다.^^
혹시 내용에 대해 이해가 잘 안되시면 댓글로 질문 해주시면 아는 범위 내에서 답변드리도록 하겠습니다.
그리고 잘못된 내용이 있어도 바로 잡아주시면 감사하겠습니다.
그리고 추가적으로 스프링 개념 정리하면서 제 나름대로 정리한 부분이 대부분이나, 점선 박스로 된 내용은 스프링 강좌 이해를 돕기 위해 별도로 수집한 내용으로 다른 출처의 자료를 가져와 인용한 경우가 많습니다. 당시 자료를 만들면서 출처에 대한 부분을 따로 정리하지 않았는데, 뒤 늦게 출처를 확인하여, 코멘트를 단 경우도 많으나, 확인이 불가했던 출처도 있었습니다. 혹시 원 출처를 알려주시면 해당 원 출처에 대해 링크를 걸고, 저작물에 대해 허용이 되었는지 확인하고, 수정하도록 하겠습니다.
-------------------------------------------------------------------------------------------------------------------------------
1. 스프링의 이해
1.1) 스프링 정의
- 간단히 스프링이라 지칭하지만 정확하게는 스프링 프레임워크 (Spring Framework) 라고 하는 것이 정확한 표현.'
* 자바(JAVA) 플랫폼을 위한 오픈소스(Open Source) 애플리케이션 프레임워크(Framework)
* 자바 엔터프라이즈 개발을 편하게 해주는 오픈 소스 경량급 애플리케이션 프레임워크
* 자바 개발을 위한 프레임워크로 종속 객체를 생성해주고, 조립해주는 도구
* 자바로 된 프레임워크로 자바SE로 된 자바 객체(POJO)를 자바EE에 의존적이지 않게 연결해주는 역할.
- POJO 란 Plain Old Java Object 의 약자로 특별한 뜻을 담고 있는 용어는 아니며, 단순히 평범한 자바빈즈(Javabeans) 객체를 의미함.
- 참고 -
JAVA : JAVA 개발 언어
Open Source : 소프트웨어 혹은 하드웨어의 제작자의 권리를 지키면서 원시 코드를 누구나 열람할 수 있도록 한 소프트웨어 혹은 오픈 소스 라이선스에 준하는 모든 통칭을 일컫는다. (소스가 공개되어 여러 개발자가 플랫폼을 함께 개발, 구축, 보완해 나가는 시스템. )
Framework : 개발할 때 설계 기본이 되는 뼈대나 구조 / 환경 (문제 영역을 해결한 재사용, 확장 가능한 라이브러리.)
POJO : http://ko.wikipedia.org/wiki/Plain_Old_Java_Object
1.2) 스프링 특징
* 크기와 부하의 측면에서 경량.
* 제어 역행(IoC)이라는 기술을 통해 애플리케이션의 느슨한 결합을 도모.
* 관점지향(AOP) 프로그래밍을 위한 풍부한 지원을 함.
* 애플리케이션 객체의 생명 주기와 설정을 포함하고 관리한다는 점에서 일종의 컨테이너(Container)라고 할 수 있음.
* 간단한 컴포넌트로 복잡한 애플리케이션을 구성하고 설정할 수 있음.
- 스프링의 특징을 좀 더 상세히 말하자면 -
1) 경량 컨테이너로서 자바 객체를 직접 관리.
각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.
2) 스프링은 POJO(Plain Old Java Object) 방식의 프레임워크.
일반적인 J2EE 프레임워크에 비해 구현을 위해 특정한 인터페이스를 구현하거나 상속을 받을 필요가 없어 기존에 존재하는 라이브러리
등을 지원하기에 용이하고 객체가 가볍다.
3) 스프링은 제어 반전(IoC : Inversion of Control)을 지원.
컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출한다.
4) 스프링은 의존성 주입(DI : Dependency Injection)을 지원
각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.
5) 스프링은 관점 지향 프로그래밍(AOP : Aspect-Oriented Programming)을 지원
따라서 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.
6) 스프링은 영속성과 관련된 다양한 서비스를 지원
iBatis나 Hibernate 등 이미 완성도가 높은 데이터베이스 처리 라이브러리와 연결할 수 있는 인터페이스를 제공한다.
7) 스프링은 확장성이 높음.
스프링 프레임워크에 통합하기 위해 간단하게 기존 라이브러리를 감싸는 정도로 스프링에서 사용이 가능하기 때문에 수많은 라이브러리
가 이미 스프링에서 지원되고 있고 스프링에서 사용되는 라이브러리를 별도로 분리하기도 용이하다.
출처 : http://ko.wikipedia.org/wiki/%EC%8A%A4%ED%94%84%EB%A7%81_%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC
- 또다른 특징 -
* 동적(Dynamic) 웹 사이트 개발을 위한 프레임워크
* 대한민국 전자정부 표준 프레임워크의 기반 기술
1.3) 스프링 역사
* Rod Johnson 이 2002년 출판한 자신의 저서 Expert One-on-One J2EE Design and Development에 선보인 코드가 시초.
* 이 프레임워크는 2003년 6월 최초 아파치 2.0 라이선스로 공개.
* 2004년 3월에 1.0 버전이 릴리즈 되고, 2011년 12월에 현재 최신 버전인 3.1 버전이 공개됨.
참고) 로드 존슨이 자신의 JAVA 개발 경험과 노하우를 기반으로 출판한 책에 샘플 프레임워크를 만들어서 저서에 실었는데, 이것이 차후 스프링이란 자바 표준 프레임워크로 발전하게 됨.
출처: http://ooz.co.kr/170 [이러쿵저러쿵]
2017년 8월 22일 화요일
c#은 쉽지 않다..
C#만 10년 정도 개발해온 개발자로서 C#으로 DB조회같은 쉬운코딩만 하셔서 그런거 아닐까 하네요 ㅋ
단순crud는 우리회사 6개월차 신입들도 쉽다고 합니다
단순 문법적인 랭귀지 스펙측면이 아닌 C#으로 구현기술적 난이도는 C# 개발 10년차가 넘어가도 어렵습니다. 물론 자바로해도 어렵겠죠. 그게 실력이고 경력입니다.
간단한예로 IEnumerable<T>와 List<T>와 ICollection의 성능상의 차이점을 인지하고 코딩하신다던가
enumerable foreach와 for의 차이점을 알고 코딩한다던가
ToList, ToArray 등의 성능이슈에 대한 적절한 해결방법을 인지하신다던가.
EntityFramework + EnterpriseLibrary + Dapper로 ORM Framework 를 개발한다던가.
Parallel로 병렬처리를 Locking, CrossThread현상 없이 Threadsafe하게 Invoke처리 하신다던가
Reflection으로 모델의 property을 데이터소스로 부터 자동화처리 하신다던가
MVC의 PartialView를 직접 코드로 렌더링해서 Json 처리한다던가
DI를 직접 구현해 보신다던가
CustomControl(usercontrol 아님)로 그리드나 챠트 컨드롤을 GDI+로 개발한다던가
하는 형태의 개발해보시면 절대 쉽다고 하지못하실거에요.
test
Contextual Classes
Contextual classes can be used to color table rows or table cells. The classes that can be used are: .active, .success, .info, .warning, and .danger.
Firstname | Lastname | |
---|---|---|
Default | Defaultson | def@somemail.com |
Success | Doe | john@example.com |
Danger | Moe | mary@example.com |
Info | Dooley | july@example.com |
Warning | Refs | bo@example.com |
Active | Activeson | act@example.com |
Spring Web MVC, @Controller 어노테이션 정리
Spring Web MVC, @Controller 어노테이션 정리
클래스 레벨
Spring Web MVC의 @Controller 클래스에서 클래스 레벨에 명시 가능한 어노테이션은 아래와 같다.
@ResponseBody: 모든 메써드의 리턴 오브젝트를 적절한 형태로 변환 후 HTTP 응답 메시지의 바디에 담아 반환한다.
(오브젝트에서 바디로의 실제 변환은 HttpMessageConverter 인터페이스의 각 구현 클래스들이 수행한다.
예를 들면 String 리턴 타입은 StringHttpMessageConverter가 변환을 담당한다.)
클래스 레벨에 명시하면 View로의 반환을 완전히 배제하기 때문에 REST API 구현시 적합하다.
@RestController: @Controller에 위에 설명한 @ResponseBody를 추가한 효과를 가진다.
REST API 구현을 염두한 축약형 어노테이션이다.
@RequestMapping: 응답을 수행할 HTTP 요청을 명시할 수 있다.
path (String, String[]): 요청 URI를 명시한다. 배열을 통한 복수개의 요청 URI를 지정할 수 있다.
클래스 레벨에 명시한 값은 모든 메써드 레벨에 명시한 path 값 앞에 붙어 접두어 역할을 한다.
@RequestMapping("/v1/players")
@PropertySource: 프라퍼티 소스를 명시할 수 있다. 필드 레벨에서 @Value 등을 통해 클래스 레벨에서 명시한 프라퍼티 소스의 값을 주입할 수 있다.
// ROOT CLASSPATH(/src/main/java/resources)에 위치한 some.properties를 프라퍼티 소스로 명시한다.
@PropertySource("classpath:/some.properties")
클래스 필드 레벨
필드 레벨에 명시 가능한 어노테이션은 아래와 같다.
@Autowired: 적합한 이름의 스프링 빈을 자동으로 주입한다. 명백하게 1개의 스프링 빈만 존재할 경우 사용한다.
@Resource: 지정한 이름의 스프링 빈을 주입한다. 같은 타입의 스프링 빈이 2개 이상 존재할 경우 사용한다.
name (String): 주입할 스프링 빈의 이름이다.
@Value: 시스템 환경 변수, Java 환경 변수, Spring 환경 변수, 프라퍼티 리소스 상수 등의 값을 주입한다.
메써드 레벨
@RequestMapping: 메써드가 어떤 HTTP 요청을 처리할 것인가를 작성한다. 구체적인 작성 예는 아래와 같다.
@RequestMapping(
/**
* HTTP URI가 "/users"인 것만 처리한다. 만약 앞서 클래스 레벨에서 "/v1"이 명시되었다면 "/v1/users"를 처리하게 된다.
*/
path = "/users",
/**
* HTTP 요청 메써드가 "POST"인 것만 처리한다.
*/
method = RequestMethod.POST,
/**
* HTTP 요청 헤더가 "Content-Type: application/json;charset=UTF-8"인 것만 처리한다.
* 다른 값이 들어올 경우 org.springframework.web.HttpMediaTypeNotSupportedException을 발생시킨다.
* HTTP 요청 헤더에 명시된 Content-Type은 HTTP 요청 바디의 형식을 의미한다. 즉, 서버에서는 JSON 형식의 바디만 처리하겠다는 의미이다.
* 참고로 GET 요청은 바디를 가지지 않으므로 아래 파라메터를 명시할 필요가 없다.
*/
consumes = MediaType.APPLICATION_JSON_UTF8_VALUE,
/**
* HTTP 응답 헤더로 "Content-Type: application/json;charset=UTF-8"을 반환한다.
* 생략할 경우 메써드 리턴 타입에 따라 Content-Type을 자동으로 판단하여 반환한다.
*/
produces = MediaType.APPLICATION_JSON_UTF8_VALUE
)
메써드 아규먼트 레벨
특정 어노테이션 없이 POJO 클래스를 아규먼트로 명시하면 HTTP 요청 메시지의 QueryString 문자열을 변환하여 저장한다.
@Valid: JSR-303 (Bean Validation) 스펙에 명시된 어노테이션으로
요청 파라메터에 대한 유효성 검사가 가능하다. 유효성 검사 실패시
org.springframework.validation.BindException이 발생한다.
대상 아규먼트는 기본 타입 및 POJO 타입 모두 가능하다.
@RequestBody: HTTP 요청 메시지의 BODY를 변환하여 담을 아규먼트 앞에 명시한다.
HTTP 스펙에 따라 GET 이외의 메써드에서만 명시 가능하다.
(무시하고 명시할 경우 org.springframework.http.converter.HttpMessageNotReadableException이 발생한다.)
한편 앞서 설명한 @Valid를 추가로 명시할 수 있다. 유효성 검사 실패시
org.springframework.web.bind.MethodArgumentNotValidException을 발생시킨다.
클래스 레벨
Spring Web MVC의 @Controller 클래스에서 클래스 레벨에 명시 가능한 어노테이션은 아래와 같다.
@ResponseBody: 모든 메써드의 리턴 오브젝트를 적절한 형태로 변환 후 HTTP 응답 메시지의 바디에 담아 반환한다.
(오브젝트에서 바디로의 실제 변환은 HttpMessageConverter 인터페이스의 각 구현 클래스들이 수행한다.
예를 들면 String 리턴 타입은 StringHttpMessageConverter가 변환을 담당한다.)
클래스 레벨에 명시하면 View로의 반환을 완전히 배제하기 때문에 REST API 구현시 적합하다.
@RestController: @Controller에 위에 설명한 @ResponseBody를 추가한 효과를 가진다.
REST API 구현을 염두한 축약형 어노테이션이다.
@RequestMapping: 응답을 수행할 HTTP 요청을 명시할 수 있다.
path (String, String[]): 요청 URI를 명시한다. 배열을 통한 복수개의 요청 URI를 지정할 수 있다.
클래스 레벨에 명시한 값은 모든 메써드 레벨에 명시한 path 값 앞에 붙어 접두어 역할을 한다.
@RequestMapping("/v1/players")
@PropertySource: 프라퍼티 소스를 명시할 수 있다. 필드 레벨에서 @Value 등을 통해 클래스 레벨에서 명시한 프라퍼티 소스의 값을 주입할 수 있다.
// ROOT CLASSPATH(/src/main/java/resources)에 위치한 some.properties를 프라퍼티 소스로 명시한다.
@PropertySource("classpath:/some.properties")
클래스 필드 레벨
필드 레벨에 명시 가능한 어노테이션은 아래와 같다.
@Autowired: 적합한 이름의 스프링 빈을 자동으로 주입한다. 명백하게 1개의 스프링 빈만 존재할 경우 사용한다.
@Resource: 지정한 이름의 스프링 빈을 주입한다. 같은 타입의 스프링 빈이 2개 이상 존재할 경우 사용한다.
name (String): 주입할 스프링 빈의 이름이다.
@Value: 시스템 환경 변수, Java 환경 변수, Spring 환경 변수, 프라퍼티 리소스 상수 등의 값을 주입한다.
메써드 레벨
@RequestMapping: 메써드가 어떤 HTTP 요청을 처리할 것인가를 작성한다. 구체적인 작성 예는 아래와 같다.
@RequestMapping(
/**
* HTTP URI가 "/users"인 것만 처리한다. 만약 앞서 클래스 레벨에서 "/v1"이 명시되었다면 "/v1/users"를 처리하게 된다.
*/
path = "/users",
/**
* HTTP 요청 메써드가 "POST"인 것만 처리한다.
*/
method = RequestMethod.POST,
/**
* HTTP 요청 헤더가 "Content-Type: application/json;charset=UTF-8"인 것만 처리한다.
* 다른 값이 들어올 경우 org.springframework.web.HttpMediaTypeNotSupportedException을 발생시킨다.
* HTTP 요청 헤더에 명시된 Content-Type은 HTTP 요청 바디의 형식을 의미한다. 즉, 서버에서는 JSON 형식의 바디만 처리하겠다는 의미이다.
* 참고로 GET 요청은 바디를 가지지 않으므로 아래 파라메터를 명시할 필요가 없다.
*/
consumes = MediaType.APPLICATION_JSON_UTF8_VALUE,
/**
* HTTP 응답 헤더로 "Content-Type: application/json;charset=UTF-8"을 반환한다.
* 생략할 경우 메써드 리턴 타입에 따라 Content-Type을 자동으로 판단하여 반환한다.
*/
produces = MediaType.APPLICATION_JSON_UTF8_VALUE
)
메써드 아규먼트 레벨
특정 어노테이션 없이 POJO 클래스를 아규먼트로 명시하면 HTTP 요청 메시지의 QueryString 문자열을 변환하여 저장한다.
@Valid: JSR-303 (Bean Validation) 스펙에 명시된 어노테이션으로
요청 파라메터에 대한 유효성 검사가 가능하다. 유효성 검사 실패시
org.springframework.validation.BindException이 발생한다.
대상 아규먼트는 기본 타입 및 POJO 타입 모두 가능하다.
@RequestBody: HTTP 요청 메시지의 BODY를 변환하여 담을 아규먼트 앞에 명시한다.
HTTP 스펙에 따라 GET 이외의 메써드에서만 명시 가능하다.
(무시하고 명시할 경우 org.springframework.http.converter.HttpMessageNotReadableException이 발생한다.)
한편 앞서 설명한 @Valid를 추가로 명시할 수 있다. 유효성 검사 실패시
org.springframework.web.bind.MethodArgumentNotValidException을 발생시킨다.
JSP에서 웹 애플리케이션의 절대 주소 획득하기
JSP에서 웹 애플리케이션의 절대 주소 획득하기
웹 개발시에는 일반적으로 상대 주소를 사용하여 개발한다.
Java EE 기반의 웹 애플리케이션 개발시 JSTL(JavaServer Pages Standard Tag Library)을
사용하여 JSP(JavaServer Pages)를 구현하는 것은 가장 간단하면서 효율적인 방법이다.
JSP 내에서 페이지 리다이렉션 및 AJAX(Asynchronous JavaScript and XML) 요청 등 필요에
의해 애플리케이션의 주소를 다룰 때 대부분은 <c:url value="" /> 태그를 사용하여 상대 주소를 구현하는 방법을 사용한다.
하지만 가끔씩 절대 주소가 필요할 때가 있다.
절대 주소는 어떻게 획득할까?
javax.servlet.http.HttpServletRequest 오브젝트가 제공하는 정보를 활용하면 절대 주소를 획득하는 것이 가능하다.
JSP에서는 아래와 같이 해당 정보를 획득할 수 있다.
${pageContext.request.scheme}: http
${pageContext.request.serverName}: localhost
${pageContext.request.serverPort}: 8080
${pageContext.request.contextPath}: /someApp
JSP에서 구현된 JavaScript에서는 위 정보를 활용하여 아래와 같이 웹 애플리케이션의 절대 주소를 획득할 수 있다.
var absoluteUrl = '${pageContext.request.scheme}' + '://' + '${pageContext.request.serverName}' + ':' + '${pageContext.request.serverPort}' + '${pageContext.request.contextPath}';
웹 개발시에는 일반적으로 상대 주소를 사용하여 개발한다.
Java EE 기반의 웹 애플리케이션 개발시 JSTL(JavaServer Pages Standard Tag Library)을
사용하여 JSP(JavaServer Pages)를 구현하는 것은 가장 간단하면서 효율적인 방법이다.
JSP 내에서 페이지 리다이렉션 및 AJAX(Asynchronous JavaScript and XML) 요청 등 필요에
의해 애플리케이션의 주소를 다룰 때 대부분은 <c:url value="" /> 태그를 사용하여 상대 주소를 구현하는 방법을 사용한다.
하지만 가끔씩 절대 주소가 필요할 때가 있다.
절대 주소는 어떻게 획득할까?
javax.servlet.http.HttpServletRequest 오브젝트가 제공하는 정보를 활용하면 절대 주소를 획득하는 것이 가능하다.
JSP에서는 아래와 같이 해당 정보를 획득할 수 있다.
${pageContext.request.scheme}: http
${pageContext.request.serverName}: localhost
${pageContext.request.serverPort}: 8080
${pageContext.request.contextPath}: /someApp
JSP에서 구현된 JavaScript에서는 위 정보를 활용하여 아래와 같이 웹 애플리케이션의 절대 주소를 획득할 수 있다.
var absoluteUrl = '${pageContext.request.scheme}' + '://' + '${pageContext.request.serverName}' + ':' + '${pageContext.request.serverPort}' + '${pageContext.request.contextPath}';
2017년 8월 21일 월요일
로마서 1장
로마서 1장 [개역개정]
21.하나님을 알되 하나님을 영화롭게도 아니하며 감사하지도 아니하고 오히려 그 생각이 허망하여지며 미련한 마음이 어두워졌나니
22.스스로 지혜 있다 하나 어리석게 되어
23.썩어지지 아니하는 하나님의 영광을 썩어질 사람과 새와 짐승과 기어다니는 동물 모양의 우상으로 바꾸었느니라
24.그러므로 하나님께서 그들을 마음의 정욕대로 더러움에 내버려 두사 그들의 몸을 서로 욕되게 하게 하셨으니
25.이는 그들이 하나님의 진리를 거짓 것으로 바꾸어 피조물을 조물주보다 더 경배하고 섬김이라 주는 곧 영원히 찬송할 이시로다 아멘
21.하나님을 알되 하나님을 영화롭게도 아니하며 감사하지도 아니하고 오히려 그 생각이 허망하여지며 미련한 마음이 어두워졌나니
22.스스로 지혜 있다 하나 어리석게 되어
23.썩어지지 아니하는 하나님의 영광을 썩어질 사람과 새와 짐승과 기어다니는 동물 모양의 우상으로 바꾸었느니라
24.그러므로 하나님께서 그들을 마음의 정욕대로 더러움에 내버려 두사 그들의 몸을 서로 욕되게 하게 하셨으니
25.이는 그들이 하나님의 진리를 거짓 것으로 바꾸어 피조물을 조물주보다 더 경배하고 섬김이라 주는 곧 영원히 찬송할 이시로다 아멘
2017년 8월 20일 일요일
자바기초
자바 플랫폼, 마이크로 에디션 (Java Platform, Micro Edition, 약칭 Java ME)
モバイル環境向けJavaプラットフォームです。
処理速度、データ容量などリソースが乏しい環境でもスムーズに
Javaアプリが動作するように最適化されています。
主要APIはカーナビ、セットトップボックスなど比較的大きめの端末向けのCDCと、
PDA・携帯電話など比較的小さめの端末向けのCLDCに分かれています。
CLDCの元で動作するJVMは特にKVMと呼ばれ(KはKバイトのメモリで動作の意味)、
モバイル端末のリソースに合わせ最適化されています。
자바 플랫폼, 스탠더드 에디션 (Java Platform, Standard Edition, 약칭 Java SE)
すべてのJavaにおいて基本となるプラットフォームです。
一般にデスクトップ環境向けJavaプラットフォームと言われています。
業務用ソフト、アプリ開発ソフトなどクライアントPCで動作するアプリケーションの開発で
よく使用されます。主要APIにはSwing(GUIアプリ開発)、
Applet(Webブラウザアプリ開発)、
JDBC(DB接続)などがあります。
자바 플랫폼, 엔터프라이즈 에디션 (Java Platform, Enterprise Edition, 약칭 Java EE)
サーバサイドで動作するアプリケーション向けのJavaプラットフォームです。
オンラインショップ、会員制サイトなどWebアプリケーションの開発でよく使用されます。
主要APIには、サーブレット(Webアプリ開発)、
JSP(スクリプトベースWebアプリ開発)、
EJB(DB、トランザクション管理)などがあります。
Java Card
スマートカード(IC搭載カード)環境向けJavaプラットフォームです。
Java Card環境を実装したスマートカードであれば、
スマートカード発行会社を問わず、
同一のJavaアプリを動作させることができます。
Java(JDK)インストール方法(Windows環境)
Java SE Development Kit (JDK)は
Java SEプラットフォームに対応した開発ツールです。
RPM 패키지 매니저
최근 버전 4.11.2 / 2014년 2월 13일(3년 전)
원저자 레드햇
라이선스 GNU 일반 공중 사용 허가서
RPM 패키지 매니저(RPM Package Manager←Red Hat Package Manager)는
원래 레드햇에서 사용되었던 패키지 파일이었지만 현재는 많은 RPM 기반 배포판이 사용되고 있다.
이는 두 가지를 말하는데, 하나는 RPM 패키지 그 자체와 또 하나는 RPM 패키지를 관리하기 위한 도구이다.
RPM을 사용하면 각종 소프트웨어의 설치 및 업데이트를 굉장히 편리하게 할 수 있다.
RPM은 Linux Standard Base의 표준 패키지 포맷 중 하나이다.
원래 레드햇 리눅스를 위한 것이었지만 많은 리눅스 배포판 및 노벨 넷웨어 (6.5 SP3 이후), IBM AIX 5 등으로 이식되었다.
현재의 이름 "RPM"은 재귀 약자의 일종이다.
Yum
개발자 Seth Vidal
최근 버전 3.4.3 / 2011년 6월 28일(6년 전)
프로그래밍 언어 파이썬
종류 패키지 관리
http://yum.baseurl.org/
Yum은 Yellow dog Updater, Modified의 약자로 RPM 기반의 시스템을 위한
자동 업데이터 겸 패키지 설치/제거 도구이다. 듀크 대학교의 Linux@DUKE 프로젝트의 일부분으로 개발되었다.
yumex 같은 GUI 기반 확장 도구도 있다.
Yum 이전에 있었던 Yellowdog Updater (YUP) 도구를 대체하며,
듀크 대학교 물리학부에서 사용되었던 레드햇 리눅스 시스템 관리를 위해서 등장하였다.
그 이후로 페도라, CentOS 등 많은 RPM 기반 리눅스 배포판에서 사용되었다.
레드햇의 패키지 관리자 up2date에서도 Yum 저장소에 접근할 수 있다.
현재 GNU 일반 공중 사용 허가서 버전 2 이상으로 사용 가능하다.
Yum은 페도라 22 버전 이후부터 DNF로 전환되고 있다.
그러나 여전히 Yum의 전신인 rpm, 그리고 후신인 DNF와 같이 사용 가능하다.
어드밴스트 패키징 툴
어드밴스트 패키징 툴(Advanced Packaging Tool, APT)은
코어 라이브러리와 함께 동작하는 자유 사용자 인터페이스로, 데비안 GNU/리눅스 배포판 계열 배포판에서 소프트웨어를
설치하고 제거하는 일을 한다. APT는 이진 파일로부터나 소스 코드 컴파일을 통하여 소프트웨어 패키지의 확인, 구성, 설치를
자동화함으로써 유닉스 계열 컴퓨터 시스템 상의 소프트웨어를 관리하는 작업을 단순하게 만든다.
APT는 본래 데비안의 .deb 패키지와 함께 동작할 목적으로 dpkg를 위한 프론트엔드로
고안되었으나 그 뒤로 apt-rpm을 통한 RPM 패키지 매니저 시스템과도 함께 동작하도록 수정되었다.
Fink 프로젝트가 일부 패키지 관리 작업을 위하여 APT를 Mac OS X에 포팅하였으며 APT는
오픈솔라리스에서도 사용할 수 있다. (Nexenta OS 배포판에도 포함되어 있음).
최근 버전 1.0.9.8.3[1] / 2016년 3월 16일(16달 전)
프로그래밍 언어 C++
dpkg
원저자 이안 머독 (Ian Murdock)
개발자 dpkg 팀
dpkg는 데비안 패키지 관리 시스템의 기초가 되는 소프트웨어이다.
dpkg 명령어가 .deb 패키지의 설치, 삭제, 정보 제공을 위해 사용된다.
dpkg 그 자체는 저레벨의 도구이며, APT와 같은 고급 도구들이
복잡한 패키지 관계와 패키지를 원격에서 받아오는 등의 일을 한다.
앱티튜드 (Aptitude), 시냅틱 (Synaptic) 등이 dpkg 자체보다 많이 쓰이는데,
패키지 의존성을 다루는 더 많은 방법과 더 이해하기 편한 인터페이스를 갖고 있기 때문이다.
데비안 패키지 "dpkg"는 dpkg 프로그램과 더불어 패키징 시스템이
작동하게 하는 dpkg-statoverride, dpkg-divert, dpkg-trigger and update-alternatives 외의
몇몇 프로그램을 설치한다. dpkg는 start-stop-daemon, install-info와 같은 프로그램을 설치하며,
install-info는 일반적으로 하위 호환성을 위해 남겨진다. (현재는 별도로 개발, 배포된다.)
데비안 패키지 "dpkg-dev"는 아래에 설명된 다양한 도구들을 포함하고 있다.
dpkg는 원래 맷 웰쉬, 카를 스트리터와 이안 머독에 의해 펄 프로그램으로써 개발되었으며 1994년에 대부분이
이안 잭슨에 의해 C로 다시 쓰여졌다. dpkg라는 이름은 "데비안 패키지(Debian package)"의 약자였으나,
이 프로그램이 .deb 패키지 포맷의 시초였던 만큼, 데비안 패키지가 작동하는 방식이 변경하는 만큼 새롭게 변경되고 있다.
# rpm -ivh jdk-8u40-linux-x64.rpm
export JAVA_HOME=/usr/java/jdk1.8.0_40
export PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
public class HelloWorld {
public static void main (String[] args) {
System.out.println("Hello World !!");
}
}
いっち 一致 일치
추석
2017년 10월 4일(수) (10월 3일~10월 6일-대체휴일 포함)
한 해의 추수를 감사하는 우리나라 명절
설날
2018년 2월 16일(금) (2월 15일~2월 17일)
한 해의 건강과 풍요를 기원하는 우리나라 명절
しゅうしょく [修飾]
수식. 아름답게 꾸밈.
きまりきる [決まり切る,極り切る]
완전히 확정되어 있음, 또는, 완전히 딱 들어맞음
とめる
止める,留める,停める 세우다, 멈추다.
java.lang
java.io
-classpathオプションの使用例
java -classpath C:\JavaClass1 HelloWorld
java -classpath C:\JavaClass1;C:\JavaClass2 HelloWorld
java -classpath C:\JavaArchive1\archive.jar HelloWorld
すいしょう 推奨
1.추장
2.추천하여 권함
C:\>set CLASSPATH=.;C:\JavaClass1
rt.jar、i18n.jarは-classpathオプション、
CLASSPATH環境変数の状態に関わらずクラスパスに設定されています。
rt.jarにはJavaコアクラスがi18n.jarには国際化関連クラスが格納されています。
整数型
型 デフォルト値 サイズ 範囲
byte 0 8bit -128 ~ 127
short 0 16bit -32768 ~ 32767
int 0 32bit -2147483648 ~ 2147483647
long 0 64bit -9223372036854775808 ~ 9223372036854775807
浮動小数点型
型 デフォルト値 サイズ 範囲
float 0.0 32bit 約(-)3.40282347E+38(約6~7桁の精度)
double 0.0 64bit (-)1.79769313486231570E+388(15桁の精度)
その他
型 デフォルト値 サイズ 範囲
char \u0000 16bit \u0000 ~ \uFFFF
boolean false 1bit true、false
モバイル環境向けJavaプラットフォームです。
処理速度、データ容量などリソースが乏しい環境でもスムーズに
Javaアプリが動作するように最適化されています。
主要APIはカーナビ、セットトップボックスなど比較的大きめの端末向けのCDCと、
PDA・携帯電話など比較的小さめの端末向けのCLDCに分かれています。
CLDCの元で動作するJVMは特にKVMと呼ばれ(KはKバイトのメモリで動作の意味)、
モバイル端末のリソースに合わせ最適化されています。
자바 플랫폼, 스탠더드 에디션 (Java Platform, Standard Edition, 약칭 Java SE)
すべてのJavaにおいて基本となるプラットフォームです。
一般にデスクトップ環境向けJavaプラットフォームと言われています。
業務用ソフト、アプリ開発ソフトなどクライアントPCで動作するアプリケーションの開発で
よく使用されます。主要APIにはSwing(GUIアプリ開発)、
Applet(Webブラウザアプリ開発)、
JDBC(DB接続)などがあります。
자바 플랫폼, 엔터프라이즈 에디션 (Java Platform, Enterprise Edition, 약칭 Java EE)
サーバサイドで動作するアプリケーション向けのJavaプラットフォームです。
オンラインショップ、会員制サイトなどWebアプリケーションの開発でよく使用されます。
主要APIには、サーブレット(Webアプリ開発)、
JSP(スクリプトベースWebアプリ開発)、
EJB(DB、トランザクション管理)などがあります。
Java Card
スマートカード(IC搭載カード)環境向けJavaプラットフォームです。
Java Card環境を実装したスマートカードであれば、
スマートカード発行会社を問わず、
同一のJavaアプリを動作させることができます。
Java(JDK)インストール方法(Windows環境)
Java SE Development Kit (JDK)は
Java SEプラットフォームに対応した開発ツールです。
RPM 패키지 매니저
최근 버전 4.11.2 / 2014년 2월 13일(3년 전)
원저자 레드햇
라이선스 GNU 일반 공중 사용 허가서
RPM 패키지 매니저(RPM Package Manager←Red Hat Package Manager)는
원래 레드햇에서 사용되었던 패키지 파일이었지만 현재는 많은 RPM 기반 배포판이 사용되고 있다.
이는 두 가지를 말하는데, 하나는 RPM 패키지 그 자체와 또 하나는 RPM 패키지를 관리하기 위한 도구이다.
RPM을 사용하면 각종 소프트웨어의 설치 및 업데이트를 굉장히 편리하게 할 수 있다.
RPM은 Linux Standard Base의 표준 패키지 포맷 중 하나이다.
원래 레드햇 리눅스를 위한 것이었지만 많은 리눅스 배포판 및 노벨 넷웨어 (6.5 SP3 이후), IBM AIX 5 등으로 이식되었다.
현재의 이름 "RPM"은 재귀 약자의 일종이다.
Yum
개발자 Seth Vidal
최근 버전 3.4.3 / 2011년 6월 28일(6년 전)
프로그래밍 언어 파이썬
종류 패키지 관리
http://yum.baseurl.org/
Yum은 Yellow dog Updater, Modified의 약자로 RPM 기반의 시스템을 위한
자동 업데이터 겸 패키지 설치/제거 도구이다. 듀크 대학교의 Linux@DUKE 프로젝트의 일부분으로 개발되었다.
yumex 같은 GUI 기반 확장 도구도 있다.
Yum 이전에 있었던 Yellowdog Updater (YUP) 도구를 대체하며,
듀크 대학교 물리학부에서 사용되었던 레드햇 리눅스 시스템 관리를 위해서 등장하였다.
그 이후로 페도라, CentOS 등 많은 RPM 기반 리눅스 배포판에서 사용되었다.
레드햇의 패키지 관리자 up2date에서도 Yum 저장소에 접근할 수 있다.
현재 GNU 일반 공중 사용 허가서 버전 2 이상으로 사용 가능하다.
Yum은 페도라 22 버전 이후부터 DNF로 전환되고 있다.
그러나 여전히 Yum의 전신인 rpm, 그리고 후신인 DNF와 같이 사용 가능하다.
어드밴스트 패키징 툴
어드밴스트 패키징 툴(Advanced Packaging Tool, APT)은
코어 라이브러리와 함께 동작하는 자유 사용자 인터페이스로, 데비안 GNU/리눅스 배포판 계열 배포판에서 소프트웨어를
설치하고 제거하는 일을 한다. APT는 이진 파일로부터나 소스 코드 컴파일을 통하여 소프트웨어 패키지의 확인, 구성, 설치를
자동화함으로써 유닉스 계열 컴퓨터 시스템 상의 소프트웨어를 관리하는 작업을 단순하게 만든다.
APT는 본래 데비안의 .deb 패키지와 함께 동작할 목적으로 dpkg를 위한 프론트엔드로
고안되었으나 그 뒤로 apt-rpm을 통한 RPM 패키지 매니저 시스템과도 함께 동작하도록 수정되었다.
Fink 프로젝트가 일부 패키지 관리 작업을 위하여 APT를 Mac OS X에 포팅하였으며 APT는
오픈솔라리스에서도 사용할 수 있다. (Nexenta OS 배포판에도 포함되어 있음).
최근 버전 1.0.9.8.3[1] / 2016년 3월 16일(16달 전)
프로그래밍 언어 C++
dpkg
원저자 이안 머독 (Ian Murdock)
개발자 dpkg 팀
dpkg는 데비안 패키지 관리 시스템의 기초가 되는 소프트웨어이다.
dpkg 명령어가 .deb 패키지의 설치, 삭제, 정보 제공을 위해 사용된다.
dpkg 그 자체는 저레벨의 도구이며, APT와 같은 고급 도구들이
복잡한 패키지 관계와 패키지를 원격에서 받아오는 등의 일을 한다.
앱티튜드 (Aptitude), 시냅틱 (Synaptic) 등이 dpkg 자체보다 많이 쓰이는데,
패키지 의존성을 다루는 더 많은 방법과 더 이해하기 편한 인터페이스를 갖고 있기 때문이다.
데비안 패키지 "dpkg"는 dpkg 프로그램과 더불어 패키징 시스템이
작동하게 하는 dpkg-statoverride, dpkg-divert, dpkg-trigger and update-alternatives 외의
몇몇 프로그램을 설치한다. dpkg는 start-stop-daemon, install-info와 같은 프로그램을 설치하며,
install-info는 일반적으로 하위 호환성을 위해 남겨진다. (현재는 별도로 개발, 배포된다.)
데비안 패키지 "dpkg-dev"는 아래에 설명된 다양한 도구들을 포함하고 있다.
dpkg는 원래 맷 웰쉬, 카를 스트리터와 이안 머독에 의해 펄 프로그램으로써 개발되었으며 1994년에 대부분이
이안 잭슨에 의해 C로 다시 쓰여졌다. dpkg라는 이름은 "데비안 패키지(Debian package)"의 약자였으나,
이 프로그램이 .deb 패키지 포맷의 시초였던 만큼, 데비안 패키지가 작동하는 방식이 변경하는 만큼 새롭게 변경되고 있다.
# rpm -ivh jdk-8u40-linux-x64.rpm
export JAVA_HOME=/usr/java/jdk1.8.0_40
export PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
public class HelloWorld {
public static void main (String[] args) {
System.out.println("Hello World !!");
}
}
いっち 一致 일치
추석
2017년 10월 4일(수) (10월 3일~10월 6일-대체휴일 포함)
한 해의 추수를 감사하는 우리나라 명절
설날
2018년 2월 16일(금) (2월 15일~2월 17일)
한 해의 건강과 풍요를 기원하는 우리나라 명절
しゅうしょく [修飾]
수식. 아름답게 꾸밈.
きまりきる [決まり切る,極り切る]
완전히 확정되어 있음, 또는, 완전히 딱 들어맞음
とめる
止める,留める,停める 세우다, 멈추다.
java.lang
java.io
-classpathオプションの使用例
java -classpath C:\JavaClass1 HelloWorld
java -classpath C:\JavaClass1;C:\JavaClass2 HelloWorld
java -classpath C:\JavaArchive1\archive.jar HelloWorld
すいしょう 推奨
1.추장
2.추천하여 권함
C:\>set CLASSPATH=.;C:\JavaClass1
rt.jar、i18n.jarは-classpathオプション、
CLASSPATH環境変数の状態に関わらずクラスパスに設定されています。
rt.jarにはJavaコアクラスがi18n.jarには国際化関連クラスが格納されています。
整数型
型 デフォルト値 サイズ 範囲
byte 0 8bit -128 ~ 127
short 0 16bit -32768 ~ 32767
int 0 32bit -2147483648 ~ 2147483647
long 0 64bit -9223372036854775808 ~ 9223372036854775807
浮動小数点型
型 デフォルト値 サイズ 範囲
float 0.0 32bit 約(-)3.40282347E+38(約6~7桁の精度)
double 0.0 64bit (-)1.79769313486231570E+388(15桁の精度)
その他
型 デフォルト値 サイズ 範囲
char \u0000 16bit \u0000 ~ \uFFFF
boolean false 1bit true、false
2017년 8월 18일 금요일
2017년 8월 16일 수요일
소프트웨어 아키텍처란?
https://msdn.microsoft.com/ko-kr/hh144976.aspx
소프트웨어 아키텍처란?
소프트웨어 아키텍처 프로세스에서는 고객 요구 사항을 수집 및 분석하고 이러한 요구 사항을 충족하는 소프트웨어의 설계를 만듭니다. 성공적인 소프트웨어 설계는 상충하는 요구 사항으로 인해 발생하는 필연적인 타협점 간의 균형을 맞추고, 오랜 시간에 걸쳐 발전한 설계 원칙과 실행 기법을 준수하고, 최신 하드웨어, 네트워킹 및 관리 시스템을 보완해야 합니다. 강력한 소프트웨어 아키텍처에는 이론 및 실무 주제에 대한 풍부한 경험과 막연한 비즈니스 시나리오 및 요구 사항을 구체적이고 실용적인 설계로 변환하는 데 필요한 비전이 필요합니다.
소프트웨어 아키텍처에는 모든 기술 및 운영 요구 사항을 충족하는 구조화된 솔루션을 정의하고 성능, 보안, 관리 효율성과 같은 일반적인 품질 특성을 최적화하는 작업이 포함됩니다. 여기에는 광범위한 요소를 기반으로 한 일련의 의사 결정이 필요하며, 이러한 각 의사 결정은 소프트웨어의 품질, 성능, 관리 효율성 및 전체적인 성공에 큰 영향을 미칠 수 있습니다.
근래의 소프트웨어는 독립적으로 실행되는 경우는 거의 없습니다. 대부분의 경우 최소한 소프트웨어 사용자가 작업하는 데 필요한 정보를 제공하는 회사 데이터베이스와 같은 데이터 원본과 상호 작용합니다. 또한 일반적으로 현대 소프트웨어는 다른 서비스 및 네트워크 기능과 상호 작용하여 인증을 수행하고 정보를 획득 및 게시하고 통합 사용자 환경을 제공합니다. 적절한 아키텍처가 없는 경우 소프트웨어를 배포, 운영, 유지 관리하고 다른 시스템과 성공적으로 통합하기가 어렵거나 불가능할 수 있으며 사용자 요구 사항을 충족할 수 없게 됩니다.
소프트웨어 아키텍처는 소프트웨어가 달성해야 하는 목표와 코드로서의 구현 세부 사항을 연결하는 것이라고 생각할 수 있습니다. 올바른 아키텍처를 확보하면 요구 사항과 결과물 간의 연결을 최적화할 수 있습니다. 잘 설계된 소프트웨어는 원래 요구 사항의 매개 변수 내에서 지정된 작업을 수행하며 이 과정에서 성능, 보안, 안정성 등을 최대화합니다.
최상위 수준의 아키텍처 설계는 시스템 구조를 노출하되 구현 세부 사항은 숨기고, 모든 사용 사례와 시나리오를 실현하고, 모든 관계자의 요구 사항을 처리하도록 노력하고, 모든 기능 및 품질 요구 사항을 최대한 충족해야 합니다.
소프트웨어 아키텍처가 왜 중요한가?
응용 프로그램에 대한 사용자의 기대가 커지면서 현재 소프트웨어에 대한 요구 사항도 더 복잡해지고 있습니다. 이제 대부분의 비즈니스 및 상업 시나리오에서 간단한 독립 실행형 데스크톱 응용 프로그램은 부족하게 되었습니다. 현재의 연결된 환경에서 응용 프로그램은 다른 응용 프로그램 및 서비스와 상호 작용하고 클라우드 및 휴대용 장치와 같은 다양한 환경에서 실행되어야 합니다. 과거에 일반적으로 사용된 모놀리식 설계는 프레임워크, 운영 체제, 런타임 호스트 및 네트워크를 사용하여 불과 몇 년 전까지만 해도 없었던 새로운 기능을 구현하는 구성 요소화된 서비스 지향 소프트웨어로 대체되었습니다.
이 복잡성은 설계뿐만 아니라 소프트웨어 배포, 유지 및 관리에도 영향을 미칩니다. 소프트웨어의 TCO(총 소유 비용)는 이제 대부분 배포 후 비용으로 구성됩니다. 잘 설계된 응용 프로그램은 응용 프로그램을 배포하고 실행 상태를 유지하고 변화하는 요구 사항을 총족하도록 업데이트하고 문제를 해결하는 데 필요한 비용과 시간을 줄임으로써 TCO를 최소화합니다. 또한 사용자 지원 및 관리도 간소화합니다.
성공적인 소프트웨어가 되려면 여러 가지 필수적인 기준도 충족해야 합니다. 악의적인 공격과 우연한 잘못으로부터 응용 프로그램과 데이터를 보호할 수 있는 보안 기능을 제공해야 합니다. 오류 및 이와 관련된 비용이 최소화되도록 견고하고 안정적이어야 합니다. 최대 응답 시간 또는 특정 작업 부하 용량과 같은 고객의 요구 사항을 충족하기 위해 필요한 매개 변수 내에서 기능을 수행해야 합니다. 관리 및 지원 비용을 최소화하기 위해 유지 관리가 용이해야 하며, 시간이 경과함에 따라 필요한 변경 및 업그레이드가 가능하도록 충분한 확장성을 갖추어야 합니다.
이러한 모든 요소에는 절충이 수반됩니다. 예를 들어 복잡한 암호화를 통해 가장 안전한 메커니즘을 구현하면 성능은 떨어지게 됩니다. 광범위한 구성 및 업그레이드 옵션을 구현하면 배포 및 관리 작업이 더 복잡해질 수 있습니다. 또한 설계가 복잡할수록 구현 비용도 많이 듭니다. 좋은 아키텍처는 이러한 요소들 간에 균형을 맞추어 특정 시나리오에 대한 최적의 결과를 얻는 것을 목표로 해야 합니다.
소프트웨어 아키텍처는 어떤 역할을 하는가?
소프트웨어 아키텍처의 시작은 요구 사항 집합입니다. 이러한 요구 사항은 다이어그램, 프로세스 순서도, 모델 또는 소프트웨어가 수행해야 하는 운영 작업의 문서화된 목록 형태로 표현됩니다. 일반적으로 고객 또는 파트너는 모양과 느낌 또는 일반적인 작업에 대한 특정 사용자 인터페이스의 작동 방식과 같이 명확하지 않은 요구 사항도 제시합니다. 요구 사항에는 새 소프트웨어가 상호 작용할 기존 소프트웨어, 시스템, 하드웨어 및 네트워크에 대한 정보와, 배포 및 유지 관리 계획, 그리고 물론 프로젝트에서 사용할 수 있는 예산과 같은 다른 요소도 포함되어야 합니다.
소프트웨어 설계자는 고객의 요구를 고려해야 합니다. 그러나 “고객”이라는 일반적인 용어는 일반적으로 비즈니스 요구 사항, 사용자 요구 사항, 시스템 요구 사항이라는 세 가지 상충하는 책임 영역으로 구성됩니다. 비즈니스 요구 사항은 일반적으로 비즈니스 프로세스, 성능 요소(예: 보안, 안정성 및 처리량), 그리고 예산 및 비용 제약과 같은 요소를 정의합니다. 사용자 요구 사항에는 소프트웨어 인터페이스 디자인, 운영 기능 및 사용 편의성이 포함됩니다. 시스템 요구 사항에는 하드웨어, 네트워킹 및 런타임 환경 기능과 제약이 포함됩니다. 그림 1은
일반적인 고객의 상충하는 요구 사항
그림 1 - 일반적인 고객의 상충하는 요구 사항
소프트웨어 설계자에게는 요구 사항을 수집 및 분석하고 아키텍처를 정의하기 위한 자기만의 방법이 있습니다. 설계자는 흔히 “사용자는 어떤 방법으로 응용 프로그램을 사용하게 되는가?”, “응용 프로그램이 프로덕션과 관리 환경에 어떻게 배포되는가?”, “보안, 성능, 동시성, 국제화 및 구성과 같은 응용 프로그램의 품질 특성 요구 사항은 무엇인가?”, “시간이 지나도 유연하고 유지 관리가 가능하도록 응용 프로그램을 설계하려면 어떻게 해야 하는가?” 그리고 “지금 또는 배포된 후 응용 프로그램에 영향을 미칠 수 있는 아키텍처 추세는 무엇인가?”와 같은 질문의 답을 구해야 합니다.
마지막 질문은 흥미로우면서도 중요합니다. 좋은 소프트웨어 설계는 고객의 현재 요구 사항뿐만 아니라 가까운 미래의 요구 사항도 지속적으로 충족합니다. 이는 하드웨어, 구성 요소, 프레임워크, 런타임 플랫폼, 관리 소프트웨어 시스템 및 소프트웨어에 내장되거나 소프트웨어가 통합해야 하는 기타 다양한 기능에 대해 설계자가 내려야 하는 의사 결정에 영향을 미칩니다.
소프트웨어 설계 및 개발 영역의 작업이 대부분 그렇듯이, 아키텍처를 설계하는 일은 선행적이고 반복적인 프로세스입니다. 요구 사항 분석, 기술 연구, 목표 식별과 같은 많은 초기 작업은 일반적으로 프로세스의 시작 부분에서 수행됩니다. 다음 단계는 설계에 대한 주요 시나리오를 확인하는 것입니다. 이는 소프트웨어가 충족해야 하는 기본 요구 사항이자 소프트웨어 운영의 제약 조건이기도 합니다. 설계자는 이 정보를 통해 응용 프로그램의 개요를 도출할 수 있습니다. 이 개요에는 응용 프로그램 유형(웹, 폰, 데스크톱 또는 클라우드), 배포 아키텍처(일반적으로 구성 요소들이 하드웨어와 네트워크 경계를 넘어 통신하는 계층화된 설계), 추종할 적절한 아키텍처 스타일(예: n계층, 클라이언트/서버, 또는 서비스 지향), 그리고 시나리오에 가장 잘 맞는 구현 기술과 같은 전체적인 세부 사항이 포함됩니다.
여기서 설계자는 앞서 파악한 최상위의 가장 중요한 요구 사항을 충족하는 후보 설계들을 생성할 수 있습니다. 이 설계를 많은 경우 고객 및 평가판 또는 테스트 버전의 피드백과 함께 주요 시나리오에 따라 검토 및 테스트해서 최적의 솔루션을 제공하는지 확인합니다. 첫 번째 반복에서 되지 않더라도 주기가 반복됨에 따라 설계는 요구 사항 및 주요 시나리오를 기반으로 수렴하게 됩니다. 그림 2는 이 반복 접근 방식을 보여 줍니다.
반복적인 아키텍처 설계 프로세스
그림 2 – 반복적인 아키텍처 설계 프로세스
설계가 세밀해지고 개별 작업 및 구성 요소가 식별됨에 따라 설계자는 각 단계에서 설계를 더 정제하고 세부 사항을 추가할 수 있습니다. 예를 들어 아키텍처 스타일과 배포 접근 방식이 식별되면 설계자는 계층과 구성 요소 간의 통신에 대한 의사 결정을 내릴 수 있습니다. 여기에는 현재 및 미래 요구 사항을 기반으로 프로토콜을 선택하고, 앞으로 나올 표준에 정의된 새로운 기술과 기능을 사전에 검토하는 작업이 포함될 수 있습니다.
설계자 작업의 최종 결과물은 일반적으로 여러 관점에서 응용 프로그램을 정의하는 설계도, 모델 및 문서 집합입니다. 이러한 요소들이 결합되면 개발자, 테스트 팀, 관리자 및 경영진에게 설계를 구현하는 데 필요한 모든 정보가 제공됩니다. 이 정보에는 구성 요소와 응용 프로그램 계층의 구조 및 레이아웃에 대한 설명, 로깅 및 유효성 검사와 같은 크로스 커팅(Cross-Cutting) 사안이 처리되는 방법, 테스트 및 배포 계획, 개발자, 관리자 및 지원 담당자를 지원하기 위한 문서가 포함됩니다.
최종 설계는 응용 프로그램이 충족해야 하는 품질 특성도 지정해야 합니다. 이는 설계자가 고객과 상담하면서 내린 신중한 의사 결정과 타협의 결과입니다. 여기에는 보안 요구 사항과 보안 구현 계획, 대상 플랫폼에 배포될 경우 필요한 확장성과 성능, 유지 관리 용이성과 확장성이 구현되는 방식, 다른 시스템과의 상호 운용성을 가능하게 하는 기능에 대한 정의가 포함됩니다.
소프트웨어 설계자에게 필요한 기술은 무엇인가?
소프트웨어 설계자에게 다양한 소프트 스킬과 하드 스킬이 모두 필요하다는 것은 분명합니다. 요구 사항 분석 및 검토 단계에서 설계자는 고객과 협력하고 파트너 및 다른 팀 구성원과 상담하고 관리자, 사용자 및 시스템 관리자 사이의 중개자 역할을 해야 합니다. 이러한 소프트 스킬이 뛰어나면 더 나은 초기 계획과 더 정확한 요구 사항 집합을 만들 수 있으므로 이후 시간과 노력을 덜 수 있습니다.
소프트웨어 설계자는 최신 소프트웨어 시스템, 프레임워크 및 하드웨어가 요구 사항에 대응하는 방식, 네트워킹 및 운영 체제 요소가 설계 의사 결정에 미치는 영향, 이러한 영역의 추세와 변화가 설계에 미칠 영향을 이해하기 위해 필요한 하드 스킬도 갖추어야 합니다. 초기 요구 사항 분석 후 소프트웨어 설계자는 설계 패턴, 통신 및 메시징 표준, 코드 기능, 보안 관련 사항과 성능 제약에 대한 하드 스킬도 적용해야 합니다. 이러한 모든 요소에는 최종 소프트웨어를 구현하는 데 사용될 기술에 대한 풍부한 지식이 필요합니다.
물론 소프트웨어 아키텍처에는 비전도 필요합니다. 설계자는 여러 시스템이 연계되어 상호 운용되는 방법, 이러한 시스템이 분할 및 배포되는 방법, 그리고 사용자와 시스템이 상호 작용하는 방법을 파악하려면 먼저 전체적인 솔루션을 마음 속에 그릴 수 있어야 합니다. 그렇게 하기 위해서는 모든 요구 사항과 제약을 대조 및 파악하고, 유연하고 포괄적인 기술 설계에서 이러한 요소들을 점진적으로 변형시켜 나가기 위한 체계적인 접근 방법과 세부 사항에 대한 세심한 주의가 필요합니다. 또한 최종 결과를 시각화한 다음 이상적인 솔루션을 향해 조직적으로 작업해 나갈 수 있는 직감과 상상력도 필요합니다.
クラス図
統一モデリング言語 (UML)におけるクラス図(クラスず、英: class diagram)とは、クラス、属性、クラス間の関係からシステムの構造を記述する静的な構造図である。
クラス図とソースコードの同期が可能なUMLモデリングツールも存在する。
目次
1 クラス
2 関係
2.1 インスタンスレベルの関係
2.1.1 リンク
2.1.2 関連
2.1.3 集約
2.1.4 コンポジション
2.1.5 集約とコンポジションの違い
2.2 クラスレベルの関係
2.2.1 汎化・特化
2.2.2 実現
2.3 一般的な関係
2.3.1 依存
2.3.2 多重度
3 関連項目
4 外部リンク
クラス
クラス図におけるクラスの例
ソフトウェアシステムにおけるクラスは、中にクラス名の記述された四角で表現する。クラスはドメイン等、ソフトウェア要素ではない要素であっても良い。(訳注:例えば、車のタイヤであったり、化学物質の一種であったり、料理の材料であるかも知れない)
オプションとして、クラス名の下に属性(つまりプロパティ)の区画を設けることができる。どの属性も最低でも名前を記述せねばならず、オプションとしてその型、初期値、その他の特性を記述することができる。
更にその下に、クラスの関数(つまりメソッド)の区画を設けることができる。どの関数も最低でも名前を記述せねばならず、オプションとしてその引数や戻り値を記述することができる。
他の区画を定義しても良い。例えば、保存する義務や必要条件、制限などである。
属性と関数には以下の可視性を付けることができる:
" + "はpublic
" # "はprotected
" - "はprivate
" ~ "はpackage(パッケージ内で可視)
また、クラス図でクラス変数やクラス関数を表現するには、区画内の項目に下線を引けばよい。
関係
関係は、クラス図とオブジェクト図に見られる、以下に示すような論理的な連結の種類を総称する用語である。
このように関係という用語は列挙により定義されるのみなので、その本質に関する具体的イメージをつかみにくい。そこであえて大雑把にいえば、クラス図においては、関係とは「そのクラスのソースコードに型名が出現する(ことになるであろう)」ことを意味する。オブジェクト図において、関係とは「そのオブジェクトが参照を持っている(ことになるであろう)」ことを意味する。
なお、いうまでもないことだが、クラス図に出現するすべてのクラスは、同一のクラス図(あるいはシステム)に出現するという論理的なつながりを持っているので、単に関係を「論理的な連結」とだけ定義すると概念が破たんする。
UMLでは、以下の関係を表現できる。
インスタンスレベルの関係
リンク
リンクとは、基本的なオブジェクト間の関係である。クラスを表す四角を二つ以上、線でつなぐことで表現する。これはオブジェクト図にも見られる。オブジェクト図では、インスタンスの関連を示す。
関連
関連は、リンクの一種である。オブジェクト間の関係は線で表現する。三つ以上の関連を表現することもできる。そのような場合、各オブジェクトから出た線は菱形に接続される。(訳注:これをN項関係という)
集約
2つのクラス間の集約を表すクラス図
集約とは、"has-a" もしくは関連の一種であるが、特殊な関係である。関連の一種で、名前付けなど「関連」で可能なオプションを付けることができる。しかし、集約は二つ以上のクラスを含むことができない。(訳注:つまり、集約にはN項関係は存在し得ない)
集約は、一方がもう一方のクラスの一部であるが、両クラス間に強いライフサイクルの依存が無い場合に使用する。つまり、集約しているクラスのオブジェクトが削除されても、されている側のオブジェクトが消えるとは限らない。
UML では、集約するクラスと集約されるクラスの間を線で結び、集約するクラス側の線の端に中抜きの菱形を記述する事で表現する。
コンポジション
コンポジションとは、"has-a"もしくは関連の変種のより強いものである。集約より特殊である。
コンポジションは、両クラス間に強いライフサイクルの依存がある場合に使用する。つまり、コンポジション関係にあるクラスの集約しているオブジェクトが削除されると、必ず集約されている側のオブジェクトはすべて削除される。
UMLでは、視覚的には黒い菱形を集約する側のクラスの線の端に記述する事で表現する。
集約とコンポジションの違い
すべてのコンポジションは、0..1か1の多重度でなければならない。集約されるインスタンスは、される対象が一つだけでなければおかしいからだ。対して、集約の場合は、これに限らない。
現実世界で全体-部分の関係の例を挙げるとすれば、例えば車に対するエンジンの例が挙げられる。エンジンENG01は車のモデルCM01の部分であり、集約の関係がベストと言える。エンジンとしては、ENG01は他の車のモデルに搭載することも可能だからだ。例えばCM02等。これはしばしば、「カタログ」関係と呼ばれる。
クラスレベルの関係
汎化・特化
KP-UML-Generalization-20060325.svg
汎化の関係とは、関係するクラスの一方(スーパークラス)がもう一方(サブクラス)に対してより一般的であると考えられることを表す。実際問題、これはサブクラスのインスタンスがスーパークラスのインスタンスでもあることを意味している(このタイプの汎化の例は「binomial nomenclature」に見られる:人間は猿のサブタイプであり、猿は哺乳動物のサブタイプであり以下略)。この関係は、'AはB'とすると最も簡単に理解できる(人間は哺乳動物、哺乳動物は動物)。
UMLでの視覚的な記述方法としては、スーパークラス側の線の端に白抜きの三角を描くことで表現する。
汎化・特化の関係は、継承または"is-a"の関係としても知られる。
汎化・特化の関係において、スーパータイプは"親"、"スーパークラス"、"基底クラス"、"規定タイプ"としても知られる。
汎化・特化の関係において、サブタイプは"子"、"サブクラス"、"派生クラス"、"派生タイプ"、"派生型"としても知られる。
特化の関係は、汎化の関係の逆である。つまり、サブタイプはスーパータイプを特化したものである。
この関係が生物学的な親/子の関係との類似を全く持っていない事に注意すること:これらの用語は非常に一般的だが、使用方法によっては紛らわしい場合がある。
汎化 - 特化の関係:
AはBの一種
例えば、"オークは木の一種"、"貨物自動車は車の一種"
実現
実現の関係とは、関係するクラスの一方(クライアント)がもう一方(サプライヤ)の振る舞いを実現していることを表す。(訳注:例えば、抽象クラスやインターフェイスのメソッドの内容をサブクラスで具体的に記述すること)実現は視覚的には、白抜きされた三角を先端に持つ破線で表現する。
一般的な関係
依存
定義されている要素間に、片方を変更すればもう片方に変更が生じる依存が存在する。この関係は、依存する側からされる側への破線矢印で表現する。幾つかの名前付けされた種類がある。依存はインスタンス間、クラス間、インスタンス-クラス間にあり得る。
多重度
関連の関係は、関連するクラスの一方がもう一方を参照していることを意味する。汎化の関係と対比して、'AはBを持っている'というフレーズで最も簡単に理解できる(母猫には子猫がいる、子猫には母猫がいる)。
UMLでは、関係にオブジェクトのロールを矢印で示唆して表現する。オプションとして、それらのエンティティのインスタンスの多重度を両端に記述することができる。多重度とは、その関連に参加するオブジェクトの数を示すものである。一般的な多重度は以下:
記述 インスタンス数
0..1 無しか一つ
1 確実に一つ
0..* または * ゼロ個以上
1..* 1個以上
この関係は、"has-a"の関係としても知られている。
関連項目
ドメインモデル
外部リンク
クラス図とソースコードの同期が可能なUMLモデリングツールも存在する。
目次
1 クラス
2 関係
2.1 インスタンスレベルの関係
2.1.1 リンク
2.1.2 関連
2.1.3 集約
2.1.4 コンポジション
2.1.5 集約とコンポジションの違い
2.2 クラスレベルの関係
2.2.1 汎化・特化
2.2.2 実現
2.3 一般的な関係
2.3.1 依存
2.3.2 多重度
3 関連項目
4 外部リンク
クラス
クラス図におけるクラスの例
ソフトウェアシステムにおけるクラスは、中にクラス名の記述された四角で表現する。クラスはドメイン等、ソフトウェア要素ではない要素であっても良い。(訳注:例えば、車のタイヤであったり、化学物質の一種であったり、料理の材料であるかも知れない)
オプションとして、クラス名の下に属性(つまりプロパティ)の区画を設けることができる。どの属性も最低でも名前を記述せねばならず、オプションとしてその型、初期値、その他の特性を記述することができる。
更にその下に、クラスの関数(つまりメソッド)の区画を設けることができる。どの関数も最低でも名前を記述せねばならず、オプションとしてその引数や戻り値を記述することができる。
他の区画を定義しても良い。例えば、保存する義務や必要条件、制限などである。
属性と関数には以下の可視性を付けることができる:
" + "はpublic
" # "はprotected
" - "はprivate
" ~ "はpackage(パッケージ内で可視)
また、クラス図でクラス変数やクラス関数を表現するには、区画内の項目に下線を引けばよい。
関係
関係は、クラス図とオブジェクト図に見られる、以下に示すような論理的な連結の種類を総称する用語である。
このように関係という用語は列挙により定義されるのみなので、その本質に関する具体的イメージをつかみにくい。そこであえて大雑把にいえば、クラス図においては、関係とは「そのクラスのソースコードに型名が出現する(ことになるであろう)」ことを意味する。オブジェクト図において、関係とは「そのオブジェクトが参照を持っている(ことになるであろう)」ことを意味する。
なお、いうまでもないことだが、クラス図に出現するすべてのクラスは、同一のクラス図(あるいはシステム)に出現するという論理的なつながりを持っているので、単に関係を「論理的な連結」とだけ定義すると概念が破たんする。
UMLでは、以下の関係を表現できる。
インスタンスレベルの関係
リンク
リンクとは、基本的なオブジェクト間の関係である。クラスを表す四角を二つ以上、線でつなぐことで表現する。これはオブジェクト図にも見られる。オブジェクト図では、インスタンスの関連を示す。
関連
関連は、リンクの一種である。オブジェクト間の関係は線で表現する。三つ以上の関連を表現することもできる。そのような場合、各オブジェクトから出た線は菱形に接続される。(訳注:これをN項関係という)
集約
2つのクラス間の集約を表すクラス図
集約とは、"has-a" もしくは関連の一種であるが、特殊な関係である。関連の一種で、名前付けなど「関連」で可能なオプションを付けることができる。しかし、集約は二つ以上のクラスを含むことができない。(訳注:つまり、集約にはN項関係は存在し得ない)
集約は、一方がもう一方のクラスの一部であるが、両クラス間に強いライフサイクルの依存が無い場合に使用する。つまり、集約しているクラスのオブジェクトが削除されても、されている側のオブジェクトが消えるとは限らない。
UML では、集約するクラスと集約されるクラスの間を線で結び、集約するクラス側の線の端に中抜きの菱形を記述する事で表現する。
コンポジション
コンポジションとは、"has-a"もしくは関連の変種のより強いものである。集約より特殊である。
コンポジションは、両クラス間に強いライフサイクルの依存がある場合に使用する。つまり、コンポジション関係にあるクラスの集約しているオブジェクトが削除されると、必ず集約されている側のオブジェクトはすべて削除される。
UMLでは、視覚的には黒い菱形を集約する側のクラスの線の端に記述する事で表現する。
集約とコンポジションの違い
すべてのコンポジションは、0..1か1の多重度でなければならない。集約されるインスタンスは、される対象が一つだけでなければおかしいからだ。対して、集約の場合は、これに限らない。
現実世界で全体-部分の関係の例を挙げるとすれば、例えば車に対するエンジンの例が挙げられる。エンジンENG01は車のモデルCM01の部分であり、集約の関係がベストと言える。エンジンとしては、ENG01は他の車のモデルに搭載することも可能だからだ。例えばCM02等。これはしばしば、「カタログ」関係と呼ばれる。
クラスレベルの関係
汎化・特化
KP-UML-Generalization-20060325.svg
汎化の関係とは、関係するクラスの一方(スーパークラス)がもう一方(サブクラス)に対してより一般的であると考えられることを表す。実際問題、これはサブクラスのインスタンスがスーパークラスのインスタンスでもあることを意味している(このタイプの汎化の例は「binomial nomenclature」に見られる:人間は猿のサブタイプであり、猿は哺乳動物のサブタイプであり以下略)。この関係は、'AはB'とすると最も簡単に理解できる(人間は哺乳動物、哺乳動物は動物)。
UMLでの視覚的な記述方法としては、スーパークラス側の線の端に白抜きの三角を描くことで表現する。
汎化・特化の関係は、継承または"is-a"の関係としても知られる。
汎化・特化の関係において、スーパータイプは"親"、"スーパークラス"、"基底クラス"、"規定タイプ"としても知られる。
汎化・特化の関係において、サブタイプは"子"、"サブクラス"、"派生クラス"、"派生タイプ"、"派生型"としても知られる。
特化の関係は、汎化の関係の逆である。つまり、サブタイプはスーパータイプを特化したものである。
この関係が生物学的な親/子の関係との類似を全く持っていない事に注意すること:これらの用語は非常に一般的だが、使用方法によっては紛らわしい場合がある。
汎化 - 特化の関係:
AはBの一種
例えば、"オークは木の一種"、"貨物自動車は車の一種"
実現
実現の関係とは、関係するクラスの一方(クライアント)がもう一方(サプライヤ)の振る舞いを実現していることを表す。(訳注:例えば、抽象クラスやインターフェイスのメソッドの内容をサブクラスで具体的に記述すること)実現は視覚的には、白抜きされた三角を先端に持つ破線で表現する。
一般的な関係
依存
定義されている要素間に、片方を変更すればもう片方に変更が生じる依存が存在する。この関係は、依存する側からされる側への破線矢印で表現する。幾つかの名前付けされた種類がある。依存はインスタンス間、クラス間、インスタンス-クラス間にあり得る。
多重度
関連の関係は、関連するクラスの一方がもう一方を参照していることを意味する。汎化の関係と対比して、'AはBを持っている'というフレーズで最も簡単に理解できる(母猫には子猫がいる、子猫には母猫がいる)。
UMLでは、関係にオブジェクトのロールを矢印で示唆して表現する。オプションとして、それらのエンティティのインスタンスの多重度を両端に記述することができる。多重度とは、その関連に参加するオブジェクトの数を示すものである。一般的な多重度は以下:
記述 インスタンス数
0..1 無しか一つ
1 確実に一つ
0..* または * ゼロ個以上
1..* 1個以上
この関係は、"has-a"の関係としても知られている。
関連項目
ドメインモデル
外部リンク
アクティビティ図
https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%93%E3%83%86%E3%82%A3%E5%9B%B3
アクティビティ図
UMLの図
構造図
クラス図
コンポーネント図
複合構造図
配置図
オブジェクト図(英語版)
パッケージ図
プロフィール図(英語版)
振る舞い図
アクティビティ図
コミュニケーション図(英語版)
インタラクション図(英語版)
シーケンス図
ステートマシン図
タイミング図 (UML)(英語版)
ユースケース図
表 話 編 歴
アクティビティ図(アクティビティず)とはフローチャートに似た図で、いわゆるビジネスロジックにおける手続き的な流れやプログラムの制御フローを表すUMLの図である。
目次
1 概要
2 図の作成方法
3 図の要素
4 参考文献
概要
UML 2アクティビティ図
UML 1アクティビティ図
システムの流れを表すため、フローチャートのUML版という位置づけで決められた。UML 1.0のときに制定されUML2.0で大きく拡張された。
アクティビティ図では、プログラムでの処理以外にも、業務フローなどの記載も可能である(フローチャートでも業務フローなどの記載も可能である)。
昨今ではフローチャートからアクティビティ図への移行が進んでいる(そもそもフローチャートという図法自体が、UMLが誕生した機縁であるオブジェクト指向の流行以前の、構造化の流行の際には時代遅れとされたものであるし、UMLツール等が対応しているのが従来のフローチャートではなくアクティビティ図なので、アクティビティ図が使われるというだけである)。
図の作成方法
初期状態「●」と終了状態「◉」を記載し、その間に矢印で処理を記載し、必要に応じて分岐などを記載する。ステートマシン図などと異なり、主に書くのは処理であることに注意する必要がある。
アクティビティ図
UMLの図
構造図
クラス図
コンポーネント図
複合構造図
配置図
オブジェクト図(英語版)
パッケージ図
プロフィール図(英語版)
振る舞い図
アクティビティ図
コミュニケーション図(英語版)
インタラクション図(英語版)
シーケンス図
ステートマシン図
タイミング図 (UML)(英語版)
ユースケース図
表 話 編 歴
アクティビティ図(アクティビティず)とはフローチャートに似た図で、いわゆるビジネスロジックにおける手続き的な流れやプログラムの制御フローを表すUMLの図である。
目次
1 概要
2 図の作成方法
3 図の要素
4 参考文献
概要
UML 2アクティビティ図
UML 1アクティビティ図
システムの流れを表すため、フローチャートのUML版という位置づけで決められた。UML 1.0のときに制定されUML2.0で大きく拡張された。
アクティビティ図では、プログラムでの処理以外にも、業務フローなどの記載も可能である(フローチャートでも業務フローなどの記載も可能である)。
昨今ではフローチャートからアクティビティ図への移行が進んでいる(そもそもフローチャートという図法自体が、UMLが誕生した機縁であるオブジェクト指向の流行以前の、構造化の流行の際には時代遅れとされたものであるし、UMLツール等が対応しているのが従来のフローチャートではなくアクティビティ図なので、アクティビティ図が使われるというだけである)。
図の作成方法
初期状態「●」と終了状態「◉」を記載し、その間に矢印で処理を記載し、必要に応じて分岐などを記載する。ステートマシン図などと異なり、主に書くのは処理であることに注意する必要がある。
통합 모델링 언어
통합 모델링 언어
위키백과, 우리 모두의 백과사전.
UML은 소프트웨어 집약 시스템의 시각적 모델을 만들기 위한 도안 표기법을 포함한다.
목차
개요
통합 모델링 언어는 객체 지향 소프트웨어 집약 시스템을 개발할 때 산출물을 명세화, 시각화, 문서화할 때 사용한다.[1] UML은 아래와 같은 사항을 포함하여 시스템의 구조적 청사진을 시각화 하는 표준안을 제공한다:- 행위자 (UML)
- 비즈니스 프로세스
- (논리적) 부품 (UML)
- 행위 (UML)
- 프로그래밍 언어 구문
- 데이터베이스 스키마
- 재사용할 수 있는 소프트웨어 구성 요소[2]
UML 모델은 객체 관리 그룹이 지원하는 QVT와 같은 변환 언어 등을 이용해 다른 표현(예를 들면 자바)으로 자동적으로 변환된다. UML은 확장할 수 있으며 커스터마이제이션을 위한 메커니즘인 프로파일 (UML), 스테레오타입 (UML)을 제공한다. 프로파일을 이용한 확장의 의미는 UML 2.0에서 개선되었다.
역사
UML은 그래디 부치(Grady Booch), 제임스 럼버(James Rumbaugh), 이바 야콥슨(Ivar Jacobson)의 머리에서 태어났다. 최근 “쓰리 아미고(Three Amigos-3인방)”이라고 불리는 이 세 사람은 80년대 전반 부터 90년대 초반까지 객체지향 분석 설계 분야에서 각자의 영역에서 방법론을 연구해 왔었다. 그들이 발표한 방법론은 동일한 분야의 다른 경쟁자들보다 항상 탁월한 위치에 있었으며, 세 사람은 90년대 중반에 이르러 각자의 아이디어를 교환하기 시작하였고, 결국 각자의 방법을 하나로 모아 합치기에 이른다.1994년, 럼버는 부치가 세운 래셔널 소프트웨어(Rational Software Corporation)에 영입 되었고, 야콥슨은 그로부터 1년 후에 래셔널 사에 들어가게 된다.
나머지는 그들이 말하듯이, 역사(History)라고 말할 수 있다. UML의 초안(draft) 버전은 소프트웨어 업계를 뒤흔들기 시작했고, 그 결과로 돌아온 피드백은 바로 변경점에 반영되었다. “UML은 우리들의 전략에 딱 맞는다”라고 인식해 가는 회사가 늘어남에 따라 그 결과로 UML 컨소시엄도 발족하게 되었다. UML 컨소시엄의 멤버로는 디지털(DEC), 휴렛 팩커드(HP), 인텔리캅(Intellicorp), 마이크로소프트, 오라클, 텍사스 인스트루먼트(Texas Instruments), 래셔널 소프트웨어 등이 있었다. 1997년 UML 컨소시엄은 UML 버전 1.0을 만들어 내었고, 객체 관리 그룹(OMG:Object Management Group)이 표준 모델링 언어의 제안서를 내라는 요구에 맞추어 이것을 제출 하였다.
UML 컨소시엄은 계속 발전하였으며, OMG에 다시 상정된 UML 1.1d은 1997년 말에 표준 모델링 언어로 채택되었다. OMG는 UML의 관리 기법을 받아들여 1998년에 새로운 수정안을 발표하였다. UML은 소프트 웨어의 업계 명실 상부한 표준이 되었으며, 계속 수정 보완되고 있다. 버전 1.3과 1.4 그리고 1.5가 나와 있고, 이전 버전들, 즉 버전 1.X는 대부분의 모델 및 UML 모델링 책의 기본이 되었다.[3] 2005년 버전 2.0이 OMG에 의해 승인되었다.
UML 구성요소
소프트웨어 개발 방법론
소프트웨어 개발 방법론 문서를 참고하십시오.
UML 그 자체는 개발 방법이 아니지만[4] 그 당시 주도적이었던 객체 지향 소프트웨어 개발 방법론(예를 들면 Booch 방법론, 객체 모델링 기법, Objectory)과 잘 어울리도록 설계되었다. UML 발전해 감에 따라서 UML의 장점을 취하기 위해 몇몇 다른 방법론(예를 들면 객체 모델링 기법)이 개선되었다. 또 UML을 기반으로 한 새 방법론이 만들어지기도 했는데 IBM 래셔널 통합 프로세스(RUP)가 가장 유명하다. 이 외에도 추상 방법론(Abstraction Method), 동적 시스템 개발 방법론 등 더 특수한 해결책이나 다른 목적을 달성하기 위해 설계된 UML 기반의 방법론이 많이 있다.모델
모델은 이학 및 공학 분야에서 상당히 유용하게 쓰이는 개념으로서 가장 일반적인 의미로 말하면, "모델을 만든다"는 것은 잘 모르고 있는 것을 이해하는데 도움이 될 것으로 추측되는 어떤 것을 사용한다는 뜻이다. 어떤 분야에서는 이 모델의 일련의 수식(방정식)의 집합으로 정의되기도 하며, 다른 분야에서는 컴퓨터 시뮬레이션을 모델로 삼기도 한다.UML의 여러가지 그래픽 요소는 하나의 큰 그림, 즉 다이어그램을 그리는데 사용된다. UML은 언어이기 때문에, 이들 그래픽 요소들을 맞추는 데에는 규칙이 필요하다. 다이어그램의 목적은 시스템을 여러가지 시각에서 볼 수 있는 뷰(View)를 제공하는 것이며, 이러한 뷰의 집합을 모델(Model)이라고 한다. 시스템의 UML 모델은 건물을 짓는 건축가의 스케일 모델과도 비슷하다고 말할 수 있다. UML 모델은 시스템 자체의 “목적 행동”을 설명하는 언어이다. UML 모델은 시스템의 “구현 방법을 설명하는 수단”이 아니다.
클래스 다이어그램
대부분의 사물은 자기만의 속성과 일정한 행동 수단을 지니고 있다. 이러한 행동을 오퍼레이션(Operation)의 집합으로 생각할 수 있다. UML에서는 두단어 이상으로 이루어진 클래스 이름은 단어 사이의 공백을 없애고, 각 단어의 처음 문자를 모두 대문자로 한다(예:Wikipedia). 속성과 행동의 이름 또한 마찬가지이지만, 가장 앞 단어의 처음 문자는 소문자로 한다(예:edit()).
피드 구독하기:
글 (Atom)