[Spring] 회원 관리 예제 - 1

이준영·2022년 9월 21일
0

스프링-입문

목록 보기
6/15

서비스 만들기

서비스를 만들 때 진행 순서는 다음과 같다

  1. 비즈니스 요구사항 정리
  2. 도메인과 리포지토리 만들기
  3. 리포지토리 테스트 케이스 작성
  4. 서비스 개발
  5. 서비스 테스트 (with.junit)

그럼 이제 회원 관리 서비스를 만들어보자!


회원 관리 예제

비즈니스 요구사항 정리

  • 데이터 : 회원 ID, 이름
  • 기능 : 회원등록, 조회
  • 아직 데이터 저장소가 선정되지 않음

회원 도메인과 리포지토리 만들기

도메인

  • Class
    도메인에서는 객체를 생성해야 한다.
    회원 관리이기 때문에 Member라는 클래스를 만들고
    private하게 변수(id,name) 선언 & private한 변수를 초기화 및 수정할 수 있도록 get/set 함수를 정의한다.
public class Member {

    private Long id;
    private String name;

    public Long getId() { return id; }

    public void setId(Long id) { this.id = id; }

    public String getName() { return name; }

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

리포지토리

  • Interface
    데이터 저장소가 선정되지 않았기 때문에 추후 원활한 작업을 위해 Interface를 만든다
    -> 회원 가입시 회원을 저장하기 위한 save(Member member)
    -> 아이디(ID)로 회원찾기를 위한 findById(Long id)
    -> 이름(Name)으로 회원찾기를 위한 findByName(String name)
    -> 전체 회원 리스트를 위한 findAll()
public interface MemberRepository {
    Member save(Member member);
    Optional<Member> findById(Long id);
    Optional<Member> findByName(String name);
    List<Member> findAll();
}
  • Class
    Interface를 상속받아 함수를 재정의한다.
    재정의 할때는 @Override 애노테이션이 필요하다.
    Interface를 implements 하면 자동으로 @Override와 재정의할 함수가 떴었던 것 같다.
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));  //null 이 나올 가능성이 있을 때 Optional로 감싸준다.
    }

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

    public void clearStore() {
        store.clear();
    }
}

Java 공부 해야겠다..

  • HashMap< >, Map< >, List< >, Optional< >
  • HashMap< >으로 선언 및 생성된 store의 method : put(), get(), values(), stream(), filter(), clear() 등
    *get은 Optional에서 데이터를 꺼낼 때 사용한다고 한 것 같은데..
  • Optional< >의 method : ofNullable() - null이 나올 가능성이 있을 때 Optional로 감싸준다
  • String 비교는 확인할데이터.equals(비교대상)
  • 람다표현식

회원 서비스 개발

서비스

  • Class
    비즈니스 로직을 작성한다.
    -> 회원가입 join(Member memeber)
    -> 회원 조회-개인(개인/전체) findById(memeberId), findMembers()
public class MemberService {

    private final MemberRepository memberRepository = new MemoryMemberRepository();

    /**
     * 회원가입
     */
    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);
    }

}




테스트 케이스 작성

테스트 케이스 작성은 대규모 개발에 있어서 매우매우 중요한 것 중 하나라고 한다.
수정한 코드가 있을 때마다 전체 프로젝트를 껐다 키는것을 반복하는 것은 매우 비효율적이기 때문이다!
테스트에 대해서는 다음 포스터에서 알아보도록 하자!

profile
화이팅!

0개의 댓글