회원 서비스

Haechan Kim·2022년 7월 6일
0

Spring

목록 보기
6/68

회원 서비스(Service)는 회원 레파지토리와 도메인 활용해서 실제 비지니스 로직 작성하는 과정

MemberService.java

public class MemberService { // ctrl+shift+t 테스트 자동 생성
    private final MemberRepository memberRepository = new MemoryMemberRepository(); // final은 수정 불가

    /**
     * 회원 가입
     */
    public Long join(Member member) {
        // 같은 이름의 중복 회원 x
        // ctrl+alt+v 로 리턴 변수 자동 생성
//        Optional<Member> result = memberRepository.findByName(member.getName());
//        result.ifPresent(m -> { // result에 값이 있으면 (null 아니고). ifPresent는 Optional 메서드. null일 가능성 있다면 Optional 쓰자
//            throw new IllegalStateException("이미 존재하는 회원입니다.");
//        });

//        memberRepository.findByName(member.getName()) // ctrl+alt+l 코드 정렬
//                .ifPresent(m -> { // result에 값이 있으면 (null 아니고). ifPresent는 Optional 메서드. null일 가능성 있다면 Optional 쓰자
//                    throw new IllegalStateException("이미 존재하는 회원입니다.");
//                });

        validateDuplicateMember(member); // 중복 회원 검증

        memberRepository.save(member);
        return member.getId();
    }

    private void validateDuplicateMember(Member member) { // ctrl+alt+m 으로 extract method. 메서드 생성해줌
        memberRepository.findByName(member.getName()) // ctrl+alt+l 코드 정렬
                .ifPresent(m -> { // result에 값이 있으면 (null 아니고). ifPresent는 Optional 메서드. null일 가능성 있다면 Optional 쓰자
                    throw new IllegalStateException("이미 존재하는 회원입니다.");
                });
    }

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

    public Optional<Member> findOne(Long memberId) {
        return memberRepository.findById(memberId);
    }
}
  • 회원 서비스 테스트
class MemberServiceTest {

    MemberService memberService;
    // 테스트 멤버 레파지토리는 서비스에서 쓰는 레파지토리와 다른 객체. (new로 새로 만듬)
    // MemoryMemberRepository memberRepository = new MemoryMemberRepository(); // service만으론 클리어 못하므로 리파지토리 가져옴
    MemoryMemberRepository memberRepository;

    @BeforeEach
    public void beforeEach() { // 테스트 실행 전에 레파지토리 만들고 서비스에 넣음. -> 같은 레파지토리 사용: 외부에서 넣어줌. DI
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }

    // 없으면 회원가입, 중복회원조회에 둘 다 "spring" 주면 오류
    @AfterEach
    public void afterEach() {
        memberRepository.clearStore();
    }

    @Test
    void 회원가입() { // 테스트는 한글로 써도 됨
        // given 뭔가 주어졌고
        Member member = new Member();
        member.setName("spring");

        // when 이것을 실행 했을 때
        Long saveId = memberService.join(member);

        // then 결과
        Member findMember = memberService.findOne(saveId).get();
        assertThat(member.getName()).isEqualTo(findMember.getName()); // alt+enter static import
    }

    @Test
    public void 중복_회원_예외() {
        // 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("이미 존재하는 회원입니다.");

//        try {
//            memberService.join(member2);
//            fail("예외가 발생해야 합니다.");
//        } catch (IllegalStateException e) {
//            assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
//        }

        // then
    }

    @Test
    void findMembers() {
    }

    @Test
    void findOne() {
    }
}

0개의 댓글