개발일기

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

Spring/Spring tutorial - 코드로 배우는 스프링 (김영한)

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

한둥둥 2022. 9. 17. 21:16

domain과 Member클래스를 만들어주었다. 

package com.example.BasicSpring.domain;

public class Member {
    private Long id;
    private String name;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getId(){
        return id;
    }
    public void setId(Long id){
        this.id = id;
    }
}

id는 고객이 정해주는 아이디가 아닌 임의의 값 시스템이 랜덤으로 정해주는 임의의 값이다. 데이터를 구분하기 위해서 만들어준 것이 id . 사용자의 이름은 name이다. 

interface만들어줌 MemberRepository (interface를 만들어 주었다.) <- Respository(패키지)도 만들어줌.

package hello.hellospring.repository;

import hello.hellospring.domain.Member;

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

public interface MemberRepository {
    Member save(Member member);
    Optional<Member> findById(Long id);
    Optional<Member> findByName(String name);
    List<Member> findAll();
}

 

MemberRespository는 save기능을 만들  것이다. 회원을 저장하면 저장된 회원이 반환 된다.

회원을 찾을 수 있는 find method들도 만들어 주었다. Optional은 간단하게 설명하면 findByID, findByName을 하면 Null을 반환하는 경우가 있을 수 있다. 그래서 요즘에는 NULL을 날 것으로 반환하기 보다는 Optional로 감싸서 반환하는 방법을 추구한다.

 

findAll은 지금까지 저장된 모든 회원들을 리스트의 형태로 가져온다. 

MemoryMemberRepository를 repository에 만들어 준 모습이다. 이를 통해 implement로 MemberRepository인터페이스를 상속하여 사용한다. 

또한 인터페이스를 추가하기 위해서 optional + enter를 사용하면 implement에 해당하는 메서드 추가할 수 있음. 

메모리에 값을 저장해주기 위해 Map 사용해줄 것이다. 

 

private static Map<Long , Member> store = new HashMap<>();
private static long sequence = 0L;

Sequence는 0, 1, 2 키 값을 생성해주는 애 (실무에서는 그냥 long을 해주는 것보다는 동시성 문제를 고려해서 작성해야함)

 

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

이렇게 되면 store에 넣어주기 전에 member.setId를 설정해준 후, store.put(member.getId(),member) <- 이 부분을 통해서 member의 getId를 가져와 준다. member의 name은 고객이 회원가입하면서 member 담겨준 채로 보낼 것이다. 

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

과거에는 그냥 Store.get(id)를 해주었지만 요즘에는 Optional.ofNullable이라고 하면 Null을 Optional로 감싸서 반환해줄 수 있음. 

이렇게 보내면 클라이언트에서 무언갈 해줄 수 있다. 

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

find Any()는 하나라도 찾는 것이다. filter는 findByName으로 받은 이름과 같은 이름을 store에서 찾아서 받아 와주는 것이다. 

 

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

이렇게 작성하면 끝이다. 이제 검증을 해야한다. 이제 동작하는 것에 있어서. 검증을 할 때 기가 막히고 코가 막히는 방법이 바로 테스트 케이스를 작성을 하는 것이다.