main.java.hello.hellospring 아래에 domain 패키지 생성 후 Member 클래스를 생성한다.
```java
package hello.hellospring.domain;
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;
}
}
```
main.java.hello.hellospring 아래에 repository 패키지 생성 후 MemberRepository 인터페이스를 생성한다.
```java
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 은 null 값을 감싸는 방법 중 하나. id, email 이 null 값일 경우 대비
Optional<Member> findByName(String name);
List<Member> findAll(); // 지금까지 찾은 모든 list 반환
}
```
repository 패키지 아래 MemoryMemberRepository 클래스를 생성한다.
```java
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() // stream(): Java8 부터 지원, 컬렉션과 배열 등 저장된 요소들을 하나씩 참조하며 반복적인 처리 가능
.filter(member -> member.getName().equals(name)) // 람다 사용, member 에서 name 을 가져와서 입력된 name과 비교
.findAny(); // 하나라도 찾으면 return
}
@Override
public List<Member> findAll() {
return new ArrayList<>(store.values()); // member 는 Map 인데 반환값 List임. 걍 ㄱㄱ.
}
}
```