강의 자료 출처(인프런 김영한 강사님)
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/
오늘 하루 배운 것을 정리하기 위한 용도의 글입니다. 잘못된 부분에 대한 댓글은 언제든 환영입니다 :)
Make MemberRepository(interface)
MemoryMemberRepository(Implementation)
MemberService(detailed business logic of the Repository class)
PostMapping & Key field inside POJO class
MemoryMemberRepositoryTest.java, MemberServiceTest.java
private void invalidateDuplicateMember(Member member) {
memberRepository.findByName(member.getName())
.ifPresent(member1 -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
});
}
4-1. Component Scan & AutoWired
Annotation @Controller, @Service, @Repository and @AutoWired for the constructor ensures that Spring Container contains them as components when the app starts.
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired // D.I of MemberService from the spring container.
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
@Repository // register this Repository in the spring container.
public class MemoryMemberRepository implements MemberRepository {
private static MemoryMemberRepository memoryMemberRepository;
public static MemoryMemberRepository getInstance() {
if (memoryMemberRepository == null) {
memoryMemberRepository = new MemoryMemberRepository();
}
return memoryMemberRepository;
}
@Service // register this service in the spring container.
public class MemberService {
private final MemoryMemberRepository memberRepository;
@Autowired // D.I of Repository from the spring container.
public MemberService(MemoryMemberRepository memberRepository) { // D.I
this.memberRepository = memberRepository;
}
4-2. register bean using config class
It works the same with <4-1>way. This is how you register all beans in one configuration file.
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService(){
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
@PostMapping("/members/new")
public String create(MemberForm form) {
Member member = new Member();
member.setName(form.getName());
memberService.join(member);
return "redirect:/";
}
public class MemberForm {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div class="container">
<form action="/members/new" method="post">
<div class="form-group">
<label for="name">이름</label>
<input type="text" id="name" name="name" placeholder="이름을 입력하세요"> <!--
name field as a key which is same with the property in MemberForm class.
-->
</div>
<button type="submit">등록</button>
</form>
</div> <!-- /container -->
</body>
</html>