改善(構文ベース&DBをセッションストレージとして使用)


このプレゼンテーションは、Spring BootとAWSが独自にWebサービスマニュアルに基づいて作成したものです.

1.音声ベース


同じコードを繰り返す部分->構文ベースに変更
  • ex)IndexControllerのセッション値をメソッドパラメータを使用して直接セッション値を取得する部分
  • に変更する.

    1.1@LoginUser宣言作成

    @Target(ElementType.PARAMETER) ⓐ
    @Retention(RetentionPolicy.RUNTIME) ⓑ
    public @interface LoginUser { ⓒ
    }
  • ⓐ @Target(ElementType.PARAMETER)
  • 対応するヘルパー
  • を作成する場所を指定します.
  • PARAMETERが指定されており、メソッドパラメータとして宣言されたオブジェクトのみ使用可能です.
  • ElementType.PACKAGE:包装声明
  • ElementType.TYPE:タイプ宣言
  • ElementType.ANNOTATION TYPE:声明声明声明声明声明は
  • ElementType.CONTRUCTOR:宣言作成者
  • ElementType.FIELD:
  • メンバー変数宣言
  • ElementType.LOCAL VARIABLE:
  • 地域変数宣言
  • ElementType.METHOD:メソッド宣言
  • ElementType.PARAMETER:
  • 転送ファクタ宣言
  • ElementType.TYPE PARAmTER:転送係数タイプ宣言
  • ElementType.TYPE USE:タイプ宣言
  • ⓑ @Retention(RetentionPolicy.RUNTIME)
  • Annotationの実際の応用とメンテナンス範囲は
  • である.
  • RetentionPolicy.RUNTIME
  • のコンパイル後も、JVMは
  • を参照し続けることができます.
  • は主にコピーまたは記録
  • に用いられる.
  • RetentionPolicy.CLASS
  • コンパイラがクラスを参照する場合有効
  • RetentionPolicy.SOURCE
  • をコンパイルする前にのみ有効な
  • 、すなわちコンパイル後に消失する
  • ⓒ @interface
  • ファイルを
  • として指定(作成)

    1.2 LoginUserArgumentResolver

    @RequiredArgsConstructor
    @Component
    public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver {
    
        private final HttpSession httpSession;
    
        @Override
        public boolean supportsParameter(MethodParameter parameter) { ⓐ
            boolean isLoginUserAnnotation = parameter.getParameterAnnotation(LoginUser.class) != null;
            boolean isUserClass = SessionUser.class.equals(parameter.getParameterType());
    
            return isLoginUserAnnotation && isUserClass;
        }
    
        @Override
        public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { ⓑ
            return httpSession.getAttribute("user");
        }
    }
  • ⓐ supportsParameter()
  • コントローラメソッドの特定のパラメータ
  • がサポートされているかどうかを決定する.
  • の上記の方法では、パラメータに@LoginUser宣言があり、パラメータクラスタイプはSessionUserである.クラスはtrueを返します(
  • )
  • ⓑ resolveArgument()
  • パラメータに渡すオブジェクト
  • を作成します.
  • 以上のソースがセッションからオブジェクト
  • にインポートする.

    1.3 Index Controller強化機能

    @RequiredArgsConstructor
    @Controller
    public class IndexController {
    
        private final PostsService postsService;
    
        @GetMapping("/")
        public String index(Model model, @LoginUser SessionUser user) { ⓐ
            model.addAttribute("posts", postsService.findAllDesc());
    
            if (user != null) {
                model.addAttribute("userName", user.getName());
            }
            return "index";
        }
    }
  • ⓐ @LoginUser SessionUser user
  • 既存SessionUser=(SessionUser)httpSession.getAttribute("user");セッション情報の読み込み値が向上する
  • セッション情報
  • は、対応するカスタム名を使用して取得することができる.

    2.セッション・リポジトリとしてデータベースを使用する


    2.1セッション?

  • クライアントとWebサーバとの間のネットワーク接続は継続する、
  • .
  • 、すなわち、ユーザがブラウザを開くサーバに接続し、接続を閉じる時点
  • である.
  • HTTPプロトコルは非接続プロトコルであり、各接続には新しいネットワーク接続があり、セッションは接続を維持することができ、
  • .
  • 情報はサーバ側に格納されており、Cookieよりもセキュリティ面で優れている

    2.2マルチサーバ環境でのセッションの管理方法


    (参照:https://hyuntaeknote.tistory.com/6)
  • Sticky Session (Load Balancer)
  • セッションクラスタ(TOMCATセッション)
  • Session Storage
  • ディスク・ライブラリ(MySQL、Oracle、MS-SQLなどのリレーショナル・データベース)
  • メモリデータベース(Redis、Memcachedなど)
  • 2.2.1 Sticky Session

  • 固定セッション
  • Load Balanceは基本的にループ方式で流量
  • を分配する.
  • は、
  • によってトラフィックを処理し、ユーザが接続を試みたときに初期接続のサーバに接続を継続する.
  • の利点
  • ユーザは、セッション中に同じサーバ
  • のみを使用する.
  • コンシステンシ問題から解放された
  • の欠点
  • ユーザが接続する必要があるサーバのため、トラフィックが特定のサーバに集中するリスクは
  • である.
  • ユーザは、自分のセッションを持たない他のサーバ
  • を使用できない.
  • 可用性低下

  • 2.2.2セッションクラスタ(セッションクラスタ)

  • は、複数のコンピュータを1つのシステムのように動作させる.
  • WASは、2つ以上のインストール時に同じセッションとして管理されます.これは、
  • を意味します.
  • の利点
  • セッションをコピーしてセッションにデータをコピーすることで、コンシステンシの問題
  • を解決する.
    1台の
  • サーバに障害が発生しても、サービスは
  • を実行できます.
  • の欠点
  • すべてのサーバは同じセッションオブジェクトを持つ必要があります.そのため、大量のメモリ
  • が必要です.
  • セッションリポジトリにデータを格納するたびに、
  • の値をすべてのサーバに入力する必要があります.
  • サーバの数に比例して、ネットワークトラフィックの増加などのパフォーマンスの低下
  • 2.2.3セッションストレージ

  • サーバをいくら増やしても、各サーバにセッション格納に関する情報を入力すれば、セッション
  • を共有することができる.
  • 流量異常凝集現象を考慮する必要はない
  • .
  • サーバは、障害が発生した場合でも、
  • のサービスを継続できます.
  • 複数のサーバが1つのセッションを使用することによってデータが不一致になる(コンシステンシの問題を解決する)
  • .
  • パフォーマンスの問題を解決するために、個別のセッションコピーを必要としない
  • But;セッション・ストレージ・サーバの障害を回避するために、同じセッション・リポジトリでコピーすることを推奨
  • Disk Based Database
  • ディスクストレージおよび使用
  • MySQL、Oracle、MS-SQLなどのリレーショナル・データベース
  • セッション・リポジトリを使用する最も簡単な方法
  • あまり設定する必要はありません
  • の処理速度が遅いため、データベースI/Oによるパフォーマンスの問題が発生する可能性がある
  • .
  • は、ディスク・ベースのデータベースのI/O速度が比較的遅い頻繁な読み取り/書き込みセッション・リポジトリです.
  • は、通常、あまりログイン要求を必要としないバックグラウンドオフィスであり、内部システム
  • によく使用される.
  • In-Memory Database
  • メモリにおける
  • の格納と使用
  • Redis、Memcached等
  • セッションに格納データは、永続的に格納データではなく、
  • である.
  • メモリ・データベースは、電源オフ時にデータが失われますが、セッション・ストレージに格納されるデータは比較的少ないため、メモリ・データベースの使用に適しています.(一部のデータベースではレプリケーションがサポートされているため、可用性を確保できます.)
  • データは、メモリ内で読み取り/書き込み可能であるため、セッションストレージに理想的です.

  • 2.3データベースをセッション・リポジトリに設定する

  • gradleへの依存性の追加
  • implementation 'org.springframework.session:spring-session-jdbc'
  • application.属性に追加
  • spring.session.store-type=jdbc