공부/[인프런] 스프링 입문

[인프런] 스프링 입문 | 섹션 3. 회원 관리 예제 - 백엔드 개발

티시즌 2023. 6. 29. 01:14

[02. 회원 도메인과 리포지토리 만들기]

MemberRepository 인터페이스를 상속받은 클래스이다.
간단한 테스트를 위해 ID는 자동 증가하는 숫자로 설정한다.

package hello.hellospring.repository;

import hello.hellospring.domain.Member;

import java.util.*;

public class MemoryMemberRepository implements MemberRepository {
    private static Map<Long, Member> store = new HashMap<>();
    private static long sequence = 0L;

    @Override
    public Member save(Member member) {
        member.setId(++sequence);
        store.put(member.getId(), member);
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        return Optional.ofNullable(store.get(id));
    }

    @Override
    public Optional<Member> findByName(String name) {
        return store.values().stream()
                .filter(member -> member.getName().equals(name))
                .findAny();
    }

    @Override
    public List<Member> findAll() {
        return new ArrayList<>(store.values());
    }

}

Stream은 array를 순회하면서 filter에 맞는 값을 찾는 메소드이다.
Java 8부터 편의성을 위해 추가되었다.


[03. 회원 리포지토리 테스트 케이스 작성]

테스트란 코드를 코드로 검증하는 것이다.
테스트를 만들고 구현 클래스를 만들어서 실행시켜 보는 (틀을 만들어 놓고 코드가 해당 틀에 잘 들어맞는지 확인하는) 방식을 테스트 주도 개발 (TDD, test driven development)이라고 한다.
그렇지만 여기서는 TDD가 아니고 그냥 테스트 케이스를 만들어서 돌려 본 것이다. 구현 클래스를 만든 다음에 테스트를 돌려 본 것이기 때문이다.

테스트 코드를 직접 짜도 되지만, 이렇게 메뉴를 이용해 테스트를 돌려 볼 수도 있다.


[04. 회원 서비스 개발]

Ctrl + Alt + Shift + T 단축키를 눌러 Refactor 메뉴를 열 수 있다.
생성한 extracted method는 우측의 설정 버튼을 눌러 이름을 변경할 수 있다.

package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;

import java.util.List;
import java.util.Optional;

public class MemberService {
    private final MemberRepository memberRepository = new MemoryMemberRepository();

    /*회원가입*/
    public Long join(Member member) {
        validateDuplicateMember(member); // 중복 이름 X (이 코드 설계에서 id는 자동 증가하는 숫자이기 때문에 unique하다.)
        memberRepository.save(member);
        return member.getId();
    }

    private void validateDuplicateMember(Member member) {
        memberRepository.findByName(member.getName()).ifPresent(m -> {
            try {
                throw new IllegalAccessException("중복 이름");
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            }
        });
    }

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

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

}

[05. 회원 서비스 테스트]

Ctrl + Shift + T를 눌러 나온 메뉴에서 Create New Test를 선택할 수 있다.