[Spring Core Basic] 2.スプリングコアの原理1-作成例について


💻プロジェクトの作成


プロジェクトの準備


スプリングプロジェクトを作成するには、スプリングイニシエータサイトに移動します。


https://start.spring.io/
  • Language : Java (JDK11)
  • Project : Gradle
  • Spring Boot : 2.x
  • Dependencies:
  • が選択されていません
  • Packaging : Jar
    注意:プロジェクト環境の設定を容易にするために、スプリングガイドが使用されています.現在はスプリングのない純Javaのみを開発し,スプリングを使用している.
  • 📃ビジネスニーズと設計

  • 会員
  • 会員の登録と照会ができます.
  • 会員には普通とVIPの2つの等級があります.
  • 会員データは、独自のDBを構築したり、外部システムと連動したりすることができます.(保留中)
  • オーダーおよび割引ポリシー
  • 会員は商品を注文することができます.
  • 会員等級によって割引政策が適用されます.
  • 割引ポリシーは、すべてのVIP割引1000元の固定割引(変更可能)
  • に適用されます.
  • 割引政策が変わる可能性が高い.会社の基本的な割引政策はまだ確定していないので、開業前に延期したいという悩み.最悪の場合、切歯は適用されない場合もあります.(保留中)
  • 👨‍👩‍👧‍👦メンバードメイン


    メンバードメイン設計

  • メンバードメインのコラボレーション

  • 会員等級図

  • メンバー・オブジェクトのグラフ

  • メンバードメインの開発


    メンバーエンティティ

  • 会員等級
  •       public enum Grade {
              BASIC,
              VIP
          }
  • 会員実体
  •     public class Member {
    
          private Long id;
          private String name;
          private Grade grade;
    
          public Member(Long id, String name, Grade grade) {
              this.id = id;
              this.name = name;
              this.grade = grade;
          }
    
          public Long getId() {
              return id;
          }
    
          public void setId(Long id) {
              this.id = id;
          }
    
          public String getName() {
              return name;
          }
    
          public void setName(String name) {
              this.name = name;
          }
    
          public Grade getGrade() {
              return grade;
          }
    
          public void setGrade(Grade grade) {
              this.grade = grade;
          }
      }

    会員庫

  • 会員記憶インタフェース
  •     public interface MemberRepository {
            void save(Member member);
    
            Member findById(Long memberId);
        }
  • メモリメンバストレージインプリメンテーション
  •     public class MemoryMemberRepository implements MemberRepository{
    
            private static Map<Long, Member> store = new HashMap<>();
    
            @Override
            public void save(Member member) {
                store.put(member.getId(), member);
            }
    
            @Override
            public Member findById(Long memberId) {
                return store.get(memberId);
            }
        }

    会員サービス

  • 会員サービスインタフェース
  •     public interface MemberService {
    
            void join(Member member);
    
            Member findMember(Long memberID);
        }
  • 会員サービス実施体
  • public class MemberServiceImpl implements MemberService{
    
        private final MemberRepository memberRepository = new MemoryMemberRepository();
    
        @Override
        public void join(Member member) {
            memberRepository.save(member);
        }
    
        @Override
        public Member findMember(Long memberID) {
            return memberRepository.findById(memberID);
        }
    }

    メンバードメインのテスト(JUnit)


    会員ドメイン-会員加入テスト

    import org.assertj.core.api.Assertions;
    import org.junit.jupiter.api.Test;
    
    public class MemberServiceTest {
    
        MemberService memberService = new MemberServiceImpl();
    
        @Test
        void join(){
            //given
            Member member = new Member(1L, "memberA", Grade.VIP);
    
            //when
            memberService.join(member);
            Member findMember = memberService.findMember(1L);
    
            //then
            Assertions.assertThat(member).isEqualTo(findMember);
        }
    
    }
    メンバードメイン設計における問題
  • 依存関係はインタフェースだけでなく実装にも依存する
  • DIP、DIPはサポートされていません;
  • 💲注文および割引ドメイン


    オーダーと割引ドメインの設計

  • 受注コラボレーション、ロール、責任関係


  • オーダークラス図

  • 受注オブジェクト図1

  • 注文対象図2

  • 注文サービスを変更することなく、在庫または割引ポリシーのインプリメンテーションを柔軟に変更できます.