🔖

【初心者向け 095】SpringBoot入門3 DI(依存性の注入)/WEB MVC

2023/10/01に公開

はじめに

Infleanから勉強した内容を紹介するため、画像の場合はスクラップしました。リンクはこちらです。
https://www.inflearn.com/course/스프링-입문-스프링부트/dashboard

Dependany Injection(依存性の注入)

Component Scan

@Controllerを付ける場合、Spring ContainerからControllerのオブジェクトを生成し管理します。このような仕組みをSpring beanを管理するとも呼ばれます。

Controller内のオブジェクトは二つ以上になる必要がない。そのため、new演算しよりは@Autowiredというアノテーションを付け、コンストラクタから部品オブジェクトを生成します。

それから、Service、Repositoryにも@Service、@Repositoryを付けるとSpringが周ります。

@Service
public class MemberService {

    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
@Repository
public class MemoryMemberRepository implements MemberRepository{

    private static Map<Long,Member> store = new HashMap<>();
    private static long sequence = 0L;

つまり、コンストラクタを利用して、Spring(外部)から必要なオブジェクトを生成することです。

この場合、Springは基本的に同じJava beanの各クラスのオブジェクトをシングルトーンに生成します。

このようにSpringのアノテーションを通して依存関係を作ることをComponent Scanだと呼びます。

直接注入

二つ目の方法として、コードで直接、DIを行う方法があります。

@Configuration
public class SpringConfig {

    @Bean
    public MemberService memberService(){
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository(){
        return  new MemoryMemberRepository();
    }
}

昔はXMLを通して、設定したが、今は@Configurationをクラスに付け、Spring Beanに登録するクラスに@Beanというアノテーションを付けることで終わりです。

実務では、component scanを利用する場合が多いですが、直接注入の長所は、何かの変更がある際にはConfigurationのみコードを修正することで解決ができます。

WEB MVC

Home機能追加

以下のように、HomeControllerを作成、templateエンジンにhome.htmlというHPを作成します。

@Controller
public class HomeController {

    @GetMapping("/")
    public String home(){
        return "home";
    }
}

https://zenn.dev/eldorado215/articles/d42519d4d9ede7

会員登録ページ

 @GetMapping("/members/new")
    public String createForm(){
        return "members/createMemberForm";
    }

★Formオブジェクト★

JSP、ServletでMVCモデルを作った場合は、事前にDTOにすべてのPropertyを設定したのですが、
Springの場合、Formのデーターのみ転送するForm専用のオブジェクト(DTO?だとは思いますが、今まで勉強したパータンとは違いますので、断言はできません!)を作ることが今までの方式とは異なりました。

 <form action="/members/new" method="post">
 <div class="form-group">
 <label for="name">이름</label>
 <input type="text" id="name" name="name" placeholder="이름을
입력하세요">
 </div>
	 <button type="submit">등록</button>
package hello.hellospring.controller;
public class MemberForm {
 private String name;
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
}

@PostMapping

ServletのdoPostメソッドのように、コントローラーないでアノテーションでマッピングします。
Tokenを利用せず、簡単にredirectすることもできます。とても便利です。

   @PostMapping("/members/new")
    public String create(MemberForm form){
        Member member = new Member();
        member.setName(form.getName());
        memberService.join(member);

        return "redirect:/";
    }
}


会員照会ページ

以前、作成したMemberServiceオブジェクトのメソッドを活用し、会員紹介ができるように、Controllerから設定します。

@GetMapping("/members")
    public String list(Model model){
        List<Member> members = memberService.findMembers();
        model.addAttribute("members",members);
        return "members/memberList";
    }
}
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div class="container">
    <div>
        <table>
            <thead>
            <tr>
                <th>#</th>
                <th>이름</th>
            </tr>
            </thead>
            <tbody>
            <tr th:each="member : ${members}">
                <td th:text="${member.id}"></td>
                <td th:text="${member.name}"></td>
            </tr>
            </tbody>
        </table>
    </div>
</div> <!-- /container -->
</body>
</html>

Discussion