AR삽질러

SpringBoot - 회원관리기초(2) 본문

JAVA/SpringBoot

SpringBoot - 회원관리기초(2)

아랑팡팡 2023. 3. 20. 20:46
728x90

https://arang95.tistory.com/80

 

SpringBoot-회원관리기초(1)

데이터 : 회원ID, 이름 기능 : 회원 등록, 조회 컨트롤러(Controller) : 클라이언트의 요청을 처리하고 응답을 반환하는 역할. 웹MVC의 컨트롤러 @Controller, @RestController, @RequestMapping 등 서비스(Service) :

arang95.tistory.com

 

회원서비스

import java.util.Optional;

public class MemberService {
    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository){
        this.memberRepository = memberRepository;
    }

    // 회원가입
    public Long join(Member member) {
        // 같은 이름이 있는 중복회원은 존재할 수 없다.
        validateDuplicateMember(member); // 중복회원 검증
        memberRepository.save(member);
        return member.getId();
    }

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

    // 전체회원조회
    public List<Member> findMembers() {
        return memberRepository.findAll();
    }

    public Optional<Member> findOne(Long memberId){
        return memberRepository.findById(memberId);
    }

}

회원서비스 테스트

package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.repository.MemoryMemberRepositoryTest;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*;
class MemberServiceTest {

    MemberService memberService;
    MemoryMemberRepository memberRepository;

    @BeforeEach
    public void beforeEach(){
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }
    @AfterEach
    public void afterEach(){
        memberRepository.clearStore();
    }

    // 회원가입 테스트
    @Test
    void join() {
        // 문법 given, when, then
        // given : Member 객체를 생성하고 이름을 "hello"로 정의한다.
        Member member = new Member();
        member.setName("hello");

        //when
        // MemberService클래스의 join메서드를 호출하고 반환된 값을 savaId 변수에 저장한다.
        Long savaId = memberService.join(member);

        //then
        // 저장된 ID값을 사용하여 memberService의 findOne메서드를 호출하여 Member객체를 검색하고
        // 검색된 Member객체의 이름과 기존 Member객체의 이름이 같은지를 비교한다.
        Member findMember = memberService.findOne(savaId).get();
        Assertions.assertThat(member.getName()).isEqualTo(findMember.getName());
    }

    @Test
    public void duplicatedException() throws Exception {
        //Given
        Member member1 = new Member();
        member1.setName("spring");
        Member member2 = new Member();
        member2.setName("spring");
        //When
        memberService.join(member1);
        IllegalStateException e = assertThrows(IllegalStateException.class,
                () -> memberService.join(member2));//예외가 발생해야 한다.
        assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
    }

    @Test
    void findMembers() {
    }

    @Test
    void findOne() {
    }
}

Given-When-Then패턴

- 테스트 케이스를 작성하는 방법중 하나로, 테스트케이스를 쉽게 이해하고 작성할 수 있도록 3단계로 나누어 작성한다.

Given : 테스트를 수행하기 위해 필요한 조건을 설정한다.

When : 실제로 테스트할 작업을 수행한다.

Then : 테스트 결과를 수행한다.

 

스프링빈과 의존관계

  1. 컴포넌트 스캔

   - 스프링빈에서 빈을 자동으로 등록하는 방법으로 컴포넌트스캔을 사용하면 자동으로 @Component 어노테이션이 붙은 클래스를 스캔하여 빈으로 등록된다.

 

  2. 자바 코드로 직접 스프링 빈등록

   - 빈을 등록하는 코드를 직접 작성하는 방법으로 장점은 빈을 등록하는 방법을 명확하게 할 수 있고 개발자가 직접 빈을 생성하여 관리할 수 있다. 단점으로는 빈을 등록하는 코드를 직접 작성해야하기 때문에 번거롭고 빈을 생성 및 관리를 스프링이 해줄 수 없기 때문에 개발자가 직접 빈의 생성주기 및 관리를 해야한다.

 

 

회원관리 - MVC

1) 메인화면

Controller

package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

    @GetMapping("/")
    public String home(){
        return "home";
    }
}
package hello.hellospring.controller;

import hello.hellospring.domain.Member;
import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import java.util.List;

@Controller
public class MemberController {
    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }

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

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

        System.out.println("memberName = " + member.getName());

        memberService.join(member);
        return "redirect:/";
    }

    // 회원조회
    @GetMapping("/members")
    public String list(Model model){
        List<Member> members = memberService.findMembers();
        model.addAttribute("members", members);
        return "members/memberList";
    }
}

view

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>indexPage</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>

    <header>
        <h1>Hello Spring IndexPage</h1>
    </header>
    <hr>
    <nav>
        <ol>
        <h3>회원기능</h3>
        <li><a href="/members/new">회원가입</a></li>
        <li><a href="/members">회원목록</a></li>
        </ol>
    </nav>
    <article>
        <br><br><h3>회원관리기초</h3>
         <p>- MVC를 이용한 예제</p>
        <hr>
    </article>

</body>
</html>

 

2) 회원등록

package hello.hellospring.controller;

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">
<head>
    <title>memberInsertPage</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <header>
        <h1>Hello Spring IndexPage</h1>
    </header>
    <hr>
    <nav>
        <ol>
            <h3>회원기능</h3>
            <li><a href="/members/new">회원가입</a></li>
            <li><a href="/members">회원목록</a></li>
        </ol>
    </nav>
    <div class="container">
        <form action="/members/new" method="post">
        <div class="form-group">
        <br><br><h3>회원가입</h3>
        <p>회원가입 정보입력란</p>
        <hr>
                <label for="name">이름</label>
                <input type="text" id="name" name="name" placeholder="이름을 입력하세요!">
            </div><br><br>
            <button type="submit">등록</button>
            <button type="reset">취소</button>

        </form>
</div>
</body>
</html>

 

3) 회원조회

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>memberInsertPage</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<header>
    <h1>Hello Spring IndexPage</h1>
</header>
<hr>
<nav>
    <ol>
        <h3>회원기능</h3>
        <li><a href="/members/new">회원가입</a></li>
        <li><a href="/members">회원목록</a></li>
    </ol>
</nav>
<div class="container">

    <div class="container">
        <br><br><h3>회원 목록</h3>
        <p>회원목록정보</p>
        <hr>
        <table>
            <thead>
            <tr>
                <th>------  등록된 회원  -------</th>
            </tr>
            </thead>
            <tbody><!--model안의 값을 루프를 돌면서 꺼내어 보여준다. -->
            <tr th:each="member : ${members}">
                <td th:text="${member.id}"></td>
                <td th:text="${member.name}"></td>
            </tr>
            </tbody>
        </table>
    </div><br><br>

</div>
</body>
</html>

 

 

 

--------------------------------------------------------------------------------------------

 

https://github.com/designAR/SpringBoot-base

 

GitHub - designAR/SpringBoot-base: myFirst-SpringBoot-MemberService

myFirst-SpringBoot-MemberService. Contribute to designAR/SpringBoot-base development by creating an account on GitHub.

github.com

 

728x90
반응형
LIST