Today I learned

전승원·2020년 12월 12일
0

강의 자료 출처(인프런 김영한 강사님)
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/

오늘 하루 배운 것을 정리하기 위한 용도의 글입니다. 잘못된 부분에 대한 댓글은 언제든 환영입니다 :)

1. Work flow

  • Make MemberRepository(interface)

  • MemoryMemberRepository(Implementation)

  • MemberService(detailed business logic of the Repository class)

  • PostMapping & Key field inside POJO class

2. Make Test case

MemoryMemberRepositoryTest.java, MemberServiceTest.java

ClassName + Test.java

3. make detailed business logic inside MemberService.java

private void invalidateDuplicateMember(Member member) {
        memberRepository.findByName(member.getName())
                .ifPresent(member1 -> {
                    throw new IllegalStateException("이미 존재하는 회원입니다.");
                });
    }

4. How to register spring bean

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();
    }
}

5. PostMapping

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

        memberService.join(member);

        return "redirect:/";
    }
  • receives parameter 'MemberForm' type.
public class MemberForm {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


}
  • name property is automatically set when post method is executed. Because it matches name field in HTML.
<!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> 
  • make sure name field of input tag matches the one inside MemberForm POJO class.
profile
No pleasure, No gain

0개의 댓글