[Study-NextStep] 2021-12-11


時間:2021-12-11
範囲:7章Java WebプログラミングNext Step練習(p 225-p 243)

Realize


ServletContextListener


サーブレットContextListenerの初期化は、サーブレットの初期化よりも先に行われます.
サーバ初期化がサーバに関連する初期化を担当する場合、サーブレットContextListener初期化は、Webアプリケーション全体の初期化に影響を与える必要がある場合に使用できます.
(p 228コンテンツ)

Share


@WebListener


@WebListenerはservlet-apiライブラリで、クラスに使用できます. @WebListenerを付けて、TomcatサーバにListenerクラスであることを伝えます.
web.xmlのリスナーと同じ役割を果たし、web.xmlに登録する必要がなく自動的に実行できます.
(出典:https://hoonys91.tistory.com/358)

Listener Class


単語の意味から見ると、リスナーは聞く人、聴衆です.
プログラミングでは、リスナーとは、音が聞こえる人ではなく、特定のイベント(特定のイベント)が発生するのを待つときに実行されるコンポーネント(メソッドまたは関数)を指します.
リスナーは、イベントが発生したときに特定の動作(メソッドまたは関数)を実行し、イベントハンドルと呼ばれます.したがって、イベントハンドラとも呼ばれる.
ここで「イベント」という言葉があります.イベントとは、マウスクリック、キーボード入力、キークリック、テキスト入力など、発生した特定のイベントやイベントを指します.
本で使用するListenerは、サーブレットContextListenerであり、その内容は以下の通りである.

(出典:https://dololak.tistory.com/616)

例外処理


例外として、Checked ExceptionとUnchecked Exceptionがあります.

例外を扱う方法は3つある.

Try-catch(異常復旧)


アプリケーションが正常に動作している場合、例外が発生しても

Throws(異常処理回避)


呼び出しの側に例外を投げ出して回避する.
ただし、呼び出し元が異常の再受信を確信して処理したり、その方法でこの異常を投げ出したりするのが最善の方法である場合にのみ使用される.
すべての例外APIがtry-catchで処理されている場合、APIを使用するアプリケーションでは、どのような問題が発生しているのか分かりません.このため、APIでは、Throwsを多く使用して呼び出したアプリケーションに異常を渡すことで、強制的に異常処理を実行し、アプリケーションが異常を正しく処理できるようにする.
例外を一つの場所に集中しながら例外処理を行う場合にも使用できます.

Throw(異常切替)


これは、例外を捉え、別の例外を投げ出す方法であり、呼び出し元が例外を受信して処理するときにそれをより明確に認識することを支援することを目的とする.
(出典:https://www.nextree.co.kr/p3239)

静的/動的クエリー


クエリ文は次の順序で実行されます.
①アプリケーションはSQL文フレームワークを作成し、DBMSに送信します.特定の値が指定されていません
INSERT INTO products (name, age) VALUES (?, ?);
②DBMSでSQL文をコンパイルするフレームワーク(最適化と変換)は、実行せずに結果のみを保存します.
③アプリケーションがSQLテンプレートの変数に値(バインド)を指定した場合、DBMSはSQL文を実行します(結果を返す可能性があります).

Statement(静的クエリ)


静的クエリは、実行するたびに3つのフェーズを経ます.
したがって、キャッシュが無意味なダイナミッククエリである場合に使用されます.

事前準備された状態(ダイナミッククエリ)


ダイナミッククエリは、最初の実行時に3つのステップを経て、キャッシュに読み込まれて再使用されます.
したがって、SQL文を繰り返し使用する場合に使用します.
この動的/静的クエリの最大の違いは、キャッシュを使用するかどうかです.
(出典:https://webstone.tistory.com/56)

リビルドタイプ


Extract Method


コードをグループ化できると思う場合は、これらのコードを削除して有効な方法として使用できます. 抽出 改造する
(注意:IntelliJのショートカットキーはCommed+Option+M)
受精前
public void printOwing(double previousAmount) {
  System.out.println("****************");
  System.out.println("*****고객 외상****");
  System.out.println("****************"); 
  
  double outstanding = previousAmount * 1.2; 
  
  for (Order o : orders) { 
  	outstanding += o.getAmount(); 
  } 
  
  System.out.println("name: " + name); 
  System.out.println("amount: " + amount); 
}
変更後
public void printOwing(double previousAmount) { 
	printBanner(); 
	double outstanding = getOutstanding(previousAmount * 1.2); 
	printDetails(amout); 
} 

private void printBanner() { 
	System.out.println("****************"); 
	System.out.println("*****고객 외상****"); 
	System.out.println("****************"); 
} 

private double getOutstanding(double initialValue) {
	double result = initialValue; 
	for (Order o : orders) { 
		result += o.getAmount(); 
	} 
	return result; 
} 

private void printDetails(double amount) { 
	System.out.println("name: " + name); 
	System.out.println("amount: " + amount); 
}

Inline Method


メソッド機能は簡単で、あまりにも明らかであれば、メソッドの内容を呼び出した場所に直接配置し、メソッドの内容を直接挿入して削除します.
受精前
public int getRating() { 
	return (moreThanFiveLateDeliveries()) ? 2 : 1; 
} 

public boolean moreThanFiveLateDeliveries() { 
	return numberOfLateDeliveries > 5; 
}
変更後
public int getRating() { 
	return (numberOfLateDeliveries > 5) ? 2 : 1; 
}

Inline Temp


一時変数が単純な式に置き換えられ、別のコールバックが適用されにくい場合は、一時変数の内容を直接挿入して、一時変数を参照する部分を式に変換します.
受精前
double basePrice = anOrder.basePrice(); 
return (basePrice > 1000);
変更後
return (anOrder.basePrice() > 1000);
次のブログにはもっとコメントがあるので、時間があるときに読んでみましょう!
(出典:https://lelecoder.com/117)

Default Method


インタフェース内でメソッドを宣言するときにdefaultを指定すると、インタフェース内で論理を含むメソッドを宣言できます.
既存のインタフェースを使用してインプリメンテーションされたクラスを作成および使用します.インタフェースを改善する過程で、さらにインプリメンテーションする必要があるか、または必要な方法がある場合は、インプリメンテーションされたクラスとの互換性が低下します.この場合、defaultメソッドを追加すると、サブ互換性を維持し、インタフェースの補完を行うことができます.
(出典:https://siyoon210.tistory.com/95https://boxfoxs.tistory.com/359)

アクセス制御者


アクセス制御者にはprivate、default、protected、publicがあります.
private→default→protected→public順でより多くのアクセスを許可します.
アクセス制御者アクセス範囲privateこのクラスdefaultこのパッケージが保護されている同じパッケージのクラスまたはそのクラスの外部パッケージを継承するクラスpublicのすべてのクラス
(出典:https://wikidocs.net/232)

匿名クラス


プログラム内でオブジェクトを一度に作成するためにのみ使用されるクラスを定義する必要はありません.この場合は匿名クラスを使用します.

Find More


サーブレット概念


(注:https://hochoon-dev.tistory.com/entry/JAVA-Servlet%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%9D%B4%EB%9E%80)

ポリシーモードとテンプレートコールバックモード