[スパルタコードクラブ]Spring深化クラス1週目

53021 ワード

Spring深化クラス1週目


💡に期待


スプリングコア概念DIとスプリングIoC容器の概念を理解する
スプリングに必要なコントローラ、サービス、レポートについて

📝学識

  • スプリングフレーム
  • が必要である.

    春の学習戦略

  • 簡単なプロジェクトを作り、使い方を主とする経験を積む.(例えば、Web開発の春「Spring」コース)
  • プロジェクトで目的の機能を計画し、追加します.
  • 重点学習に必要な部分
  • .
  • は常に詰まっている部分がメイン!
  • どのように使うべきなことを知りません時!
  • Spring理解するまでテーマ別に繰り返し学習
  • あまり完璧に理解しないでください
  • ▼▼AllInOneコード


    サーブレットは、Javaを使用してWebページを動的に生成するサーバ側プログラムまたは仕様です.
    package com.sparta.springcore;
    
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.sql.*;
    import java.time.LocalDateTime;
    import java.util.ArrayList;
    
    @WebServlet(urlPatterns = "/api/products/*", loadOnStartup = 1)
    public class AllInOneServlet extends HttpServlet {
        // 신규 관심상품 등록
        // POST /api/products
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
            // 요청 Body 의 JSON -> 자바 객체
            ProductRequestDto requestDto = null;
            StringBuffer jb = new StringBuffer();
            String line = null;
            try {
                BufferedReader reader = request.getReader();
                while ((line = reader.readLine()) != null)
                    jb.append(line);
    
                ObjectMapper objectMapper = new ObjectMapper();
                requestDto = objectMapper.readValue(jb.toString(), ProductRequestDto.class);
            } catch (Exception e) { /*report an error*/ }
    
            // 요청받은 DTO 로 DB에 저장할 객체 만들기
            Product product = new Product(requestDto);
            LocalDateTime now = LocalDateTime.now();
            product.setCreatedAt(now);
            product.setModifiedAt(now);
    
            // DB 연결
            try {
                Connection connection = DriverManager.getConnection("jdbc:h2:mem:springcoredb", "sa", "");
                // DB Query 작성
                PreparedStatement ps = connection.prepareStatement("select max(id) as id from product");
                ResultSet rs = ps.executeQuery();
                if (rs.next()) {
                    // product id 설정 = product 테이블의 마지막 id + 1
                    product.setId(rs.getLong("id") + 1);
                } else {
                    throw new SQLException("product 테이블의 마지막 id 값을 찾아오지 못했습니다.");
                }
    
                ps = connection.prepareStatement("insert into product(id, title, image, link, lprice, myprice, created_at, modified_at) values(?, ?, ?, ?, ?, ?, ?, ?)");
                ps.setLong(1, product.getId());
                ps.setString(2, product.getTitle());
                ps.setString(3, product.getImage());
                ps.setString(4, product.getLink());
                ps.setInt(5, product.getLprice());
                ps.setInt(6, product.getMyprice());
                ps.setString(7, product.getCreatedAt().toString());
                ps.setString(8, product.getModifiedAt().toString());
                // DB Query 실행
                ps.executeUpdate();
                // DB 연결 해제
                ps.close();
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
    
            // 자바 객체 -> JSON 으로 변환
            ObjectMapper objectMapper = new ObjectMapper();
            String productJson = objectMapper.writeValueAsString(product);
    
            // 응답 보내기
            response.setContentType("application/json");
            response.setCharacterEncoding("UTF-8");
            PrintWriter out = response.getWriter();
            out.print(productJson);
            out.flush();
        }
    
        // 희망 최저가 변경
    		// PUT /api/products/{id}
        @Override
        protected void doPut(HttpServletRequest request, HttpServletResponse response) throws IOException {
            // 요청 URL 에 입력되어 있는 'id' 파라미터 조회
            String uri = request.getRequestURI();
            String idStr = uri.substring(uri.lastIndexOf("/") + 1);
    
            Long id = Long.parseLong(idStr);
    
            // 요청 BODY 의 JSON -> 자바 객체
            ProductMypriceRequestDto requestDto = null;
    
            StringBuffer jb = new StringBuffer();
            String line = null;
            try {
                BufferedReader reader = request.getReader();
                while ((line = reader.readLine()) != null)
                    jb.append(line);
    
                ObjectMapper objectMapper = new ObjectMapper();
                requestDto = objectMapper.readValue(jb.toString(), ProductMypriceRequestDto.class);
            } catch (Exception e) { /*report an error*/ }
    
            Product product = new Product();
    
            try {
                // DB 연결
                Connection connection = DriverManager.getConnection("jdbc:h2:mem:springcoredb", "sa", "");
    
                // DB Query 작성
                PreparedStatement ps = connection.prepareStatement("select * from product where id = ?");
                ps.setLong(1, id);
                // DB Query 실행
                ResultSet rs = ps.executeQuery();
                if (rs.next()) {
                    product.setId(rs.getLong("id"));
                    product.setCreatedAt(rs.getTimestamp("created_at").toLocalDateTime());
                    product.setModifiedAt(rs.getTimestamp("modified_at").toLocalDateTime());
                    product.setImage(rs.getString("image"));
                    product.setLink(rs.getString("link"));
                    product.setLprice(rs.getInt("lprice"));
                    product.setMyprice(rs.getInt("myprice"));
                    product.setTitle(rs.getString("title"));
                } else {
                    throw new NullPointerException("해당 아이디가 존재하지 않습니다.");
                }
    
                // DB Query 작성
                ps = connection.prepareStatement("update product set myprice = ?, modified_at = ? where id = ?");
                ps.setInt(1, requestDto.getMyprice());
                ps.setString(2, LocalDateTime.now().toString());
                ps.setLong(3, product.getId());
                // DB Query 실행
                ps.executeUpdate();
                // DB 연결 해제
                rs.close();
                ps.close();
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
    
            // 자바 객체 -> JSON 으로 변환
            ObjectMapper objectMapper = new ObjectMapper();
            String productIdJson = objectMapper.writeValueAsString(product.getId());
    
            // 응답 보내기 (업데이트된 상품 id)
            response.setContentType("application/json");
            response.setCharacterEncoding("UTF-8");
            PrintWriter out = response.getWriter();
            out.print(productIdJson);
            out.flush();
        }
    
    		// 등록된 전체 상품 목록 조회
    		// GET /api/products
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
            ArrayList<Product> products = new ArrayList<>();
    
            try {
                // DB 연결
                Connection connection = DriverManager.getConnection("jdbc:h2:mem:springcoredb", "sa", "");
                // DB Query 작성 및 실행
                Statement stmt = connection.createStatement();
                ResultSet rs = stmt.executeQuery("select * from product");
                // DB Query 결과를 상품 객체 리스트로 변환
                while (rs.next()) {
                    Product product = new Product();
                    product.setId(rs.getLong("id"));
                    product.setCreatedAt(rs.getTimestamp("created_at").toLocalDateTime());
                    product.setModifiedAt(rs.getTimestamp("modified_at").toLocalDateTime());
                    product.setImage(rs.getString("image"));
                    product.setLink(rs.getString("link"));
                    product.setLprice(rs.getInt("lprice"));
                    product.setMyprice(rs.getInt("myprice"));
                    product.setTitle(rs.getString("title"));
                    products.add(product);
                }
                // DB 연결 해제
                rs.close();
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
    
            // 자바 객체 -> JSON 으로 변환
            ObjectMapper objectMapper = new ObjectMapper();
            String productsJson = objectMapper.writeValueAsString(products);
    
            // 응답 보내기
            response.setHeader("Content-Type", "application/json");
            response.setCharacterEncoding("UTF-8");
            PrintWriter out = response.getWriter();
            out.print(productsJson);
            out.flush();
        }
    }

    に質問


    コードが複雑になり、重複コードが増えます.
    毒性が低下する.交換するのに時間がかかります.

    ▼▼コードの役割分離


    コントローラの役割



    スプリングサーバ開発者にとって,@Controllerは始点と終点のように見えるが,実際にはスプリングがユーザの要求と応答を処理している.

    サービスの役割


  • ビジネスロジックの処理
  • ビジネスロジック:サーバがお客様のニーズを処理する
  • DB情報が必要な場合、報告を専門に担当する
  • Repositoryの役割


  • DB管理(接続、切断、リソース管理)
  • DB CRUDタスク処理
  • ロールの分離


    オブジェクト向けにプログラミングします.
  • の最初のプログラミング方式は「プログラム化プログラミング」である.前章AllInOneControllerクラスの各APIがコンテンツを処理しているように,やるべきことを一つ一つ羅列した符号化方式である.
  • しかし、多くの人は一度にいろいろな考えを考えて、とても脆弱です.そこで、物事(オブジェクト)に意味を与えるようにプログラミングを始めました.
  • 例えば、何かを切る必要がある場合は「▼▼」を思い出し、紙に書く必要がある場合は「▼▼」を思い出し、「一度に1つの役しか演じない」ように、1つのオブジェクトを作成してプログラミングします!
  • の別の例(注釈)
  • を思い出して、書くのが便利です(プログラム的なプログラミング)
  • の注釈量が増加するにつれて、テーマごとに整理することで検索が容易になる(オブジェクト向けプログラミング)
  • .

    スプリングIoC容器の使用


    スプリングは、DIによりオブジェクトの代わりに生成される.スプリングによって生成されるオブジェクトを空と呼びます.イヴァンを集めた場所はIoCコンテナ.IoCコンテナで登録できる空です.基本的には単輪形式です.
  • 空席(bean):スプリングによって作成されたオブジェクト
  • スプリングIoC容器:中空バケツ
  • ▼▼スプリングフレーム


    Springフレームワークとは?
    The Spring Framework provides a comprehensive programming and configuration model for modern Java-based enterprise applications - on any kind of deployment platform.
    *ソース:Spring公式ホームページ
  • エンタープライズアプリケーションの開発が容易
  • エンタープライズアプリケーション?
  • お客様向けWebサービス
  • Naver、Kupang、Instagramなど
  • の応用範囲は急速に拡大している.
  • IT企業→全企業(病院、保険会社等)
  • 外部顧客→内部顧客(内部承認システム、内部出退勤記録システム)
  • 企業→自営業者
  • Springは、最終的にエンタープライズ・アプリケーションのニーズを満たす
  • フレームワークに重点を置きます.
  • エンタープライズアプリケーションの機能
  • 信頼性が重要
    もし
  • 病院が手術時に患者記録を変えたら?
  • サーバの信頼性を維持することが重要です
  • 宝くじのリアルタイム抽選サーバーは閉じますか?
  • データ管理が重要
  • 大量のデータを管理する必要がある
  • 複数のユーザが同時に接続する場合のデータ整合性
  • →多数のデータベースで
  • を使用
    A key element of Spring is infrastructural support at the application level: Spring focuses on the "plumbing"of enterprise applications so that teams can focus on application-level business logic, without unnecessary ties to specific deployment environments.
    *ソース:Spring公式ホームページ

    ビジネスロジックに集中させますか?

  • Webサービス図
  • サーバ開発者が注意すべき点が多すぎます
    1.API:クライアント
    2.業務ロジック:サーバー上のユーザーニーズを処理する
    3.DB:サーバ
  • リクエスト!
  • を繰り返し、エラーの多い部分→スプリング代替~!
  • スプリングの開発が容易
  • 企業ニーズのみに注目
  • Springフレームワークにより,開発者はビジネスロジックに注目するだけでよい.