SBSM


1. Spring VS Spring boot
  • スプリングとは?
    Spring makes it easy to create Java enterprise applications
    (spring document) : https://docs.spring.io/spring-framework/docs/current/reference/html/overview.html#overview
  • Springで簡単にJavaエンタープライズアプリケーションを作成できます.

  • How??
    👆 IOCとDIは再利用とメンテナンスが容易で、拡張性が高い
    󬯠開発者はビジネスロジックに専念し、生産性を向上させる

  • IOCとDI?
    📌IOC(Inversion of Control):コントロールの逆転
    名前の通り、メソッドまたはオブジェクトの呼び出しは、開発者ではなく外部によって決定されます.
    ✔つまり、開発者がフレームに必要な部品を開発・組み立てる際にフレームが最終的に呼び出されます.
    📌依存注入
    IOCが登場した場合、管理対象者間の関係.
    ✔依存オブジェクトを直接作成または制御するのではなく、特定のオブジェクトに必要なオブジェクトを外部から特定して関連付けます.

  • But...
    dependencyの場合、groupID、artifactId、versionを1つずつ停止する必要があります.
    また、thymeleafのようなテンプレートエンジンもbean設定など多くの設定が必要である.
    外部にTomcatなどをインストールしてサーバを浮動させるにも時間がかかります.
    👉 これは、基本プロジェクトの設定に多くの時間を費やしたことを意味します.
  • ではspringbootは?
    Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".
    (spring boot document) : https://spring.io/projects/spring-boot
    簡単で独立した商用のスプリングベースのアプリケーション.
    "just run"
  • so, Why use Spring boot
  • 👆 自動構成による設定の簡略化
    依存性の容易な管理&自動推奨バージョン管理
    🤟 組み込みサーバによるサーバ導入のシンプル化
    🖖 Spring Security、JPAなどの他のフレーム要素を簡単に使用
    2. Thymeleaf VS JSP
    JSPの場合は、Sebrit形式に変換されますが、Sebritもjavaコードなので、JSPにはjavaコードのブレンド(?)が含まれています.なりやすい
    👉 場合によっては、必要な情報をタグのプロパティ値として配置および削除できます.
    Webサーバを移動することなくページを生成・変更できるという利点があります.
    また、スプリングとの統合が容易であるという利点もある.
    3. MVC Pattern
  • What is this??まず,設計モードはMVCモードのソフトウェアオープンメソッドの公式化である.
    🔎 モデルもでる:データしょりぶ
    🔎 View:画面
    🔎 コントローラ:
  • 部分要求の処理
  • は、ユーザが必要とする機能をコントローラに要求する
  • を発行する.
  • コントローラは、モデルを使用して正しいビジネスロジック
  • を実行します.
  • コントローラは、ユーザに表示するビュー
  • を選択する.
  • コントローラは、お客様に最適な画面を提供します.
  • Why??👆 各コードの結合度を低減するために使用
    コードの再利用性の向上
    🤟
  • 開発者間の通信効率の向上
    4. JDBC VS SQLMapper(MyBatis)
    📌 JDBCはJava陣営のDB標準インタフェースである.
    Driver Managerでは、MySQLでもORCLEでも、使用するAPIを変更せずに実行できます.

  • How??
  • DriveManagerで接続インスタンスを取得します.
  • 接続でStatementを取得します.
  • StatementでResultSetを取得します.

  • But..
    👉 各SQL Queryは、複数のオブジェクトの重複コードを生成します.
    👉 終了するたびに切断などの接続管理を行います.
  • ではMyBatisは?
    MyBatis is a first class persistence framework with support for custom SQL
    (MyBtis documnet : https://mybatis.org/mybatis-3/ )
    📌 Javaのリレーショナル・データベースをより簡単に作成できるフレームワーク

  • How??
    設定したセッションファクトリで、SQLセッションでデータを交換します.

  • so, Why use MyBatis?
  • 👆 複雑なJDBCコードを排除します.
    SQLとJava XMLファイルを分離します.
    🤟 ResultSetなどのオブジェクトマッピング結果値はありません.
    5. Feedback
    🎯 MVCモードを使用すると、一部のコントローラでは、ビジネスロジックが処理されます.
    @PostMapping("/product/{productId}/edit")
        public String editProduct(@PathVariable int productId, @RequestParam String selected, @ModelAttribute("product") ProductSaveForm form,
                                  BindingResult bindingResult) throws IOException {
            if (bindingResult.hasErrors()) return "products/editProduct";
            //~~생략~~//
            // 변동된 이미지가 없었을 경우 -> 기존의 이미지를 가져옴
            if (imageFile == null){
                UploadFile image = productService.findImage(productId);
                updateProduct.setProductImage(image);
            }else {
                updateProduct.setProductImage(imageFile);
            }
            productService.updateProduct(updateProduct);
            return "redirect:/product/{productId}";
        }
    📃 修正した価格をサービスに渡す前に、画像を変更しないと、現在の画像を分離できません.
    🎯 重複論理をいくつか再設計したが、以下の不足がある->
    @GetMapping("/products/{category}")
        public String productsByCategory(@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember,
                Model model, @ModelAttribute("cri") Criteria cri, @PathVariable String category){
            //~~생략~~//
        }
    
        @GetMapping("/products/{category}/{page}")
        public String paging(@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember,
                Model model, @PathVariable String category, @PathVariable int page){
            Criteria cri = new Criteria();
            cri.setPageNum(page);
    
            //~~생략~~//
        }
    📃 商品リスト全体を表示する部分では、分類とページングを同時に行うことができますが、分離して使用することで、重複コードが生成されます
    🎯 タイムライン構文の理解が不足しています->
    <div th:each="num,index : ${#numbers.sequence(pageMake.getStartPage(),pageMake.getEndPage())}">
                            <button class="btn" style="border: 0; outline: 0;">
                                <span class="badge bg-white text-black ms-1 rounded-pill">
                                    <a th:href="@{/products/{category}/{page}(category=${products[0].category}, page=${index.current})}" th:text="${num}" style="text-decoration: none; color: black;">1</a>
                                </span>
                            </button>
                        </div>
    📃 ページング処理時にthymeleafでnumbers.開始ページ、終了ページ、インデックスを順番に入力します.現在の値を現在の値として使用できます.
    6. More Info
    https://github.com/SBWGL/SBSM