【初心者向け 095】SpringBoot入門3 DI(依存性の注入)/WEB MVC
はじめに
Infleanから勉強した内容を紹介するため、画像の場合はスクラップしました。リンクはこちらです。
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";
}
}
会員登録ページ
@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